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-steens-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
4; RUN: opt < %s -aa-pipeline=cfl-steens-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