xref: /llvm-project/llvm/test/Transforms/InstCombine/sign-test-and-or.ll (revision 6de7c80483ee90a5feaf2e6cd68a6a7c5a9e5c67)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3
4declare void @foo()
5
6define i1 @test1(i32 %a, i32 %b) {
7; CHECK-LABEL: @test1(
8; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[A:%.*]], [[B:%.*]]
9; CHECK-NEXT:    [[OR_COND:%.*]] = icmp slt i32 [[TMP1]], 0
10; CHECK-NEXT:    ret i1 [[OR_COND]]
11;
12  %1 = icmp slt i32 %a, 0
13  %2 = icmp slt i32 %b, 0
14  %or.cond = or i1 %1, %2
15  ret i1 %or.cond
16}
17
18define <2 x i1> @test1_splat(<2 x i32> %a, <2 x i32> %b) {
19; CHECK-LABEL: @test1_splat(
20; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> [[A:%.*]], [[B:%.*]]
21; CHECK-NEXT:    [[OR_COND:%.*]] = icmp slt <2 x i32> [[TMP1]], zeroinitializer
22; CHECK-NEXT:    ret <2 x i1> [[OR_COND]]
23;
24  %1 = icmp slt <2 x i32> %a, zeroinitializer
25  %2 = icmp slt <2 x i32> %b, zeroinitializer
26  %or.cond = or <2 x i1> %1, %2
27  ret <2 x i1> %or.cond
28}
29
30define i1 @test1_logical(i32 %a, i32 %b) {
31; CHECK-LABEL: @test1_logical(
32; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 0
33; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[B:%.*]], 0
34; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[TMP1]], i1 true, i1 [[TMP2]]
35; CHECK-NEXT:    ret i1 [[OR_COND]]
36;
37  %1 = icmp slt i32 %a, 0
38  %2 = icmp slt i32 %b, 0
39  %or.cond = select i1 %1, i1 true, i1 %2
40  ret i1 %or.cond
41}
42
43define i1 @test2(i32 %a, i32 %b) {
44; CHECK-LABEL: @test2(
45; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], [[B:%.*]]
46; CHECK-NEXT:    [[OR_COND:%.*]] = icmp sgt i32 [[TMP1]], -1
47; CHECK-NEXT:    ret i1 [[OR_COND]]
48;
49  %1 = icmp sgt i32 %a, -1
50  %2 = icmp sgt i32 %b, -1
51  %or.cond = or i1 %1, %2
52  ret i1 %or.cond
53}
54
55define i1 @test2_logical(i32 %a, i32 %b) {
56; CHECK-LABEL: @test2_logical(
57; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -1
58; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[B:%.*]], -1
59; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[TMP1]], i1 true, i1 [[TMP2]]
60; CHECK-NEXT:    ret i1 [[OR_COND]]
61;
62  %1 = icmp sgt i32 %a, -1
63  %2 = icmp sgt i32 %b, -1
64  %or.cond = select i1 %1, i1 true, i1 %2
65  ret i1 %or.cond
66}
67
68define i1 @test3(i32 %a, i32 %b) {
69; CHECK-LABEL: @test3(
70; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], [[B:%.*]]
71; CHECK-NEXT:    [[OR_COND:%.*]] = icmp slt i32 [[TMP1]], 0
72; CHECK-NEXT:    ret i1 [[OR_COND]]
73;
74  %1 = icmp slt i32 %a, 0
75  %2 = icmp slt i32 %b, 0
76  %or.cond = and i1 %1, %2
77  ret i1 %or.cond
78}
79
80define i1 @test3_logical(i32 %a, i32 %b) {
81; CHECK-LABEL: @test3_logical(
82; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 0
83; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[B:%.*]], 0
84; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false
85; CHECK-NEXT:    ret i1 [[OR_COND]]
86;
87  %1 = icmp slt i32 %a, 0
88  %2 = icmp slt i32 %b, 0
89  %or.cond = select i1 %1, i1 %2, i1 false
90  ret i1 %or.cond
91}
92
93define i1 @test4(i32 %a, i32 %b) {
94; CHECK-LABEL: @test4(
95; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[A:%.*]], [[B:%.*]]
96; CHECK-NEXT:    [[OR_COND:%.*]] = icmp sgt i32 [[TMP1]], -1
97; CHECK-NEXT:    ret i1 [[OR_COND]]
98;
99  %1 = icmp sgt i32 %a, -1
100  %2 = icmp sgt i32 %b, -1
101  %or.cond = and i1 %1, %2
102  ret i1 %or.cond
103}
104
105define i1 @test4_logical(i32 %a, i32 %b) {
106; CHECK-LABEL: @test4_logical(
107; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -1
108; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[B:%.*]], -1
109; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false
110; CHECK-NEXT:    ret i1 [[OR_COND]]
111;
112  %1 = icmp sgt i32 %a, -1
113  %2 = icmp sgt i32 %b, -1
114  %or.cond = select i1 %1, i1 %2, i1 false
115  ret i1 %or.cond
116}
117
118define void @test5(i32 %a) {
119; CHECK-LABEL: @test5(
120; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
121; CHECK-NEXT:    [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0
122; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
123; CHECK:       if.then:
124; CHECK-NEXT:    tail call void @foo() #[[ATTR0:[0-9]+]]
125; CHECK-NEXT:    ret void
126; CHECK:       if.end:
127; CHECK-NEXT:    ret void
128;
129  %and = and i32 %a, 134217728
130  %1 = icmp eq i32 %and, 0
131  %2 = icmp sgt i32 %a, -1
132  %or.cond = and i1 %1, %2
133  br i1 %or.cond, label %if.then, label %if.end
134
135
136if.then:
137  tail call void @foo() nounwind
138  ret void
139
140if.end:
141  ret void
142}
143
144define void @test5_logical(i32 %a) {
145; CHECK-LABEL: @test5_logical(
146; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
147; CHECK-NEXT:    [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0
148; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
149; CHECK:       if.then:
150; CHECK-NEXT:    tail call void @foo() #[[ATTR0]]
151; CHECK-NEXT:    ret void
152; CHECK:       if.end:
153; CHECK-NEXT:    ret void
154;
155  %and = and i32 %a, 134217728
156  %1 = icmp eq i32 %and, 0
157  %2 = icmp sgt i32 %a, -1
158  %or.cond = select i1 %1, i1 %2, i1 false
159  br i1 %or.cond, label %if.then, label %if.end
160
161
162if.then:
163  tail call void @foo() nounwind
164  ret void
165
166if.end:
167  ret void
168}
169
170define void @test6(i32 %a) {
171; CHECK-LABEL: @test6(
172; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
173; CHECK-NEXT:    [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0
174; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
175; CHECK:       if.then:
176; CHECK-NEXT:    tail call void @foo() #[[ATTR0]]
177; CHECK-NEXT:    ret void
178; CHECK:       if.end:
179; CHECK-NEXT:    ret void
180;
181  %1 = icmp sgt i32 %a, -1
182  %and = and i32 %a, 134217728
183  %2 = icmp eq i32 %and, 0
184  %or.cond = and i1 %1, %2
185  br i1 %or.cond, label %if.then, label %if.end
186
187
188if.then:
189  tail call void @foo() nounwind
190  ret void
191
192if.end:
193  ret void
194}
195
196define void @test6_logical(i32 %a) {
197; CHECK-LABEL: @test6_logical(
198; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
199; CHECK-NEXT:    [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0
200; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
201; CHECK:       if.then:
202; CHECK-NEXT:    tail call void @foo() #[[ATTR0]]
203; CHECK-NEXT:    ret void
204; CHECK:       if.end:
205; CHECK-NEXT:    ret void
206;
207  %1 = icmp sgt i32 %a, -1
208  %and = and i32 %a, 134217728
209  %2 = icmp eq i32 %and, 0
210  %or.cond = select i1 %1, i1 %2, i1 false
211  br i1 %or.cond, label %if.then, label %if.end
212
213
214if.then:
215  tail call void @foo() nounwind
216  ret void
217
218if.end:
219  ret void
220}
221
222define void @test7(i32 %a) {
223; CHECK-LABEL: @test7(
224; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
225; CHECK-NEXT:    [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0
226; CHECK-NEXT:    br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
227; CHECK:       if.then:
228; CHECK-NEXT:    tail call void @foo() #[[ATTR0]]
229; CHECK-NEXT:    ret void
230; CHECK:       if.end:
231; CHECK-NEXT:    ret void
232;
233  %and = and i32 %a, 134217728
234  %1 = icmp ne i32 %and, 0
235  %2 = icmp slt i32 %a, 0
236  %or.cond = or i1 %1, %2
237  br i1 %or.cond, label %if.then, label %if.end
238
239
240if.then:
241  tail call void @foo() nounwind
242  ret void
243
244if.end:
245  ret void
246}
247
248define void @test7_logical(i32 %a) {
249; CHECK-LABEL: @test7_logical(
250; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
251; CHECK-NEXT:    [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0
252; CHECK-NEXT:    br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
253; CHECK:       if.then:
254; CHECK-NEXT:    tail call void @foo() #[[ATTR0]]
255; CHECK-NEXT:    ret void
256; CHECK:       if.end:
257; CHECK-NEXT:    ret void
258;
259  %and = and i32 %a, 134217728
260  %1 = icmp ne i32 %and, 0
261  %2 = icmp slt i32 %a, 0
262  %or.cond = select i1 %1, i1 true, i1 %2
263  br i1 %or.cond, label %if.then, label %if.end
264
265
266if.then:
267  tail call void @foo() nounwind
268  ret void
269
270if.end:
271  ret void
272}
273
274define void @test8(i32 %a) {
275; CHECK-LABEL: @test8(
276; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
277; CHECK-NEXT:    [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0
278; CHECK-NEXT:    br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
279; CHECK:       if.then:
280; CHECK-NEXT:    tail call void @foo()
281; CHECK-NEXT:    ret void
282; CHECK:       if.end:
283; CHECK-NEXT:    ret void
284;
285  %1 = icmp slt i32 %a, 0
286  %and = and i32 %a, 134217728
287  %2 = icmp ne i32 %and, 0
288  %or.cond = or i1 %1, %2
289  br i1 %or.cond, label %if.then, label %if.end
290
291
292if.then:
293  tail call void @foo()
294  ret void
295
296if.end:
297  ret void
298}
299
300define void @test8_logical(i32 %a) {
301; CHECK-LABEL: @test8_logical(
302; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920
303; CHECK-NEXT:    [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0
304; CHECK-NEXT:    br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
305; CHECK:       if.then:
306; CHECK-NEXT:    tail call void @foo()
307; CHECK-NEXT:    ret void
308; CHECK:       if.end:
309; CHECK-NEXT:    ret void
310;
311  %1 = icmp slt i32 %a, 0
312  %and = and i32 %a, 134217728
313  %2 = icmp ne i32 %and, 0
314  %or.cond = select i1 %1, i1 true, i1 %2
315  br i1 %or.cond, label %if.then, label %if.end
316
317
318if.then:
319  tail call void @foo()
320  ret void
321
322if.end:
323  ret void
324}
325
326define i1 @test9(i32 %a) {
327; CHECK-LABEL: @test9(
328; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -1073741824
329; CHECK-NEXT:    [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 1073741824
330; CHECK-NEXT:    ret i1 [[OR_COND]]
331;
332  %1 = and i32 %a, 1073741824
333  %2 = icmp ne i32 %1, 0
334  %3 = icmp sgt i32 %a, -1
335  %or.cond = and i1 %2, %3
336  ret i1 %or.cond
337}
338
339define i1 @test9_logical(i32 %a) {
340; CHECK-LABEL: @test9_logical(
341; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[A:%.*]], -1073741824
342; CHECK-NEXT:    [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 1073741824
343; CHECK-NEXT:    ret i1 [[OR_COND]]
344;
345  %1 = and i32 %a, 1073741824
346  %2 = icmp ne i32 %1, 0
347  %3 = icmp sgt i32 %a, -1
348  %or.cond = select i1 %2, i1 %3, i1 false
349  ret i1 %or.cond
350}
351
352define i1 @test10(i32 %a) {
353; CHECK-LABEL: @test10(
354; CHECK-NEXT:    [[OR_COND:%.*]] = icmp ult i32 [[A:%.*]], 2
355; CHECK-NEXT:    ret i1 [[OR_COND]]
356;
357  %1 = and i32 %a, 2
358  %2 = icmp eq i32 %1, 0
359  %3 = icmp ult i32 %a, 4
360  %or.cond = and i1 %2, %3
361  ret i1 %or.cond
362}
363
364define i1 @test10_logical(i32 %a) {
365; CHECK-LABEL: @test10_logical(
366; CHECK-NEXT:    [[OR_COND:%.*]] = icmp ult i32 [[A:%.*]], 2
367; CHECK-NEXT:    ret i1 [[OR_COND]]
368;
369  %1 = and i32 %a, 2
370  %2 = icmp eq i32 %1, 0
371  %3 = icmp ult i32 %a, 4
372  %or.cond = select i1 %2, i1 %3, i1 false
373  ret i1 %or.cond
374}
375
376define i1 @test11(i32 %a) {
377; CHECK-LABEL: @test11(
378; CHECK-NEXT:    [[OR_COND:%.*]] = icmp ugt i32 [[A:%.*]], 1
379; CHECK-NEXT:    ret i1 [[OR_COND]]
380;
381  %1 = and i32 %a, 2
382  %2 = icmp ne i32 %1, 0
383  %3 = icmp ugt i32 %a, 3
384  %or.cond = or i1 %2, %3
385  ret i1 %or.cond
386}
387
388define i1 @test11_logical(i32 %a) {
389; CHECK-LABEL: @test11_logical(
390; CHECK-NEXT:    [[OR_COND:%.*]] = icmp ugt i32 [[A:%.*]], 1
391; CHECK-NEXT:    ret i1 [[OR_COND]]
392;
393  %1 = and i32 %a, 2
394  %2 = icmp ne i32 %1, 0
395  %3 = icmp ugt i32 %a, 3
396  %or.cond = select i1 %2, i1 true, i1 %3
397  ret i1 %or.cond
398}
399