@@ -297,3 +297,96 @@ 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: [[R:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 5)
306+ ; CHECK-NEXT: ret i8 [[R]]
307+ ;
308+ %p2 = shl i8 1 , %x
309+ %v = call i8 @llvm.umin (i8 %p2 , i8 32 )
310+ %r = call i8 @llvm.cttz (i8 %v , i1 false )
311+ ret i8 %r
312+ }
313+
314+ define i9 @fold_ctz_log2_i9_okay (i9 %x ) {
315+ ; CHECK-LABEL: @fold_ctz_log2_i9_okay(
316+ ; CHECK-NEXT: [[R:%.*]] = call i9 @llvm.umin.i9(i9 [[X:%.*]], i9 5)
317+ ; CHECK-NEXT: ret i9 [[R]]
318+ ;
319+ %p2 = shl i9 1 , %x
320+ %v = call i9 @llvm.umin (i9 %p2 , i9 32 )
321+ %r = call i9 @llvm.cttz (i9 %v , i1 false )
322+ ret i9 %r
323+ }
324+
325+ define i8 @fold_ctz_log2_maybe_z (i8 %x , i8 %y , i1 %c ) {
326+ ; CHECK-LABEL: @fold_ctz_log2_maybe_z(
327+ ; CHECK-NEXT: [[V:%.*]] = shl i8 2, [[V_V:%.*]]
328+ ; CHECK-NEXT: [[P2_2:%.*]] = shl i8 4, [[Y:%.*]]
329+ ; CHECK-NEXT: [[V1:%.*]] = select i1 [[C:%.*]], i8 [[V]], i8 [[P2_2]]
330+ ; CHECK-NEXT: [[R:%.*]] = call range(i8 1, 9) i8 @llvm.cttz.i8(i8 [[V1]], i1 false)
331+ ; CHECK-NEXT: ret i8 [[R]]
332+ ;
333+ %p2 = shl i8 2 , %x
334+ %p2_2 = shl i8 4 , %y
335+ %v = select i1 %c , i8 %p2 , i8 %p2_2
336+ %r = call i8 @llvm.cttz (i8 %v , i1 false )
337+ ret i8 %r
338+ }
339+
340+ define i8 @fold_ctz_log2_maybe_z_okay (i8 %x , i8 %y , i1 %c ) {
341+ ; CHECK-LABEL: @fold_ctz_log2_maybe_z_okay(
342+ ; CHECK-NEXT: [[X:%.*]] = add i8 [[X1:%.*]], 1
343+ ; CHECK-NEXT: [[Y:%.*]] = add i8 [[Y1:%.*]], 2
344+ ; CHECK-NEXT: [[V_V:%.*]] = select i1 [[C:%.*]], i8 [[X]], i8 [[Y]]
345+ ; CHECK-NEXT: ret i8 [[V_V]]
346+ ;
347+ %p2 = shl i8 2 , %x
348+ %p2_2 = shl i8 4 , %y
349+ %v = select i1 %c , i8 %p2 , i8 %p2_2
350+ %r = call i8 @llvm.cttz (i8 %v , i1 true )
351+ ret i8 %r
352+ }
353+
354+ define i8 @fold_clz_log2 (i8 %x ) {
355+ ; CHECK-LABEL: @fold_clz_log2(
356+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 5)
357+ ; CHECK-NEXT: [[R:%.*]] = xor i8 [[TMP1]], 7
358+ ; CHECK-NEXT: ret i8 [[R]]
359+ ;
360+ %p2 = shl i8 1 , %x
361+ %v = call i8 @llvm.umin (i8 %p2 , i8 32 )
362+ %r = call i8 @llvm.ctlz (i8 %v , i1 false )
363+ ret i8 %r
364+ }
365+
366+ define i8 @fold_clz_log2_multiuse_fail (i8 %x ) {
367+ ; CHECK-LABEL: @fold_clz_log2_multiuse_fail(
368+ ; CHECK-NEXT: [[P2:%.*]] = shl nuw i8 2, [[X:%.*]]
369+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umin.i8(i8 [[P2]], i8 32)
370+ ; CHECK-NEXT: call void @use.i8(i8 [[V]])
371+ ; CHECK-NEXT: [[R:%.*]] = call range(i8 2, 9) i8 @llvm.ctlz.i8(i8 [[V]], i1 true)
372+ ; CHECK-NEXT: ret i8 [[R]]
373+ ;
374+ %p2 = shl nuw i8 2 , %x
375+ %v = call i8 @llvm.umin (i8 %p2 , i8 32 )
376+ call void @use.i8 (i8 %v )
377+ %r = call i8 @llvm.ctlz (i8 %v , i1 true )
378+ ret i8 %r
379+ }
380+
381+
382+ define i9 @fold_clz_log2_i9 (i9 %x ) {
383+ ; CHECK-LABEL: @fold_clz_log2_i9(
384+ ; CHECK-NEXT: [[TMP1:%.*]] = call i9 @llvm.umin.i9(i9 [[X:%.*]], i9 5)
385+ ; CHECK-NEXT: [[R:%.*]] = sub nuw nsw i9 8, [[TMP1]]
386+ ; CHECK-NEXT: ret i9 [[R]]
387+ ;
388+ %p2 = shl i9 1 , %x
389+ %v = call i9 @llvm.umin (i9 %p2 , i9 32 )
390+ %r = call i9 @llvm.ctlz (i9 %v , i1 true )
391+ ret i9 %r
392+ }
0 commit comments