gn build: Merge r374476
[llvm-complete.git] / test / Analysis / BasicAA / phi-and-select.ll
blobb8fee00ed0d0426fc2f9e35c1c08774f29b46a5e
1 ; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
3 ; BasicAA should detect NoAliases in PHIs and Selects.
5 ; CHECK: Function: foo
6 ; CHECK:  NoAlias: double* %a, double* %b
7 ; CHECK: Function: bar
8 ; CHECK:  NoAlias: double* %a, double* %b
9 ; CHECK: Function: qux
10 ; CHECK:  NoAlias: double* %a, double* %b
11 ; CHECK: Function: fin
12 ; CHECK:  NoAlias: double* %a, double* %b
13 ; CHECK: ===== Alias Analysis Evaluator Report =====
15 ; Two PHIs in the same block.
16 define void @foo(i1 %m, double* noalias %x, double* noalias %y) {
17 entry:
18   br i1 %m, label %true, label %false
20 true:
21   br label %exit
23 false:
24   br label %exit
26 exit:
27   %a = phi double* [ %x, %true ], [ %y, %false ]
28   %b = phi double* [ %x, %false ], [ %y, %true ]
29   store volatile double 0.0, double* %a
30   store volatile double 1.0, double* %b
31   ret void
34 ; Two selects with the same condition.
35 define void @bar(i1 %m, double* noalias %x, double* noalias %y) {
36 entry:
37   %a = select i1 %m, double* %x, double* %y
38   %b = select i1 %m, double* %y, double* %x
39   store volatile double 0.000000e+00, double* %a
40   store volatile double 1.000000e+00, double* %b
41   ret void
44 ; Two PHIs with disjoint sets of inputs.
45 define void @qux(i1 %m, double* noalias %x, double* noalias %y,
46                  i1 %n, double* noalias %v, double* noalias %w) {
47 entry:
48   br i1 %m, label %true, label %false
50 true:
51   br label %exit
53 false:
54   br label %exit
56 exit:
57   %a = phi double* [ %x, %true ], [ %y, %false ]
58   br i1 %n, label %ntrue, label %nfalse
60 ntrue:
61   br label %nexit
63 nfalse:
64   br label %nexit
66 nexit:
67   %b = phi double* [ %v, %ntrue ], [ %w, %nfalse ]
68   store volatile double 0.0, double* %a
69   store volatile double 1.0, double* %b
70   ret void
73 ; Two selects with disjoint sets of arms.
74 define void @fin(i1 %m, double* noalias %x, double* noalias %y,
75                  i1 %n, double* noalias %v, double* noalias %w) {
76 entry:
77   %a = select i1 %m, double* %x, double* %y
78   %b = select i1 %n, double* %v, double* %w
79   store volatile double 0.000000e+00, double* %a
80   store volatile double 1.000000e+00, double* %b
81   ret void