Skip to content

Commit ada2bb3

Browse files
committed
[InstSimplify] add tests to show missing vector icmp folds
llvm-svn: 279534
1 parent 291fd35 commit ada2bb3

File tree

1 file changed

+238
-0
lines changed

1 file changed

+238
-0
lines changed

llvm/test/Transforms/InstSimplify/icmp-constant.ll

+238
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ define i1 @tautological_ule(i8 %x) {
1111
ret i1 %cmp
1212
}
1313

14+
define <2 x i1> @tautological_ule_vec(<2 x i8> %x) {
15+
; CHECK-LABEL: @tautological_ule_vec(
16+
; CHECK-NEXT: [[CMP:%.*]] = icmp ule <2 x i8> %x, <i8 -1, i8 -1>
17+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
18+
;
19+
%cmp = icmp ule <2 x i8> %x, <i8 255, i8 255>
20+
ret <2 x i1> %cmp
21+
}
22+
1423
define i1 @tautological_ugt(i8 %x) {
1524
; CHECK-LABEL: @tautological_ugt(
1625
; CHECK-NEXT: ret i1 false
@@ -19,6 +28,15 @@ define i1 @tautological_ugt(i8 %x) {
1928
ret i1 %cmp
2029
}
2130

31+
define <2 x i1> @tautological_ugt_vec(<2 x i8> %x) {
32+
; CHECK-LABEL: @tautological_ugt_vec(
33+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> %x, <i8 -1, i8 -1>
34+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
35+
;
36+
%cmp = icmp ugt <2 x i8> %x, <i8 255, i8 255>
37+
ret <2 x i1> %cmp
38+
}
39+
2240
; 'urem x, C2' produces [0, C2)
2341
define i1 @urem3(i32 %X) {
2442
; CHECK-LABEL: @urem3(
@@ -29,6 +47,17 @@ define i1 @urem3(i32 %X) {
2947
ret i1 %B
3048
}
3149

50+
define <2 x i1> @urem3_vec(<2 x i32> %X) {
51+
; CHECK-LABEL: @urem3_vec(
52+
; CHECK-NEXT: [[A:%.*]] = urem <2 x i32> %X, <i32 10, i32 10>
53+
; CHECK-NEXT: [[B:%.*]] = icmp ult <2 x i32> [[A]], <i32 15, i32 15>
54+
; CHECK-NEXT: ret <2 x i1> [[B]]
55+
;
56+
%A = urem <2 x i32> %X, <i32 10, i32 10>
57+
%B = icmp ult <2 x i32> %A, <i32 15, i32 15>
58+
ret <2 x i1> %B
59+
}
60+
3261
;'srem x, C2' produces (-|C2|, |C2|)
3362
define i1 @srem1(i32 %X) {
3463
; CHECK-LABEL: @srem1(
@@ -39,6 +68,17 @@ define i1 @srem1(i32 %X) {
3968
ret i1 %B
4069
}
4170

71+
define <2 x i1> @srem1_vec(<2 x i32> %X) {
72+
; CHECK-LABEL: @srem1_vec(
73+
; CHECK-NEXT: [[A:%.*]] = srem <2 x i32> %X, <i32 -5, i32 -5>
74+
; CHECK-NEXT: [[B:%.*]] = icmp sgt <2 x i32> [[A]], <i32 5, i32 5>
75+
; CHECK-NEXT: ret <2 x i1> [[B]]
76+
;
77+
%A = srem <2 x i32> %X, <i32 -5, i32 -5>
78+
%B = icmp sgt <2 x i32> %A, <i32 5, i32 5>
79+
ret <2 x i1> %B
80+
}
81+
4282
;'udiv C2, x' produces [0, C2]
4383
define i1 @udiv5(i32 %X) {
4484
; CHECK-LABEL: @udiv5(
@@ -49,6 +89,17 @@ define i1 @udiv5(i32 %X) {
4989
ret i1 %C
5090
}
5191

92+
define <2 x i1> @udiv5_vec(<2 x i32> %X) {
93+
; CHECK-LABEL: @udiv5_vec(
94+
; CHECK-NEXT: [[A:%.*]] = udiv <2 x i32> <i32 123, i32 123>, %X
95+
; CHECK-NEXT: [[C:%.*]] = icmp ugt <2 x i32> [[A]], <i32 124, i32 124>
96+
; CHECK-NEXT: ret <2 x i1> [[C]]
97+
;
98+
%A = udiv <2 x i32> <i32 123, i32 123>, %X
99+
%C = icmp ugt <2 x i32> %A, <i32 124, i32 124>
100+
ret <2 x i1> %C
101+
}
102+
52103
; 'udiv x, C2' produces [0, UINT_MAX / C2]
53104
define i1 @udiv1(i32 %X) {
54105
; CHECK-LABEL: @udiv1(
@@ -59,6 +110,17 @@ define i1 @udiv1(i32 %X) {
59110
ret i1 %B
60111
}
61112

113+
define <2 x i1> @udiv1_vec(<2 x i32> %X) {
114+
; CHECK-LABEL: @udiv1_vec(
115+
; CHECK-NEXT: [[A:%.*]] = udiv <2 x i32> %X, <i32 1000000, i32 1000000>
116+
; CHECK-NEXT: [[B:%.*]] = icmp ult <2 x i32> [[A]], <i32 5000, i32 5000>
117+
; CHECK-NEXT: ret <2 x i1> [[B]]
118+
;
119+
%A = udiv <2 x i32> %X, <i32 1000000, i32 1000000>
120+
%B = icmp ult <2 x i32> %A, <i32 5000, i32 5000>
121+
ret <2 x i1> %B
122+
}
123+
62124
; 'sdiv C2, x' produces [-|C2|, |C2|]
63125
define i1 @compare_dividend(i32 %a) {
64126
; CHECK-LABEL: @compare_dividend(
@@ -69,6 +131,17 @@ define i1 @compare_dividend(i32 %a) {
69131
ret i1 %cmp
70132
}
71133

134+
define <2 x i1> @compare_dividend_vec(<2 x i32> %a) {
135+
; CHECK-LABEL: @compare_dividend_vec(
136+
; CHECK-NEXT: [[DIV:%.*]] = sdiv <2 x i32> <i32 2, i32 2>, %a
137+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[DIV]], <i32 3, i32 3>
138+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
139+
;
140+
%div = sdiv <2 x i32> <i32 2, i32 2>, %a
141+
%cmp = icmp eq <2 x i32> %div, <i32 3, i32 3>
142+
ret <2 x i1> %cmp
143+
}
144+
72145
; 'sdiv x, C2' produces [INT_MIN / C2, INT_MAX / C2]
73146
; where C2 != -1 and C2 != 0 and C2 != 1
74147
define i1 @sdiv1(i32 %X) {
@@ -80,6 +153,17 @@ define i1 @sdiv1(i32 %X) {
80153
ret i1 %B
81154
}
82155

156+
define <2 x i1> @sdiv1_vec(<2 x i32> %X) {
157+
; CHECK-LABEL: @sdiv1_vec(
158+
; CHECK-NEXT: [[A:%.*]] = sdiv <2 x i32> %X, <i32 1000000, i32 1000000>
159+
; CHECK-NEXT: [[B:%.*]] = icmp slt <2 x i32> [[A]], <i32 3000, i32 3000>
160+
; CHECK-NEXT: ret <2 x i1> [[B]]
161+
;
162+
%A = sdiv <2 x i32> %X, <i32 1000000, i32 1000000>
163+
%B = icmp slt <2 x i32> %A, <i32 3000, i32 3000>
164+
ret <2 x i1> %B
165+
}
166+
83167
; 'shl nuw C2, x' produces [C2, C2 << CLZ(C2)]
84168
define i1 @shl5(i32 %X) {
85169
; CHECK-LABEL: @shl5(
@@ -90,6 +174,17 @@ define i1 @shl5(i32 %X) {
90174
ret i1 %cmp
91175
}
92176

177+
define <2 x i1> @shl5_vec(<2 x i32> %X) {
178+
; CHECK-LABEL: @shl5_vec(
179+
; CHECK-NEXT: [[SUB:%.*]] = shl nuw <2 x i32> <i32 4, i32 4>, %X
180+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i32> [[SUB]], <i32 3, i32 3>
181+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
182+
;
183+
%sub = shl nuw <2 x i32> <i32 4, i32 4>, %X
184+
%cmp = icmp ugt <2 x i32> %sub, <i32 3, i32 3>
185+
ret <2 x i1> %cmp
186+
}
187+
93188
; 'shl nsw C2, x' produces [C2 << CLO(C2)-1, C2]
94189
define i1 @shl2(i32 %X) {
95190
; CHECK-LABEL: @shl2(
@@ -100,6 +195,17 @@ define i1 @shl2(i32 %X) {
100195
ret i1 %cmp
101196
}
102197

198+
define <2 x i1> @shl2_vec(<2 x i32> %X) {
199+
; CHECK-LABEL: @shl2_vec(
200+
; CHECK-NEXT: [[SUB:%.*]] = shl nsw <2 x i32> <i32 -1, i32 -1>, %X
201+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[SUB]], <i32 31, i32 31>
202+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
203+
;
204+
%sub = shl nsw <2 x i32> <i32 -1, i32 -1>, %X
205+
%cmp = icmp eq <2 x i32> %sub, <i32 31, i32 31>
206+
ret <2 x i1> %cmp
207+
}
208+
103209
; 'shl nsw C2, x' produces [C2 << CLO(C2)-1, C2]
104210
define i1 @shl4(i32 %X) {
105211
; CHECK-LABEL: @shl4(
@@ -110,6 +216,17 @@ define i1 @shl4(i32 %X) {
110216
ret i1 %cmp
111217
}
112218

219+
define <2 x i1> @shl4_vec(<2 x i32> %X) {
220+
; CHECK-LABEL: @shl4_vec(
221+
; CHECK-NEXT: [[SUB:%.*]] = shl nsw <2 x i32> <i32 -1, i32 -1>, %X
222+
; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i32> [[SUB]], <i32 -1, i32 -1>
223+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
224+
;
225+
%sub = shl nsw <2 x i32> <i32 -1, i32 -1>, %X
226+
%cmp = icmp sle <2 x i32> %sub, <i32 -1, i32 -1>
227+
ret <2 x i1> %cmp
228+
}
229+
113230
; 'shl nsw C2, x' produces [C2, C2 << CLZ(C2)-1]
114231
define i1 @icmp_shl_nsw_1(i64 %a) {
115232
; CHECK-LABEL: @icmp_shl_nsw_1(
@@ -120,6 +237,17 @@ define i1 @icmp_shl_nsw_1(i64 %a) {
120237
ret i1 %cmp
121238
}
122239

240+
define <2 x i1> @icmp_shl_nsw_1_vec(<2 x i64> %a) {
241+
; CHECK-LABEL: @icmp_shl_nsw_1_vec(
242+
; CHECK-NEXT: [[SHL:%.*]] = shl nsw <2 x i64> <i64 1, i64 1>, %a
243+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge <2 x i64> [[SHL]], zeroinitializer
244+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
245+
;
246+
%shl = shl nsw <2 x i64> <i64 1, i64 1>, %a
247+
%cmp = icmp sge <2 x i64> %shl, zeroinitializer
248+
ret <2 x i1> %cmp
249+
}
250+
123251
; 'shl nsw C2, x' produces [C2 << CLO(C2)-1, C2]
124252
define i1 @icmp_shl_nsw_neg1(i64 %a) {
125253
; CHECK-LABEL: @icmp_shl_nsw_neg1(
@@ -130,6 +258,17 @@ define i1 @icmp_shl_nsw_neg1(i64 %a) {
130258
ret i1 %cmp
131259
}
132260

261+
define <2 x i1> @icmp_shl_nsw_neg1_vec(<2 x i64> %a) {
262+
; CHECK-LABEL: @icmp_shl_nsw_neg1_vec(
263+
; CHECK-NEXT: [[SHL:%.*]] = shl nsw <2 x i64> <i64 -1, i64 -1>, %a
264+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge <2 x i64> [[SHL]], <i64 3, i64 3>
265+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
266+
;
267+
%shl = shl nsw <2 x i64> <i64 -1, i64 -1>, %a
268+
%cmp = icmp sge <2 x i64> %shl, <i64 3, i64 3>
269+
ret <2 x i1> %cmp
270+
}
271+
133272
; 'lshr x, C2' produces [0, UINT_MAX >> C2]
134273
define i1 @lshr2(i32 %x) {
135274
; CHECK-LABEL: @lshr2(
@@ -140,6 +279,17 @@ define i1 @lshr2(i32 %x) {
140279
ret i1 %c
141280
}
142281

282+
define <2 x i1> @lshr2_vec(<2 x i32> %x) {
283+
; CHECK-LABEL: @lshr2_vec(
284+
; CHECK-NEXT: [[S:%.*]] = lshr <2 x i32> %x, <i32 30, i32 30>
285+
; CHECK-NEXT: [[C:%.*]] = icmp ugt <2 x i32> [[S]], <i32 8, i32 8>
286+
; CHECK-NEXT: ret <2 x i1> [[C]]
287+
;
288+
%s = lshr <2 x i32> %x, <i32 30, i32 30>
289+
%c = icmp ugt <2 x i32> %s, <i32 8, i32 8>
290+
ret <2 x i1> %c
291+
}
292+
143293
; 'lshr C2, x' produces [C2 >> (Width-1), C2]
144294
define i1 @exact_lshr_ugt_false(i32 %a) {
145295
; CHECK-LABEL: @exact_lshr_ugt_false(
@@ -150,6 +300,17 @@ define i1 @exact_lshr_ugt_false(i32 %a) {
150300
ret i1 %cmp
151301
}
152302

303+
define <2 x i1> @exact_lshr_ugt_false_vec(<2 x i32> %a) {
304+
; CHECK-LABEL: @exact_lshr_ugt_false_vec(
305+
; CHECK-NEXT: [[SHR:%.*]] = lshr exact <2 x i32> <i32 30, i32 30>, %a
306+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[SHR]], <i32 15, i32 15>
307+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
308+
;
309+
%shr = lshr exact <2 x i32> <i32 30, i32 30>, %a
310+
%cmp = icmp ult <2 x i32> %shr, <i32 15, i32 15>
311+
ret <2 x i1> %cmp
312+
}
313+
153314
; 'lshr C2, x' produces [C2 >> (Width-1), C2]
154315
define i1 @lshr_sgt_false(i32 %a) {
155316
; CHECK-LABEL: @lshr_sgt_false(
@@ -160,6 +321,17 @@ define i1 @lshr_sgt_false(i32 %a) {
160321
ret i1 %cmp
161322
}
162323

324+
define <2 x i1> @lshr_sgt_false_vec(<2 x i32> %a) {
325+
; CHECK-LABEL: @lshr_sgt_false_vec(
326+
; CHECK-NEXT: [[SHR:%.*]] = lshr <2 x i32> <i32 1, i32 1>, %a
327+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[SHR]], <i32 1, i32 1>
328+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
329+
;
330+
%shr = lshr <2 x i32> <i32 1, i32 1>, %a
331+
%cmp = icmp sgt <2 x i32> %shr, <i32 1, i32 1>
332+
ret <2 x i1> %cmp
333+
}
334+
163335
; 'ashr x, C2' produces [INT_MIN >> C2, INT_MAX >> C2]
164336
define i1 @ashr2(i32 %x) {
165337
; CHECK-LABEL: @ashr2(
@@ -170,6 +342,17 @@ define i1 @ashr2(i32 %x) {
170342
ret i1 %c
171343
}
172344

345+
define <2 x i1> @ashr2_vec(<2 x i32> %x) {
346+
; CHECK-LABEL: @ashr2_vec(
347+
; CHECK-NEXT: [[S:%.*]] = ashr <2 x i32> %x, <i32 30, i32 30>
348+
; CHECK-NEXT: [[C:%.*]] = icmp slt <2 x i32> [[S]], <i32 -5, i32 -5>
349+
; CHECK-NEXT: ret <2 x i1> [[C]]
350+
;
351+
%s = ashr <2 x i32> %x, <i32 30, i32 30>
352+
%c = icmp slt <2 x i32> %s, <i32 -5, i32 -5>
353+
ret <2 x i1> %c
354+
}
355+
173356
; 'ashr C2, x' produces [C2, C2 >> (Width-1)]
174357
define i1 @ashr_sgt_false(i32 %a) {
175358
; CHECK-LABEL: @ashr_sgt_false(
@@ -180,6 +363,17 @@ define i1 @ashr_sgt_false(i32 %a) {
180363
ret i1 %cmp
181364
}
182365

366+
define <2 x i1> @ashr_sgt_false_vec(<2 x i32> %a) {
367+
; CHECK-LABEL: @ashr_sgt_false_vec(
368+
; CHECK-NEXT: [[SHR:%.*]] = ashr <2 x i32> <i32 -30, i32 -30>, %a
369+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[SHR]], <i32 -1, i32 -1>
370+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
371+
;
372+
%shr = ashr <2 x i32> <i32 -30, i32 -30>, %a
373+
%cmp = icmp sgt <2 x i32> %shr, <i32 -1, i32 -1>
374+
ret <2 x i1> %cmp
375+
}
376+
183377
; 'ashr C2, x' produces [C2, C2 >> (Width-1)]
184378
define i1 @exact_ashr_sgt_false(i32 %a) {
185379
; CHECK-LABEL: @exact_ashr_sgt_false(
@@ -190,6 +384,17 @@ define i1 @exact_ashr_sgt_false(i32 %a) {
190384
ret i1 %cmp
191385
}
192386

387+
define <2 x i1> @exact_ashr_sgt_false_vec(<2 x i32> %a) {
388+
; CHECK-LABEL: @exact_ashr_sgt_false_vec(
389+
; CHECK-NEXT: [[SHR:%.*]] = ashr exact <2 x i32> <i32 -30, i32 -30>, %a
390+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[SHR]], <i32 -15, i32 -15>
391+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
392+
;
393+
%shr = ashr exact <2 x i32> <i32 -30, i32 -30>, %a
394+
%cmp = icmp sgt <2 x i32> %shr, <i32 -15, i32 -15>
395+
ret <2 x i1> %cmp
396+
}
397+
193398
; 'or x, C2' produces [C2, UINT_MAX]
194399
define i1 @or1(i32 %X) {
195400
; CHECK-LABEL: @or1(
@@ -200,6 +405,17 @@ define i1 @or1(i32 %X) {
200405
ret i1 %B
201406
}
202407

408+
define <2 x i1> @or1_vec(<2 x i32> %X) {
409+
; CHECK-LABEL: @or1_vec(
410+
; CHECK-NEXT: [[A:%.*]] = or <2 x i32> %X, <i32 62, i32 62>
411+
; CHECK-NEXT: [[B:%.*]] = icmp ult <2 x i32> [[A]], <i32 50, i32 50>
412+
; CHECK-NEXT: ret <2 x i1> [[B]]
413+
;
414+
%A = or <2 x i32> %X, <i32 62, i32 62>
415+
%B = icmp ult <2 x i32> %A, <i32 50, i32 50>
416+
ret <2 x i1> %B
417+
}
418+
203419
; 'and x, C2' produces [0, C2]
204420
define i1 @and1(i32 %X) {
205421
; CHECK-LABEL: @and1(
@@ -210,6 +426,17 @@ define i1 @and1(i32 %X) {
210426
ret i1 %B
211427
}
212428

429+
define <2 x i1> @and1_vec(<2 x i32> %X) {
430+
; CHECK-LABEL: @and1_vec(
431+
; CHECK-NEXT: [[A:%.*]] = and <2 x i32> %X, <i32 62, i32 62>
432+
; CHECK-NEXT: [[B:%.*]] = icmp ugt <2 x i32> [[A]], <i32 70, i32 70>
433+
; CHECK-NEXT: ret <2 x i1> [[B]]
434+
;
435+
%A = and <2 x i32> %X, <i32 62, i32 62>
436+
%B = icmp ugt <2 x i32> %A, <i32 70, i32 70>
437+
ret <2 x i1> %B
438+
}
439+
213440
; 'add nuw x, C2' produces [C2, UINT_MAX]
214441
define i1 @tautological9(i32 %x) {
215442
; CHECK-LABEL: @tautological9(
@@ -220,3 +447,14 @@ define i1 @tautological9(i32 %x) {
220447
ret i1 %cmp
221448
}
222449

450+
define <2 x i1> @tautological9_vec(<2 x i32> %x) {
451+
; CHECK-LABEL: @tautological9_vec(
452+
; CHECK-NEXT: [[ADD:%.*]] = add nuw <2 x i32> %x, <i32 13, i32 13>
453+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[ADD]], <i32 12, i32 12>
454+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
455+
;
456+
%add = add nuw <2 x i32> %x, <i32 13, i32 13>
457+
%cmp = icmp ne <2 x i32> %add, <i32 12, i32 12>
458+
ret <2 x i1> %cmp
459+
}
460+

0 commit comments

Comments
 (0)