Skip to content

Commit 25a02c1

Browse files
committed
[InstCombine] Improve cttz/ctlz + icmp tests; NFC
Change part of the tests to use vectors (I'm using scalar for ugt and vector for ult), add multiuse variations, rename %lz to %tz for the cttz tests. llvm-svn: 350471
1 parent 4f95b9c commit 25a02c1

File tree

1 file changed

+134
-83
lines changed

1 file changed

+134
-83
lines changed

llvm/test/Transforms/InstCombine/cmp-intrinsic.ll

Lines changed: 134 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,19 @@ define i1 @ctlz_ugt_other_i32(i32 %x) {
169169
ret i1 %cmp
170170
}
171171

172+
define i1 @ctlz_ugt_other_multiuse_i32(i32 %x, i32* %p) {
173+
; CHECK-LABEL: @ctlz_ugt_other_multiuse_i32(
174+
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
175+
; CHECK-NEXT: store i32 [[LZ]], i32* [[P:%.*]], align 4
176+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 16
177+
; CHECK-NEXT: ret i1 [[CMP]]
178+
;
179+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
180+
store i32 %lz, i32* %p
181+
%cmp = icmp ugt i32 %lz, 16
182+
ret i1 %cmp
183+
}
184+
172185
define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) {
173186
; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32(
174187
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
@@ -180,47 +193,60 @@ define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) {
180193
ret i1 %cmp
181194
}
182195

183-
define i1 @ctlz_ult_one_i32(i32 %x) {
184-
; CHECK-LABEL: @ctlz_ult_one_i32(
185-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0
186-
; CHECK-NEXT: ret i1 [[CMP]]
196+
define <2 x i1> @ctlz_ult_one_v2i32(<2 x i32> %x) {
197+
; CHECK-LABEL: @ctlz_ult_one_v2i32(
198+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer
199+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
187200
;
188-
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
189-
%cmp = icmp ult i32 %lz, 1
190-
ret i1 %cmp
201+
%lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
202+
%cmp = icmp ult <2 x i32> %lz, <i32 1, i32 1>
203+
ret <2 x i1> %cmp
191204
}
192205

193-
define i1 @ctlz_ult_other_i32(i32 %x) {
194-
; CHECK-LABEL: @ctlz_ult_other_i32(
195-
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
196-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 16
197-
; CHECK-NEXT: ret i1 [[CMP]]
206+
define <2 x i1> @ctlz_ult_other_v2i32(<2 x i32> %x) {
207+
; CHECK-LABEL: @ctlz_ult_other_v2i32(
208+
; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
209+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 16, i32 16>
210+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
198211
;
199-
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
200-
%cmp = icmp ult i32 %lz, 16
201-
ret i1 %cmp
212+
%lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
213+
%cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16>
214+
ret <2 x i1> %cmp
202215
}
203216

204-
define i1 @ctlz_ult_bw_minus_one_i32(i32 %x) {
205-
; CHECK-LABEL: @ctlz_ult_bw_minus_one_i32(
206-
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
207-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 31
208-
; CHECK-NEXT: ret i1 [[CMP]]
217+
define <2 x i1> @ctlz_ult_other_multiuse_v2i32(<2 x i32> %x, <2 x i32>* %p) {
218+
; CHECK-LABEL: @ctlz_ult_other_multiuse_v2i32(
219+
; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
220+
; CHECK-NEXT: store <2 x i32> [[LZ]], <2 x i32>* [[P:%.*]], align 8
221+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 16, i32 16>
222+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
209223
;
210-
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
211-
%cmp = icmp ult i32 %lz, 31
212-
ret i1 %cmp
224+
%lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
225+
store <2 x i32> %lz, <2 x i32>* %p
226+
%cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16>
227+
ret <2 x i1> %cmp
213228
}
214229

215-
define i1 @ctlz_ult_bitwidth_i32(i32 %x) {
216-
; CHECK-LABEL: @ctlz_ult_bitwidth_i32(
217-
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
218-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 32
219-
; CHECK-NEXT: ret i1 [[CMP]]
230+
define <2 x i1> @ctlz_ult_bw_minus_one_v2i32(<2 x i32> %x) {
231+
; CHECK-LABEL: @ctlz_ult_bw_minus_one_v2i32(
232+
; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
233+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 31, i32 31>
234+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
220235
;
221-
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
222-
%cmp = icmp ult i32 %lz, 32
223-
ret i1 %cmp
236+
%lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
237+
%cmp = icmp ult <2 x i32> %lz, <i32 31, i32 31>
238+
ret <2 x i1> %cmp
239+
}
240+
241+
define <2 x i1> @ctlz_ult_bitwidth_v2i32(<2 x i32> %x) {
242+
; CHECK-LABEL: @ctlz_ult_bitwidth_v2i32(
243+
; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false)
244+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], <i32 32, i32 32>
245+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
246+
;
247+
%lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false)
248+
%cmp = icmp ult <2 x i32> %lz, <i32 32, i32 32>
249+
ret <2 x i1> %cmp
224250
}
225251

226252
define i1 @cttz_ne_bitwidth_i33(i33 %x) {
@@ -309,14 +335,14 @@ define <2 x i1> @cttz_ne_other_v2i32(<2 x i32> %a) {
309335

310336
define i1 @cttz_eq_other_i33_multiuse(i33 %x, i33* %p) {
311337
; CHECK-LABEL: @cttz_eq_other_i33_multiuse(
312-
; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
313-
; CHECK-NEXT: store i33 [[LZ]], i33* [[P:%.*]], align 4
314-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[LZ]], 4
338+
; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
339+
; CHECK-NEXT: store i33 [[TZ]], i33* [[P:%.*]], align 4
340+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TZ]], 4
315341
; CHECK-NEXT: ret i1 [[CMP]]
316342
;
317-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
318-
store i33 %lz, i33* %p
319-
%cmp = icmp eq i33 %lz, 4
343+
%tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
344+
store i33 %tz, i33* %p
345+
%cmp = icmp eq i33 %tz, 4
320346
ret i1 %cmp
321347
}
322348

@@ -326,86 +352,111 @@ define i1 @cttz_ugt_zero_i33(i33 %x) {
326352
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
327353
; CHECK-NEXT: ret i1 [[CMP]]
328354
;
329-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
330-
%cmp = icmp ugt i33 %lz, 0
355+
%tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
356+
%cmp = icmp ugt i33 %tz, 0
331357
ret i1 %cmp
332358
}
333359

334360
define i1 @cttz_ugt_one_i33(i33 %x) {
335361
; CHECK-LABEL: @cttz_ugt_one_i33(
336-
; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
337-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 1
362+
; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
363+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 1
338364
; CHECK-NEXT: ret i1 [[CMP]]
339365
;
340-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
341-
%cmp = icmp ugt i33 %lz, 1
366+
%tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
367+
%cmp = icmp ugt i33 %tz, 1
342368
ret i1 %cmp
343369
}
344370

345371
define i1 @cttz_ugt_other_i33(i33 %x) {
346372
; CHECK-LABEL: @cttz_ugt_other_i33(
347-
; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
348-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 16
373+
; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
374+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 16
349375
; CHECK-NEXT: ret i1 [[CMP]]
350376
;
351-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
352-
%cmp = icmp ugt i33 %lz, 16
377+
%tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
378+
%cmp = icmp ugt i33 %tz, 16
353379
ret i1 %cmp
354380
}
355381

356-
define i1 @cttz_ugt_bw_minus_one_i33(i33 %x) {
357-
; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33(
358-
; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
359-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 32
382+
define i1 @cttz_ugt_other_multiuse_i33(i33 %x, i33* %p) {
383+
; CHECK-LABEL: @cttz_ugt_other_multiuse_i33(
384+
; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
385+
; CHECK-NEXT: store i33 [[TZ]], i33* [[P:%.*]], align 4
386+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 16
360387
; CHECK-NEXT: ret i1 [[CMP]]
361388
;
362-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
363-
%cmp = icmp ugt i33 %lz, 32
389+
%tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
390+
store i33 %tz, i33* %p
391+
%cmp = icmp ugt i33 %tz, 16
364392
ret i1 %cmp
365393
}
366394

367-
define i1 @cttz_ult_one_i33(i33 %x) {
368-
; CHECK-LABEL: @cttz_ult_one_i33(
369-
; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 1
370-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0
395+
define i1 @cttz_ugt_bw_minus_one_i33(i33 %x) {
396+
; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33(
397+
; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
398+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 32
371399
; CHECK-NEXT: ret i1 [[CMP]]
372400
;
373-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
374-
%cmp = icmp ult i33 %lz, 1
401+
%tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
402+
%cmp = icmp ugt i33 %tz, 32
375403
ret i1 %cmp
376404
}
377405

378-
define i1 @cttz_ult_other_i33(i33 %x) {
379-
; CHECK-LABEL: @cttz_ult_other_i33(
380-
; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
381-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 16
382-
; CHECK-NEXT: ret i1 [[CMP]]
406+
define <2 x i1> @cttz_ult_one_v2i32(<2 x i32> %x) {
407+
; CHECK-LABEL: @cttz_ult_one_v2i32(
408+
; CHECK-NEXT: [[CMP:%.*]] = trunc <2 x i32> [[X:%.*]] to <2 x i1>
409+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
383410
;
384-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
385-
%cmp = icmp ult i33 %lz, 16
386-
ret i1 %cmp
411+
%tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
412+
%cmp = icmp ult <2 x i32> %tz, <i32 1, i32 1>
413+
ret <2 x i1> %cmp
387414
}
388415

389-
define i1 @cttz_ult_bw_minus_one_i33(i33 %x) {
390-
; CHECK-LABEL: @cttz_ult_bw_minus_one_i33(
391-
; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
392-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 32
393-
; CHECK-NEXT: ret i1 [[CMP]]
416+
define <2 x i1> @cttz_ult_other_v2i32(<2 x i32> %x) {
417+
; CHECK-LABEL: @cttz_ult_other_v2i32(
418+
; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
419+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 16, i32 16>
420+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
394421
;
395-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
396-
%cmp = icmp ult i33 %lz, 32
397-
ret i1 %cmp
422+
%tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
423+
%cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16>
424+
ret <2 x i1> %cmp
398425
}
399426

400-
define i1 @cttz_ult_bitwidth_i33(i33 %x) {
401-
; CHECK-LABEL: @cttz_ult_bitwidth_i33(
402-
; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
403-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 33
404-
; CHECK-NEXT: ret i1 [[CMP]]
427+
define <2 x i1> @cttz_ult_other_multiuse_v2i32(<2 x i32> %x, <2 x i32>* %p) {
428+
; CHECK-LABEL: @cttz_ult_other_multiuse_v2i32(
429+
; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
430+
; CHECK-NEXT: store <2 x i32> [[TZ]], <2 x i32>* [[P:%.*]], align 8
431+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 16, i32 16>
432+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
405433
;
406-
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
407-
%cmp = icmp ult i33 %lz, 33
408-
ret i1 %cmp
434+
%tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
435+
store <2 x i32> %tz, <2 x i32>* %p
436+
%cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16>
437+
ret <2 x i1> %cmp
438+
}
439+
440+
define <2 x i1> @cttz_ult_bw_minus_one_v2i32(<2 x i32> %x) {
441+
; CHECK-LABEL: @cttz_ult_bw_minus_one_v2i32(
442+
; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
443+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 31, i32 31>
444+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
445+
;
446+
%tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
447+
%cmp = icmp ult <2 x i32> %tz, <i32 31, i32 31>
448+
ret <2 x i1> %cmp
449+
}
450+
451+
define <2 x i1> @cttz_ult_bitwidth_v2i32(<2 x i32> %x) {
452+
; CHECK-LABEL: @cttz_ult_bitwidth_v2i32(
453+
; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
454+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 32, i32 32>
455+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
456+
;
457+
%tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)
458+
%cmp = icmp ult <2 x i32> %tz, <i32 32, i32 32>
459+
ret <2 x i1> %cmp
409460
}
410461

411462
define i1 @ctpop_eq_zero_i11(i11 %x) {

0 commit comments

Comments
 (0)