xref: /llvm-project/llvm/test/Analysis/BasicAA/phi-and-select.ll (revision 05ff7606c9d47135ecf5b69e25b1327634f6fa27)
1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2
3; BasicAA should detect NoAliases in PHIs and Selects.
4
5; Two PHIs in the same block.
6; CHECK-LABEL: Function: foo
7; CHECK: NoAlias: double* %a, double* %b
8define void @foo(i1 %m, ptr noalias %x, ptr noalias %y) {
9entry:
10  br i1 %m, label %true, label %false
11
12true:
13  br label %exit
14
15false:
16  br label %exit
17
18exit:
19  %a = phi ptr [ %x, %true ], [ %y, %false ]
20  %b = phi ptr [ %x, %false ], [ %y, %true ]
21  store volatile double 0.0, ptr %a
22  store volatile double 1.0, ptr %b
23  ret void
24}
25
26; Two selects with the same condition.
27; CHECK-LABEL: Function: bar
28; CHECK: NoAlias: double* %a, double* %b
29define void @bar(i1 %m, ptr noalias %x, ptr noalias %y) {
30entry:
31  %a = select i1 %m, ptr %x, ptr %y
32  %b = select i1 %m, ptr %y, ptr %x
33  store volatile double 0.000000e+00, ptr %a
34  store volatile double 1.000000e+00, ptr %b
35  ret void
36}
37
38; Two PHIs with disjoint sets of inputs.
39; CHECK-LABEL: Function: qux
40; CHECK: NoAlias: double* %a, double* %b
41define void @qux(i1 %m, ptr noalias %x, ptr noalias %y,
42                 i1 %n, ptr noalias %v, ptr noalias %w) {
43entry:
44  br i1 %m, label %true, label %false
45
46true:
47  br label %exit
48
49false:
50  br label %exit
51
52exit:
53  %a = phi ptr [ %x, %true ], [ %y, %false ]
54  br i1 %n, label %ntrue, label %nfalse
55
56ntrue:
57  br label %nexit
58
59nfalse:
60  br label %nexit
61
62nexit:
63  %b = phi ptr [ %v, %ntrue ], [ %w, %nfalse ]
64  store volatile double 0.0, ptr %a
65  store volatile double 1.0, ptr %b
66  ret void
67}
68
69; Two selects with disjoint sets of arms.
70; CHECK-LABEL: Function: fin
71; CHECK: NoAlias: double* %a, double* %b
72define void @fin(i1 %m, ptr noalias %x, ptr noalias %y,
73                 i1 %n, ptr noalias %v, ptr noalias %w) {
74entry:
75  %a = select i1 %m, ptr %x, ptr %y
76  %b = select i1 %n, ptr %v, ptr %w
77  store volatile double 0.000000e+00, ptr %a
78  store volatile double 1.000000e+00, ptr %b
79  ret void
80}
81
82; On the first iteration, sel1 = a1, sel2 = a2, phi = a3
83; On the second iteration, sel1 = a2, sel1 = a1, phi = a2
84; As such, sel1 and phi may alias.
85; CHECK-LABEL: Function: select_backedge
86; CHECK: NoAlias:	i32* %sel1, i32* %sel2
87; CHECK: MayAlias:	i32* %phi, i32* %sel1
88; CHECK: MayAlias:	i32* %phi, i32* %sel2
89define void @select_backedge() {
90entry:
91  %a1 = alloca i32
92  %a2 = alloca i32
93  %a3 = alloca i32
94  br label %loop
95
96loop:
97  %phi = phi ptr [ %a3, %entry ], [ %sel2, %loop ]
98  %c = phi i1 [ true, %entry ], [ false, %loop ]
99  %sel1 = select i1 %c, ptr %a1, ptr %a2
100  %sel2 = select i1 %c, ptr %a2, ptr %a1
101  load i32, ptr %sel1
102  load i32, ptr %sel2
103  load i32, ptr %phi
104  br label %loop
105}
106