Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / implied-cond-matching-false-dest.ll
blobb5518175548cd6d327024f3265af2a683a0ba79a
1 ; RUN: opt %s -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s
3 declare void @is(i1)
5 ; If A == B is false then A == B is implied false.
6 ; CHECK-LABEL: @test_eq_eq
7 ; CHECK-NOT: call void @is(i1 true)
8 ; CHECK: call void @is(i1 false)
9 define void @test_eq_eq(i32 %a, i32 %b) {
10   %cmp1 = icmp eq i32 %a, %b
11   br i1 %cmp1, label %untaken, label %taken
13 taken:
14   %cmp2 = icmp eq i32 %a, %b
15   br i1 %cmp2, label %istrue, label %isfalse
17 istrue:
18   call void @is(i1 true)
19   ret void
21 isfalse:
22   call void @is(i1 false)
23   ret void
25 untaken:
26   ret void
29 ; If A == B is false then A != B is implied true.
30 ; CHECK-LABEL: @test_eq_ne
31 ; CHECK: call void @is(i1 true)
32 ; CHECK-NOT: call void @is(i1 false)
33 define void @test_eq_ne(i32 %a, i32 %b) {
34   %cmp1 = icmp eq i32 %a, %b
35   br i1 %cmp1, label %untaken, label %taken
37 taken:
38   %cmp2 = icmp ne i32 %a, %b
39   br i1 %cmp2, label %istrue, label %isfalse
41 istrue:
42   call void @is(i1 true)
43   ret void
45 isfalse:
46   call void @is(i1 false)
47   ret void
49 untaken:
50   ret void
53 ; If A != B is false then A != B is implied false.
54 ; CHECK-LABEL: @test_ne_ne
55 ; CHECK-NOT: call void @is(i1 true)
56 ; CHECK: call void @is(i1 false)
57 define void @test_ne_ne(i32 %a, i32 %b) {
58   %cmp1 = icmp ne i32 %a, %b
59   br i1 %cmp1, label %untaken, label %taken
61 taken:
62   %cmp2 = icmp ne i32 %a, %b
63   br i1 %cmp2, label %istrue, label %isfalse
65 istrue:
66   call void @is(i1 true)
67   ret void
69 isfalse:
70   call void @is(i1 false)
71   ret void
73 untaken:
74   ret void
77 ; If A != B is false then A >u B is implied false.
78 ; CHECK-LABEL: @test_ne_ugt
79 ; CHECK-NOT: call void @is(i1 true)
80 ; CHECK: call void @is(i1 false)
81 define void @test_ne_ugt(i32 %a, i32 %b) {
82   %cmp1 = icmp ne i32 %a, %b
83   br i1 %cmp1, label %untaken, label %taken
85 taken:
86   %cmp2 = icmp ugt i32 %a, %b
87   br i1 %cmp2, label %istrue, label %isfalse
89 istrue:
90   call void @is(i1 true)
91   ret void
93 isfalse:
94   call void @is(i1 false)
95   ret void
97 untaken:
98   ret void
101 ; If A != B is false then A >=u B is implied true.
102 ; CHECK-LABEL: @test_ne_uge
103 ; CHECK: call void @is(i1 true)
104 ; CHECK-NOT: call void @is(i1 false)
105 define void @test_ne_uge(i32 %a, i32 %b) {
106   %cmp1 = icmp ne i32 %a, %b
107   br i1 %cmp1, label %untaken, label %taken
109 taken:
110   %cmp2 = icmp uge i32 %a, %b
111   br i1 %cmp2, label %istrue, label %isfalse
113 istrue:
114   call void @is(i1 true)
115   ret void
117 isfalse:
118   call void @is(i1 false)
119   ret void
121 untaken:
122   ret void
125 ; If A != B is false then A <u B is implied false.
126 ; CHECK-LABEL: @test_ne_ult
127 ; CHECK-NOT: call void @is(i1 true)
128 ; CHECK: call void @is(i1 false)
129 define void @test_ne_ult(i32 %a, i32 %b) {
130   %cmp1 = icmp ne i32 %a, %b
131   br i1 %cmp1, label %untaken, label %taken
133 taken:
134   %cmp2 = icmp ult i32 %a, %b
135   br i1 %cmp2, label %istrue, label %isfalse
137 istrue:
138   call void @is(i1 true)
139   ret void
141 isfalse:
142   call void @is(i1 false)
143   ret void
145 untaken:
146   ret void
149 ; If A != B is false then A <=u B is implied true.
150 ; CHECK-LABEL: @test_ne_ule
151 ; CHECK: call void @is(i1 true)
152 ; CHECK-NOT: call void @is(i1 false)
153 define void @test_ne_ule(i32 %a, i32 %b) {
154   %cmp1 = icmp ne i32 %a, %b
155   br i1 %cmp1, label %untaken, label %taken
157 taken:
158   %cmp2 = icmp ule i32 %a, %b
159   br i1 %cmp2, label %istrue, label %isfalse
161 istrue:
162   call void @is(i1 true)
163   ret void
165 isfalse:
166   call void @is(i1 false)
167   ret void
169 untaken:
170   ret void
173 ; If A >u B is false then A >u B is implied false.
174 ; CHECK-LABEL: @test_ugt_ugt
175 ; CHECK-NOT: call void @is(i1 true)
176 ; CHECK: call void @is(i1 false)
177 define void @test_ugt_ugt(i32 %a, i32 %b) {
178   %cmp1 = icmp ugt i32 %a, %b
179   br i1 %cmp1, label %untaken, label %taken
181 taken:
182   %cmp2 = icmp ugt i32 %a, %b
183   br i1 %cmp2, label %istrue, label %isfalse
185 istrue:
186   call void @is(i1 true)
187   ret void
189 isfalse:
190   call void @is(i1 false)
191   ret void
193 untaken:
194   ret void
197 ; If A >u B is false then A <=u B is implied true.
198 ; CHECK-LABEL: @test_ugt_ule
199 ; CHECK: call void @is(i1 true)
200 ; CHECK-NOT: call void @is(i1 false)
201 define void @test_ugt_ule(i32 %a, i32 %b) {
202   %cmp1 = icmp ugt i32 %a, %b
203   br i1 %cmp1, label %untaken, label %taken
205 taken:
206   %cmp2 = icmp ule i32 %a, %b
207   br i1 %cmp2, label %istrue, label %isfalse
209 istrue:
210   call void @is(i1 true)
211   ret void
213 isfalse:
214   call void @is(i1 false)
215   ret void
217 untaken:
218   ret void
221 ; If A >=u B is false then A >=u B is implied false.
222 ; CHECK-LABEL: @test_uge_uge
223 ; CHECK-NOT: call void @is(i1 true)
224 ; CHECK: call void @is(i1 false)
225 define void @test_uge_uge(i32 %a, i32 %b) {
226   %cmp1 = icmp uge i32 %a, %b
227   br i1 %cmp1, label %untaken, label %taken
229 taken:
230   %cmp2 = icmp uge i32 %a, %b
231   br i1 %cmp2, label %istrue, label %isfalse
233 istrue:
234   call void @is(i1 true)
235   ret void
237 isfalse:
238   call void @is(i1 false)
239   ret void
241 untaken:
242   ret void
245 ; If A >=u B is false then A <u B is implied true.
246 ; CHECK-LABEL: @test_uge_ult
247 ; CHECK: call void @is(i1 true)
248 ; CHECK-NOT: call void @is(i1 false)
249 define void @test_uge_ult(i32 %a, i32 %b) {
250   %cmp1 = icmp uge i32 %a, %b
251   br i1 %cmp1, label %untaken, label %taken
253 taken:
254   %cmp2 = icmp ult i32 %a, %b
255   br i1 %cmp2, label %istrue, label %isfalse
257 istrue:
258   call void @is(i1 true)
259   ret void
261 isfalse:
262   call void @is(i1 false)
263   ret void
265 untaken:
266   ret void
269 ; If A >=u B is false then A <=u B is implied true.
270 ; CHECK-LABEL: @test_uge_ule
271 ; CHECK: call void @is(i1 true)
272 ; CHECK-NOT: call void @is(i1 false)
273 define void @test_uge_ule(i32 %a, i32 %b) {
274   %cmp1 = icmp uge i32 %a, %b
275   br i1 %cmp1, label %untaken, label %taken
277 taken:
278   %cmp2 = icmp ule i32 %a, %b
279   br i1 %cmp2, label %istrue, label %isfalse
281 istrue:
282   call void @is(i1 true)
283   ret void
285 isfalse:
286   call void @is(i1 false)
287   ret void
289 untaken:
290   ret void
293 ; If A <u B is false then A <u B is implied false.
294 ; CHECK-LABEL: @test_ult_ult
295 ; CHECK-NOT: call void @is(i1 true)
296 ; CHECK: call void @is(i1 false)
297 define void @test_ult_ult(i32 %a, i32 %b) {
298   %cmp1 = icmp ult i32 %a, %b
299   br i1 %cmp1, label %untaken, label %taken
301 taken:
302   %cmp2 = icmp ult i32 %a, %b
303   br i1 %cmp2, label %istrue, label %isfalse
305 istrue:
306   call void @is(i1 true)
307   ret void
309 isfalse:
310   call void @is(i1 false)
311   ret void
313 untaken:
314   ret void
317 ; If A <=u B is false then A <=u B is implied false.
318 ; CHECK-LABEL: @test_ule_ule
319 ; CHECK-NOT: call void @is(i1 true)
320 ; CHECK: call void @is(i1 false)
321 define void @test_ule_ule(i32 %a, i32 %b) {
322   %cmp1 = icmp ule i32 %a, %b
323   br i1 %cmp1, label %untaken, label %taken
325 taken:
326   %cmp2 = icmp ule i32 %a, %b
327   br i1 %cmp2, label %istrue, label %isfalse
329 istrue:
330   call void @is(i1 true)
331   ret void
333 isfalse:
334   call void @is(i1 false)
335   ret void
337 untaken:
338   ret void