[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / Transforms / GVN / phi.ll
blob6c2439968fec8f4df6f1a63aa19cc03fc7f27ca8
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -gvn < %s | FileCheck %s
5 define i64 @test1(i1 %c, i64 %a, i64 %b) {
6 ; CHECK-LABEL: @test1(
7 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
8 ; CHECK:       taken:
9 ; CHECK-NEXT:    br label [[MERGE:%.*]]
10 ; CHECK:       untaken:
11 ; CHECK-NEXT:    br label [[MERGE]]
12 ; CHECK:       merge:
13 ; CHECK-NEXT:    [[PHI1:%.*]] = phi i64 [ [[A:%.*]], [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]
14 ; CHECK-NEXT:    ret i64 0
16   br i1 %c, label %taken, label %untaken
17 taken:
18   br label %merge
19 untaken:
20   br label %merge
21 merge:
22   %phi1 = phi i64 [%a, %taken], [%b, %untaken]
23   %phi2 = phi i64 [%a, %taken], [%b, %untaken]
24   %ret = sub i64 %phi1, %phi2
25   ret i64 %ret
28 declare void @llvm.assume(i1)
30 define i64 @test2(i1 %c, i64 %a, i64 %b) {
31 ; CHECK-LABEL: @test2(
32 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
33 ; CHECK:       taken:
34 ; CHECK-NEXT:    [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 0
35 ; CHECK-NEXT:    call void @llvm.assume(i1 [[ASSUMPTION]])
36 ; CHECK-NEXT:    br label [[MERGE:%.*]]
37 ; CHECK:       untaken:
38 ; CHECK-NEXT:    br label [[MERGE]]
39 ; CHECK:       merge:
40 ; CHECK-NEXT:    [[PHI1:%.*]] = phi i64 [ 0, [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]
41 ; CHECK-NEXT:    ret i64 0
43   br i1 %c, label %taken, label %untaken
44 taken:
45   %assumption = icmp eq i64 %a, 0
46   call void @llvm.assume(i1 %assumption)
47   br label %merge
48 untaken:
49   br label %merge
50 merge:
51   %phi1 = phi i64 [%a, %taken], [%b, %untaken]
52   %phi2 = phi i64 [0, %taken], [%b, %untaken]
53   %ret = sub i64 %phi1, %phi2
54   ret i64 %ret
58 define i64 @test3(i1 %c, i64 %a, i64 %b) {
59 ; CHECK-LABEL: @test3(
60 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
61 ; CHECK:       taken:
62 ; CHECK-NEXT:    [[ADD1:%.*]] = add i64 [[A:%.*]], 5
63 ; CHECK-NEXT:    br label [[MERGE:%.*]]
64 ; CHECK:       untaken:
65 ; CHECK-NEXT:    br label [[MERGE]]
66 ; CHECK:       merge:
67 ; CHECK-NEXT:    [[PHI1:%.*]] = phi i64 [ [[ADD1]], [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]
68 ; CHECK-NEXT:    ret i64 0
70   br i1 %c, label %taken, label %untaken
71 taken:
72   %add1 = add i64 %a, 5
73   %add2 = add i64 %a, 5
74   br label %merge
75 untaken:
76   br label %merge
77 merge:
78   %phi1 = phi i64 [%add1, %taken], [%b, %untaken]
79   %phi2 = phi i64 [%add2, %taken], [%b, %untaken]
80   %ret = sub i64 %phi1, %phi2
81   ret i64 %ret
84 define i64 @test4(i1 %c, i64 %a, i64 %b) {
85 ; CHECK-LABEL: @test4(
86 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
87 ; CHECK:       taken:
88 ; CHECK-NEXT:    br label [[MERGE:%.*]]
89 ; CHECK:       untaken:
90 ; CHECK-NEXT:    br label [[MERGE]]
91 ; CHECK:       merge:
92 ; CHECK-NEXT:    [[PHI1:%.*]] = phi i64 [ [[A:%.*]], [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]
93 ; CHECK-NEXT:    br i1 [[C]], label [[TAKEN2:%.*]], label [[UNTAKEN2:%.*]]
94 ; CHECK:       taken2:
95 ; CHECK-NEXT:    [[ADD1:%.*]] = add i64 [[PHI1]], 5
96 ; CHECK-NEXT:    br label [[MERGE2:%.*]]
97 ; CHECK:       untaken2:
98 ; CHECK-NEXT:    br label [[MERGE2]]
99 ; CHECK:       merge2:
100 ; CHECK-NEXT:    [[PHI3:%.*]] = phi i64 [ [[ADD1]], [[TAKEN2]] ], [ [[PHI1]], [[UNTAKEN2]] ]
101 ; CHECK-NEXT:    ret i64 0
103   br i1 %c, label %taken, label %untaken
104 taken:
105   br label %merge
106 untaken:
107   br label %merge
108 merge:
109   %phi1 = phi i64 [%a, %taken], [%b, %untaken]
110   %phi2 = phi i64 [%a, %taken], [%b, %untaken]
111   br i1 %c, label %taken2, label %untaken2
112 taken2:
113   %add1 = add i64 %phi1, 5
114   %add2 = add i64 %phi2, 5
115   br label %merge2
116 untaken2:
117   br label %merge2
118 merge2:
119   %phi3 = phi i64 [%add1, %taken2], [%phi2, %untaken2]
120   %phi4 = phi i64 [%add2, %taken2], [%phi2, %untaken2]
121   %ret = sub i64 %phi4, %phi3
122   ret i64 %ret
125 define i64 @test5(i1 %c, i64 %a) {
126 ; CHECK-LABEL: @test5(
127 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
128 ; CHECK:       taken:
129 ; CHECK-NEXT:    [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 0
130 ; CHECK-NEXT:    call void @llvm.assume(i1 [[ASSUMPTION]])
131 ; CHECK-NEXT:    br label [[MERGE:%.*]]
132 ; CHECK:       untaken:
133 ; CHECK-NEXT:    br label [[MERGE]]
134 ; CHECK:       merge:
135 ; CHECK-NEXT:    ret i64 0
137   br i1 %c, label %taken, label %untaken
138 taken:
139   %assumption = icmp eq i64 %a, 0
140   call void @llvm.assume(i1 %assumption)
141   br label %merge
142 untaken:
143   br label %merge
144 merge:
145   %phi = phi i64 [%a, %taken], [0, %untaken]
146   ret i64 %phi
149 define i64 @test6(i1 %c, i64 %a) {
150 ; CHECK-LABEL: @test6(
151 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
152 ; CHECK:       taken:
153 ; CHECK-NEXT:    [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 0
154 ; CHECK-NEXT:    call void @llvm.assume(i1 [[ASSUMPTION]])
155 ; CHECK-NEXT:    br label [[MERGE:%.*]]
156 ; CHECK:       untaken:
157 ; CHECK-NEXT:    br label [[MERGE]]
158 ; CHECK:       merge:
159 ; CHECK-NEXT:    ret i64 0
161   br i1 %c, label %taken, label %untaken
162 taken:
163   %assumption = icmp eq i64 %a, 0
164   call void @llvm.assume(i1 %assumption)
165   br label %next
166 next:
167   br label %merge
168 untaken:
169   br label %merge
170 merge:
171   %phi = phi i64 [%a, %next], [0, %untaken]
172   ret i64 %phi
175 ; negative test, phi use is NOT dominated by assume
176 define i64 @test7(i1 %c, i64 %a) {
177 ; CHECK-LABEL: @test7(
178 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
179 ; CHECK:       taken:
180 ; CHECK-NEXT:    [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 0
181 ; CHECK-NEXT:    call void @llvm.assume(i1 [[ASSUMPTION]])
182 ; CHECK-NEXT:    br label [[MERGE:%.*]]
183 ; CHECK:       untaken:
184 ; CHECK-NEXT:    br label [[MERGE]]
185 ; CHECK:       merge:
186 ; CHECK-NEXT:    ret i64 [[A]]
188   br i1 %c, label %taken, label %untaken
189 taken:
190   %assumption = icmp eq i64 %a, 0
191   call void @llvm.assume(i1 %assumption)
192   br label %merge
193 untaken:
194   br label %merge
195 merge:
196   br label %next
197 next:
198   %phi = phi i64 [%a, %merge]
199   ret i64 %phi