Skip to content

Commit ab42341

Browse files
committed
[InstCombine] Add tests for folding (ct{t,l}z Pow2); NFC
1 parent 4f4e2ab commit ab42341

File tree

1 file changed

+73
-0
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+73
-0
lines changed

llvm/test/Transforms/InstCombine/cttz.ll

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,76 @@ define i16 @cttz_assume(i16 %x) {
297297
%cttz = call i16 @llvm.cttz.i16(i16 %x, i1 false)
298298
ret i16 %cttz
299299
}
300+
301+
302+
declare void @use.i8(i8)
303+
define i8 @fold_ctz_log2(i8 %x) {
304+
; CHECK-LABEL: @fold_ctz_log2(
305+
; CHECK-NEXT: [[P2:%.*]] = shl nuw i8 1, [[X:%.*]]
306+
; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umin.i8(i8 [[P2]], i8 32)
307+
; CHECK-NEXT: [[R:%.*]] = call range(i8 0, 9) i8 @llvm.cttz.i8(i8 [[V]], i1 true)
308+
; CHECK-NEXT: ret i8 [[R]]
309+
;
310+
%p2 = shl i8 1, %x
311+
%v = call i8 @llvm.umin(i8 %p2, i8 32)
312+
%r = call i8 @llvm.cttz(i8 %v, i1 false)
313+
ret i8 %r
314+
}
315+
316+
define i8 @fold_ctz_log2_maybe_z(i8 %x, i8 %y, i1 %c) {
317+
; CHECK-LABEL: @fold_ctz_log2_maybe_z(
318+
; CHECK-NEXT: [[V:%.*]] = shl i8 2, [[V_V:%.*]]
319+
; CHECK-NEXT: [[P2_2:%.*]] = shl i8 4, [[Y:%.*]]
320+
; CHECK-NEXT: [[V1:%.*]] = select i1 [[C:%.*]], i8 [[V]], i8 [[P2_2]]
321+
; CHECK-NEXT: [[R:%.*]] = call range(i8 1, 9) i8 @llvm.cttz.i8(i8 [[V1]], i1 false)
322+
; CHECK-NEXT: ret i8 [[R]]
323+
;
324+
%p2 = shl i8 2, %x
325+
%p2_2 = shl i8 4, %y
326+
%v = select i1 %c, i8 %p2, i8 %p2_2
327+
%r = call i8 @llvm.cttz(i8 %v, i1 false)
328+
ret i8 %r
329+
}
330+
331+
define i8 @fold_ctz_log2_maybe_z_okay(i8 %x, i8 %y, i1 %c) {
332+
; CHECK-LABEL: @fold_ctz_log2_maybe_z_okay(
333+
; CHECK-NEXT: [[X:%.*]] = shl i8 2, [[X1:%.*]]
334+
; CHECK-NEXT: [[Y:%.*]] = shl i8 4, [[Y1:%.*]]
335+
; CHECK-NEXT: [[V_V:%.*]] = select i1 [[C:%.*]], i8 [[X]], i8 [[Y]]
336+
; CHECK-NEXT: [[R:%.*]] = call range(i8 1, 9) i8 @llvm.cttz.i8(i8 [[V_V]], i1 true)
337+
; CHECK-NEXT: ret i8 [[R]]
338+
;
339+
%p2 = shl i8 2, %x
340+
%p2_2 = shl i8 4, %y
341+
%v = select i1 %c, i8 %p2, i8 %p2_2
342+
%r = call i8 @llvm.cttz(i8 %v, i1 true)
343+
ret i8 %r
344+
}
345+
346+
define i8 @fold_clz_log2(i8 %x) {
347+
; CHECK-LABEL: @fold_clz_log2(
348+
; CHECK-NEXT: [[P2:%.*]] = shl nuw i8 1, [[X:%.*]]
349+
; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umin.i8(i8 [[P2]], i8 32)
350+
; CHECK-NEXT: [[R:%.*]] = call range(i8 2, 9) i8 @llvm.ctlz.i8(i8 [[V]], i1 true)
351+
; CHECK-NEXT: ret i8 [[R]]
352+
;
353+
%p2 = shl i8 1, %x
354+
%v = call i8 @llvm.umin(i8 %p2, i8 32)
355+
%r = call i8 @llvm.ctlz(i8 %v, i1 false)
356+
ret i8 %r
357+
}
358+
359+
define i8 @fold_clz_log2_fail_multi_use(i8 %x) {
360+
; CHECK-LABEL: @fold_clz_log2_fail_multi_use(
361+
; CHECK-NEXT: [[P2:%.*]] = shl nuw i8 1, [[X:%.*]]
362+
; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umin.i8(i8 [[P2]], i8 32)
363+
; CHECK-NEXT: [[R:%.*]] = call range(i8 2, 9) i8 @llvm.ctlz.i8(i8 [[V]], i1 true)
364+
; CHECK-NEXT: call void @use.i8(i8 [[R]])
365+
; CHECK-NEXT: ret i8 [[R]]
366+
;
367+
%p2 = shl i8 1, %x
368+
%v = call i8 @llvm.umin(i8 %p2, i8 32)
369+
%r = call i8 @llvm.ctlz(i8 %v, i1 false)
370+
call void @use.i8(i8 %r)
371+
ret i8 %r
372+
}

0 commit comments

Comments
 (0)