1; This testcase ensures that CFL AA handles escaped values no more conservative than it should 2 3; RUN: opt < %s -disable-basic-aa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s 4; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s 5 6; CHECK-LABEL: Function: test_local 7; CHECK: NoAlias: i32* %a, i32* %b 8; CHECK: MayAlias: i32* %a, i32* %aAlias 9; CHECK: NoAlias: i32* %aAlias, i32* %b 10define void @test_local() { 11 %a = alloca i32, align 4 12 %b = alloca i32, align 4 13 %aint = ptrtoint i32* %a to i64 14 %aAlias = inttoptr i64 %aint to i32* 15 ret void 16} 17 18; CHECK-LABEL: Function: test_global_param 19; CHECK: NoAlias: i32* %a, i32** %x 20; CHECK: MayAlias: i32* %a, i32* %xload 21; CHECK: MayAlias: i32* %a, i32* %gload 22; CHECK: MayAlias: i32* %gload, i32* %xload 23; CHECK: MayAlias: i32** %x, i32** @ext_global 24; CHECK: NoAlias: i32* %a, i32** @ext_global 25@ext_global = external global i32* 26define void @test_global_param(i32** %x) { 27 %a = alloca i32, align 4 28 %aint = ptrtoint i32* %a to i64 29 %xload = load i32*, i32** %x 30 %gload = load i32*, i32** @ext_global 31 ret void 32} 33 34declare void @external_func(i32**) 35; CHECK-LABEL: Function: test_external_call 36; CHECK: NoAlias: i32* %b, i32* %x 37; CHECK: NoAlias: i32* %b, i32** %a 38; CHECK: MayAlias: i32* %c, i32* %x 39; CHECK: MayAlias: i32* %c, i32** %a 40; CHECK: NoAlias: i32* %b, i32* %c 41define void @test_external_call(i32* %x) { 42 %a = alloca i32*, align 8 43 %b = alloca i32, align 4 44 call void @external_func(i32** %a) 45 %c = load i32*, i32** %a 46 ret void 47} 48 49declare void @external_func_readonly(i32**) readonly 50; CHECK-LABEL: Function: test_external_call_func_readonly 51; CHECK: MayAlias: i32* %c, i32* %x 52; CHECK: NoAlias: i32* %c, i32** %a 53define void @test_external_call_func_readonly(i32* %x) { 54 %a = alloca i32*, align 8 55 %b = alloca i32, align 4 56 store i32* %x, i32** %a, align 4 57 call void @external_func_readonly(i32** %a) 58 %c = load i32*, i32** %a 59 ret void 60} 61 62; CHECK-LABEL: Function: test_external_call_callsite_readonly 63; CHECK: MayAlias: i32* %c, i32* %x 64; CHECK: NoAlias: i32* %c, i32** %a 65define void @test_external_call_callsite_readonly(i32* %x) { 66 %a = alloca i32*, align 8 67 %b = alloca i32, align 4 68 store i32* %x, i32** %a, align 4 69 call void @external_func(i32** %a) readonly 70 %c = load i32*, i32** %a 71 ret void 72} 73 74declare i32* @external_func_normal_return(i32*) 75; CHECK-LABEL: Function: test_external_call_normal_return 76; CHECK: MayAlias: i32* %c, i32* %x 77; CHECK: MayAlias: i32* %a, i32* %c 78define void @test_external_call_normal_return(i32* %x) { 79 %a = alloca i32, align 8 80 %b = alloca i32, align 4 81 %c = call i32* @external_func_normal_return(i32* %a) 82 ret void 83} 84 85declare noalias i32* @external_func_noalias_return(i32*) 86; CHECK-LABEL: Function: test_external_call_noalias_return 87; CHECK: NoAlias: i32* %c, i32* %x 88; CHECK: NoAlias: i32* %a, i32* %c 89define void @test_external_call_noalias_return(i32* %x) { 90 %a = alloca i32, align 8 91 %b = alloca i32, align 4 92 %c = call i32* @external_func_noalias_return(i32* %a) 93 ret void 94} 95