xref: /aosp_15_r20/external/llvm/test/Analysis/BasicAA/phi-and-select.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; BasicAA should detect NoAliases in PHIs and Selects.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; CHECK: Function: foo
6*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: double* %a, double* %b
7*9880d681SAndroid Build Coastguard Worker; CHECK: Function: bar
8*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: double* %a, double* %b
9*9880d681SAndroid Build Coastguard Worker; CHECK: Function: qux
10*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: double* %a, double* %b
11*9880d681SAndroid Build Coastguard Worker; CHECK: Function: fin
12*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: double* %a, double* %b
13*9880d681SAndroid Build Coastguard Worker; CHECK: ===== Alias Analysis Evaluator Report =====
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; Two PHIs in the same block.
16*9880d681SAndroid Build Coastguard Workerdefine void @foo(i1 %m, double* noalias %x, double* noalias %y) {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  br i1 %m, label %true, label %false
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workertrue:
21*9880d681SAndroid Build Coastguard Worker  br label %exit
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerfalse:
24*9880d681SAndroid Build Coastguard Worker  br label %exit
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerexit:
27*9880d681SAndroid Build Coastguard Worker  %a = phi double* [ %x, %true ], [ %y, %false ]
28*9880d681SAndroid Build Coastguard Worker  %b = phi double* [ %x, %false ], [ %y, %true ]
29*9880d681SAndroid Build Coastguard Worker  store volatile double 0.0, double* %a
30*9880d681SAndroid Build Coastguard Worker  store volatile double 1.0, double* %b
31*9880d681SAndroid Build Coastguard Worker  ret void
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; Two selects with the same condition.
35*9880d681SAndroid Build Coastguard Workerdefine void @bar(i1 %m, double* noalias %x, double* noalias %y) {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker  %a = select i1 %m, double* %x, double* %y
38*9880d681SAndroid Build Coastguard Worker  %b = select i1 %m, double* %y, double* %x
39*9880d681SAndroid Build Coastguard Worker  store volatile double 0.000000e+00, double* %a
40*9880d681SAndroid Build Coastguard Worker  store volatile double 1.000000e+00, double* %b
41*9880d681SAndroid Build Coastguard Worker  ret void
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; Two PHIs with disjoint sets of inputs.
45*9880d681SAndroid Build Coastguard Workerdefine void @qux(i1 %m, double* noalias %x, double* noalias %y,
46*9880d681SAndroid Build Coastguard Worker                 i1 %n, double* noalias %v, double* noalias %w) {
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker  br i1 %m, label %true, label %false
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workertrue:
51*9880d681SAndroid Build Coastguard Worker  br label %exit
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerfalse:
54*9880d681SAndroid Build Coastguard Worker  br label %exit
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerexit:
57*9880d681SAndroid Build Coastguard Worker  %a = phi double* [ %x, %true ], [ %y, %false ]
58*9880d681SAndroid Build Coastguard Worker  br i1 %n, label %ntrue, label %nfalse
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerntrue:
61*9880d681SAndroid Build Coastguard Worker  br label %nexit
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workernfalse:
64*9880d681SAndroid Build Coastguard Worker  br label %nexit
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workernexit:
67*9880d681SAndroid Build Coastguard Worker  %b = phi double* [ %v, %ntrue ], [ %w, %nfalse ]
68*9880d681SAndroid Build Coastguard Worker  store volatile double 0.0, double* %a
69*9880d681SAndroid Build Coastguard Worker  store volatile double 1.0, double* %b
70*9880d681SAndroid Build Coastguard Worker  ret void
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; Two selects with disjoint sets of arms.
74*9880d681SAndroid Build Coastguard Workerdefine void @fin(i1 %m, double* noalias %x, double* noalias %y,
75*9880d681SAndroid Build Coastguard Worker                 i1 %n, double* noalias %v, double* noalias %w) {
76*9880d681SAndroid Build Coastguard Workerentry:
77*9880d681SAndroid Build Coastguard Worker  %a = select i1 %m, double* %x, double* %y
78*9880d681SAndroid Build Coastguard Worker  %b = select i1 %n, double* %v, double* %w
79*9880d681SAndroid Build Coastguard Worker  store volatile double 0.000000e+00, double* %a
80*9880d681SAndroid Build Coastguard Worker  store volatile double 1.000000e+00, double* %b
81*9880d681SAndroid Build Coastguard Worker  ret void
82*9880d681SAndroid Build Coastguard Worker}
83