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