Skip to content

Commit b466804

Browse files
committed
[InstCombine] Add cttz/ctlz + icmp ugt/ult tests; NFC
llvm-svn: 350468
1 parent e8775ad commit b466804

File tree

1 file changed

+174
-0
lines changed

1 file changed

+174
-0
lines changed

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

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,92 @@ define <2 x i1> @ctlz_ne_bitwidth_v2i32(<2 x i32> %a) {
137137
ret <2 x i1> %cmp
138138
}
139139

140+
define i1 @ctlz_ugt_zero_i32(i32 %x) {
141+
; CHECK-LABEL: @ctlz_ugt_zero_i32(
142+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1
143+
; CHECK-NEXT: ret i1 [[CMP]]
144+
;
145+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
146+
%cmp = icmp ugt i32 %lz, 0
147+
ret i1 %cmp
148+
}
149+
150+
define i1 @ctlz_ugt_one_i32(i32 %x) {
151+
; CHECK-LABEL: @ctlz_ugt_one_i32(
152+
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
153+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 1
154+
; CHECK-NEXT: ret i1 [[CMP]]
155+
;
156+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
157+
%cmp = icmp ugt i32 %lz, 1
158+
ret i1 %cmp
159+
}
160+
161+
define i1 @ctlz_ugt_other_i32(i32 %x) {
162+
; CHECK-LABEL: @ctlz_ugt_other_i32(
163+
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
164+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 16
165+
; CHECK-NEXT: ret i1 [[CMP]]
166+
;
167+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
168+
%cmp = icmp ugt i32 %lz, 16
169+
ret i1 %cmp
170+
}
171+
172+
define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) {
173+
; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32(
174+
; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
175+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 31
176+
; CHECK-NEXT: ret i1 [[CMP]]
177+
;
178+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
179+
%cmp = icmp ugt i32 %lz, 31
180+
ret i1 %cmp
181+
}
182+
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]]
187+
;
188+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
189+
%cmp = icmp ult i32 %lz, 1
190+
ret i1 %cmp
191+
}
192+
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]]
198+
;
199+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
200+
%cmp = icmp ult i32 %lz, 16
201+
ret i1 %cmp
202+
}
203+
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]]
209+
;
210+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
211+
%cmp = icmp ult i32 %lz, 31
212+
ret i1 %cmp
213+
}
214+
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]]
220+
;
221+
%lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false)
222+
%cmp = icmp ult i32 %lz, 32
223+
ret i1 %cmp
224+
}
225+
140226
define i1 @cttz_ne_bitwidth_i33(i33 %x) {
141227
; CHECK-LABEL: @cttz_ne_bitwidth_i33(
142228
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[X:%.*]], 0
@@ -234,6 +320,94 @@ define i1 @cttz_eq_other_i33_multiuse(i33 %x, i33* %p) {
234320
ret i1 %cmp
235321
}
236322

323+
define i1 @cttz_ugt_zero_i33(i33 %x) {
324+
; CHECK-LABEL: @cttz_ugt_zero_i33(
325+
; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 1
326+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0
327+
; CHECK-NEXT: ret i1 [[CMP]]
328+
;
329+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
330+
%cmp = icmp ugt i33 %lz, 0
331+
ret i1 %cmp
332+
}
333+
334+
define i1 @cttz_ugt_one_i33(i33 %x) {
335+
; 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
338+
; CHECK-NEXT: ret i1 [[CMP]]
339+
;
340+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
341+
%cmp = icmp ugt i33 %lz, 1
342+
ret i1 %cmp
343+
}
344+
345+
define i1 @cttz_ugt_other_i33(i33 %x) {
346+
; 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
349+
; CHECK-NEXT: ret i1 [[CMP]]
350+
;
351+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
352+
%cmp = icmp ugt i33 %lz, 16
353+
ret i1 %cmp
354+
}
355+
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
360+
; CHECK-NEXT: ret i1 [[CMP]]
361+
;
362+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
363+
%cmp = icmp ugt i33 %lz, 32
364+
ret i1 %cmp
365+
}
366+
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
371+
; CHECK-NEXT: ret i1 [[CMP]]
372+
;
373+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
374+
%cmp = icmp ult i33 %lz, 1
375+
ret i1 %cmp
376+
}
377+
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]]
383+
;
384+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
385+
%cmp = icmp ult i33 %lz, 16
386+
ret i1 %cmp
387+
}
388+
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]]
394+
;
395+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
396+
%cmp = icmp ult i33 %lz, 32
397+
ret i1 %cmp
398+
}
399+
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]]
405+
;
406+
%lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
407+
%cmp = icmp ult i33 %lz, 33
408+
ret i1 %cmp
409+
}
410+
237411
define i1 @ctpop_eq_zero_i11(i11 %x) {
238412
; CHECK-LABEL: @ctpop_eq_zero_i11(
239413
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0

0 commit comments

Comments
 (0)