[SLP] Add cost model for `llvm.powi.*` intrinsics
[llvm-project.git] / llvm / test / Transforms / InstCombine / icmp-constant-phi.ll
blob891e40274a37d96a77ca7cd4dc886ceca8471a47
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
4 define i1 @test_eq(i1 %cond) {
5 ; CHECK-LABEL: @test_eq(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
8 ; CHECK:       if.true:
9 ; CHECK-NEXT:    br label [[MERGE:%.*]]
10 ; CHECK:       if.false:
11 ; CHECK-NEXT:    br label [[MERGE]]
12 ; CHECK:       merge:
13 ; CHECK-NEXT:    br label [[EXIT:%.*]]
14 ; CHECK:       exit:
15 ; CHECK-NEXT:    [[TMP0:%.*]] = xor i1 [[COND]], true
16 ; CHECK-NEXT:    ret i1 [[TMP0]]
18 entry:
19   br i1 %cond, label %if.true, label %if.false
21 if.true:
22   br label %merge
24 if.false:
25   br label %merge
27 merge:
28   %phi = phi i32 [123, %if.true], [456, %if.false]
29   br label %exit
31 exit:
32   %compare = icmp eq i32 %phi, 456
33   ret i1 %compare
36 define i1 @test_slt(i1 %cond) {
37 ; CHECK-LABEL: @test_slt(
38 ; CHECK-NEXT:  entry:
39 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
40 ; CHECK:       if.true:
41 ; CHECK-NEXT:    br label [[MERGE:%.*]]
42 ; CHECK:       if.false:
43 ; CHECK-NEXT:    br label [[MERGE]]
44 ; CHECK:       merge:
45 ; CHECK-NEXT:    br label [[EXIT:%.*]]
46 ; CHECK:       exit:
47 ; CHECK-NEXT:    ret i1 [[COND]]
49 entry:
50   br i1 %cond, label %if.true, label %if.false
52 if.true:
53   br label %merge
55 if.false:
56   br label %merge
58 merge:
59   %phi = phi i32 [123, %if.true], [456, %if.false]
60   br label %exit
62 exit:
63   %compare = icmp slt i32 %phi, 456
64   ret i1 %compare
67 define i1 @test_sle(i1 %cond) {
68 ; CHECK-LABEL: @test_sle(
69 ; CHECK-NEXT:  entry:
70 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
71 ; CHECK:       if.true:
72 ; CHECK-NEXT:    br label [[MERGE:%.*]]
73 ; CHECK:       if.false:
74 ; CHECK-NEXT:    br label [[MERGE]]
75 ; CHECK:       merge:
76 ; CHECK-NEXT:    br label [[EXIT:%.*]]
77 ; CHECK:       exit:
78 ; CHECK-NEXT:    ret i1 true
80 entry:
81   br i1 %cond, label %if.true, label %if.false
83 if.true:
84   br label %merge
86 if.false:
87   br label %merge
89 merge:
90   %phi = phi i32 [123, %if.true], [456, %if.false]
91   br label %exit
93 exit:
94   %compare = icmp sle i32 %phi, 456
95   ret i1 %compare
98 define i1 @test_ne(i1 %cond) {
99 ; CHECK-LABEL: @test_ne(
100 ; CHECK-NEXT:  entry:
101 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
102 ; CHECK:       if.true:
103 ; CHECK-NEXT:    br label [[MERGE:%.*]]
104 ; CHECK:       if.false:
105 ; CHECK-NEXT:    br label [[MERGE]]
106 ; CHECK:       merge:
107 ; CHECK-NEXT:    br label [[EXIT:%.*]]
108 ; CHECK:       exit:
109 ; CHECK-NEXT:    ret i1 [[COND]]
111 entry:
112   br i1 %cond, label %if.true, label %if.false
114 if.true:
115   br label %merge
117 if.false:
118   br label %merge
120 merge:
121   %phi = phi i32 [123, %if.true], [456, %if.false]
122   br label %exit
124 exit:
125   %compare = icmp ne i32 %phi, 456
126   ret i1 %compare
129 define i1 @test_ne_undef(i1 %cond) {
130 ; CHECK-LABEL: @test_ne_undef(
131 ; CHECK-NEXT:  entry:
132 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
133 ; CHECK:       if.true:
134 ; CHECK-NEXT:    br label [[MERGE:%.*]]
135 ; CHECK:       if.false:
136 ; CHECK-NEXT:    br label [[MERGE]]
137 ; CHECK:       merge:
138 ; CHECK-NEXT:    br label [[EXIT:%.*]]
139 ; CHECK:       exit:
140 ; CHECK-NEXT:    ret i1 false
142 entry:
143   br i1 %cond, label %if.true, label %if.false
145 if.true:
146   br label %merge
148 if.false:
149   br label %merge
151 merge:
152   %phi = phi i32 [undef, %if.true], [456, %if.false]
153   br label %exit
155 exit:
156   %compare = icmp ne i32 %phi, 456
157   ret i1 %compare
160 define <2 x i1> @test_ne_int_vector(i1 %cond) {
161 ; CHECK-LABEL: @test_ne_int_vector(
162 ; CHECK-NEXT:  entry:
163 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
164 ; CHECK:       if.true:
165 ; CHECK-NEXT:    br label [[MERGE:%.*]]
166 ; CHECK:       if.false:
167 ; CHECK-NEXT:    br label [[MERGE]]
168 ; CHECK:       merge:
169 ; CHECK-NEXT:    [[COMPARE:%.*]] = phi <2 x i1> [ <i1 true, i1 false>, [[IF_FALSE]] ], [ <i1 false, i1 true>, [[IF_TRUE]] ]
170 ; CHECK-NEXT:    br label [[EXIT:%.*]]
171 ; CHECK:       exit:
172 ; CHECK-NEXT:    ret <2 x i1> [[COMPARE]]
174 entry:
175   br i1 %cond, label %if.true, label %if.false
177 if.true:
178   br label %merge
180 if.false:
181   br label %merge
183 merge:
184   %phi = phi <2 x i32> [<i32 123, i32 123>, %if.true], [<i32 456, i32 456>, %if.false]
185   br label %exit
187 exit:
188   %compare = icmp ne <2 x i32> %phi, <i32 123, i32 456>
189   ret <2 x i1> %compare
192 ; TODO: We can also constant-fold this comparison for floats.
193 define i1 @test_ne_float(i1 %cond) {
194 ; CHECK-LABEL: @test_ne_float(
195 ; CHECK-NEXT:  entry:
196 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
197 ; CHECK:       if.true:
198 ; CHECK-NEXT:    br label [[MERGE:%.*]]
199 ; CHECK:       if.false:
200 ; CHECK-NEXT:    br label [[MERGE]]
201 ; CHECK:       merge:
202 ; CHECK-NEXT:    [[PHI:%.*]] = phi float [ 1.000000e+00, [[IF_TRUE]] ], [ 1.250000e+00, [[IF_FALSE]] ]
203 ; CHECK-NEXT:    br label [[EXIT:%.*]]
204 ; CHECK:       exit:
205 ; CHECK-NEXT:    [[COMPARE:%.*]] = fcmp one float [[PHI]], 1.250000e+00
206 ; CHECK-NEXT:    ret i1 [[COMPARE]]
208 entry:
209   br i1 %cond, label %if.true, label %if.false
211 if.true:
212   br label %merge
214 if.false:
215   br label %merge
217 merge:
218   %phi = phi float [1.0, %if.true], [1.25, %if.false]
219   br label %exit
221 exit:
222   %compare = fcmp one float %phi, 1.25
223   ret i1 %compare
226 define i1 @test_ne_float_undef(i1 %cond) {
227 ; CHECK-LABEL: @test_ne_float_undef(
228 ; CHECK-NEXT:  entry:
229 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
230 ; CHECK:       if.true:
231 ; CHECK-NEXT:    br label [[MERGE:%.*]]
232 ; CHECK:       if.false:
233 ; CHECK-NEXT:    br label [[MERGE]]
234 ; CHECK:       merge:
235 ; CHECK-NEXT:    br label [[EXIT:%.*]]
236 ; CHECK:       exit:
237 ; CHECK-NEXT:    ret i1 true
239 entry:
240   br i1 %cond, label %if.true, label %if.false
242 if.true:
243   br label %merge
245 if.false:
246   br label %merge
248 merge:
249   %phi = phi float [1.0, %if.true], [undef, %if.false]
250   br label %exit
252 exit:
253   %compare = fcmp one float %phi, 1.25
254   ret i1 %compare
257 define <2 x i1> @test_ne_float_vector(i1 %cond) {
258 ; CHECK-LABEL: @test_ne_float_vector(
259 ; CHECK-NEXT:  entry:
260 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
261 ; CHECK:       if.true:
262 ; CHECK-NEXT:    br label [[MERGE:%.*]]
263 ; CHECK:       if.false:
264 ; CHECK-NEXT:    br label [[MERGE]]
265 ; CHECK:       merge:
266 ; CHECK-NEXT:    [[PHI:%.*]] = phi <2 x float> [ <float 1.232500e+02, float 1.232500e+02>, [[IF_TRUE]] ], [ <float 4.562500e+02, float 4.562500e+02>, [[IF_FALSE]] ]
267 ; CHECK-NEXT:    br label [[EXIT:%.*]]
268 ; CHECK:       exit:
269 ; CHECK-NEXT:    [[COMPARE:%.*]] = fcmp one <2 x float> [[PHI]], <float 1.232500e+02, float 4.562500e+02>
270 ; CHECK-NEXT:    ret <2 x i1> [[COMPARE]]
272 entry:
273   br i1 %cond, label %if.true, label %if.false
275 if.true:
276   br label %merge
278 if.false:
279   br label %merge
281 merge:
282   %phi = phi <2 x float> [<float 123.25, float 123.25>, %if.true], [<float 456.25, float 456.25>, %if.false]
283   br label %exit
285 exit:
286   %compare = fcmp one <2 x float> %phi, <float 123.25, float 456.25>
287   ret <2 x i1> %compare