1 ; This testcase ensures that CFL AA handles escaped values no more conservative than it should
3 ; RUN: opt < %s -disable-basicaa -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
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
10 define 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*
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*
26 define 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
34 declare 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
41 define 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
49 declare 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
53 define 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
62 ; CHECK-LABEL: Function: test_external_call_callsite_readonly
63 ; CHECK: MayAlias: i32* %c, i32* %x
64 ; CHECK: NoAlias: i32* %c, i32** %a
65 define 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
74 declare 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
78 define 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)
85 declare 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
89 define 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)