@@ -297,3 +297,76 @@ define i16 @cttz_assume(i16 %x) {
297
297
%cttz = call i16 @llvm.cttz.i16 (i16 %x , i1 false )
298
298
ret i16 %cttz
299
299
}
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