@@ -409,3 +409,122 @@ define i1 @PR38139(i8 %arg) {
409
409
%r = icmp ne i8 %masked , %arg
410
410
ret i1 %r
411
411
}
412
+
413
+ define i1 @remove_shift_nuw_ab (i8 %a , i8 %b , i8 %s ) {
414
+ ; CHECK-LABEL: @remove_shift_nuw_ab(
415
+ ; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
416
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
417
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
418
+ ; CHECK-NEXT: ret i1 [[IC]]
419
+ ;
420
+ %t = shl nuw i8 %a , %s
421
+ %or = or i8 %t , %b
422
+ %ic = icmp eq i8 %or , 0
423
+ ret i1 %ic
424
+ }
425
+
426
+ define i1 @remove_shift_nuw_ba (i8 %a , i8 %b , i8 %s ) {
427
+ ; CHECK-LABEL: @remove_shift_nuw_ba(
428
+ ; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
429
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[B:%.*]], [[T]]
430
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
431
+ ; CHECK-NEXT: ret i1 [[IC]]
432
+ ;
433
+ %t = shl nuw i8 %a , %s
434
+ %or = or i8 %b , %t
435
+ %ic = icmp eq i8 %or , 0
436
+ ret i1 %ic
437
+ }
438
+
439
+ define i1 @remove_shift_nsw (i8 %a , i8 %b , i8 %s ) {
440
+ ; CHECK-LABEL: @remove_shift_nsw(
441
+ ; CHECK-NEXT: [[T:%.*]] = shl nsw i8 [[A:%.*]], [[S:%.*]]
442
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
443
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
444
+ ; CHECK-NEXT: ret i1 [[IC]]
445
+ ;
446
+ %t = shl nsw i8 %a , %s
447
+ %or = or i8 %t , %b
448
+ %ic = icmp eq i8 %or , 0
449
+ ret i1 %ic
450
+ }
451
+
452
+ define i1 @remove_shift_nuw_ne (i8 %a , i8 %b , i8 %s ) {
453
+ ; CHECK-LABEL: @remove_shift_nuw_ne(
454
+ ; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
455
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
456
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
457
+ ; CHECK-NEXT: ret i1 [[IC]]
458
+ ;
459
+ %t = shl nuw i8 %a , %s
460
+ %or = or i8 %t , %b
461
+ %ic = icmp eq i8 %or , 0
462
+ ret i1 %ic
463
+ }
464
+
465
+ define i1 @remove_shift_nsw_ne (i8 %a , i8 %b , i8 %s ) {
466
+ ; CHECK-LABEL: @remove_shift_nsw_ne(
467
+ ; CHECK-NEXT: [[T:%.*]] = shl nsw i8 [[A:%.*]], [[S:%.*]]
468
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
469
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
470
+ ; CHECK-NEXT: ret i1 [[IC]]
471
+ ;
472
+ %t = shl nsw i8 %a , %s
473
+ %or = or i8 %t , %b
474
+ %ic = icmp eq i8 %or , 0
475
+ ret i1 %ic
476
+ }
477
+
478
+ define i1 @remove_shift_wraps (i8 %a , i8 %b , i8 %s ) {
479
+ ; CHECK-LABEL: @remove_shift_wraps(
480
+ ; CHECK-NEXT: [[T:%.*]] = shl i8 [[A:%.*]], [[S:%.*]]
481
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
482
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
483
+ ; CHECK-NEXT: ret i1 [[IC]]
484
+ ;
485
+ %t = shl i8 %a , %s
486
+ %or = or i8 %t , %b
487
+ %ic = icmp eq i8 %or , 0
488
+ ret i1 %ic
489
+ }
490
+
491
+ define i1 @remove_shift_chain_d (i8 %a , i8 %b , i8 %c , i8 %d , i8 %s ) {
492
+ ; CHECK-LABEL: @remove_shift_chain_d(
493
+ ; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S:%.*]]
494
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[A:%.*]], [[B:%.*]]
495
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[C:%.*]], [[DT]]
496
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]
497
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
498
+ ; CHECK-NEXT: ret i1 [[IC]]
499
+ ;
500
+ %dt = shl nuw i8 %d , %s
501
+ %or1 = or i8 %a , %b
502
+ %or2 = or i8 %c , %dt
503
+ %or = or i8 %or1 , %or2
504
+ %ic = icmp eq i8 %or , 0
505
+ ret i1 %ic
506
+ }
507
+
508
+ define i1 @remove_shift_chain_abcd (i8 %a , i8 %b , i8 %c , i8 %d , i8 %s ) {
509
+ ; CHECK-LABEL: @remove_shift_chain_abcd(
510
+ ; CHECK-NEXT: [[AT:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
511
+ ; CHECK-NEXT: [[BT:%.*]] = shl nuw i8 [[B:%.*]], 2
512
+ ; CHECK-NEXT: [[CT:%.*]] = shl nuw i8 [[C:%.*]], 1
513
+ ; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S]]
514
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AT]], [[BT]]
515
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[DT]]
516
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]
517
+ ; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
518
+ ; CHECK-NEXT: ret i1 [[IC]]
519
+ ;
520
+ %at = shl nuw i8 %a , %s
521
+ %bt = shl nuw i8 %b , 2
522
+ %ct = shl nuw i8 %c , 1
523
+ %dt = shl nuw i8 %d , %s
524
+ %or1 = or i8 %at , %bt
525
+ %or2 = or i8 %ct , %dt
526
+ %or = or i8 %or1 , %or2
527
+ %ic = icmp eq i8 %or , 0
528
+ ret i1 %ic
529
+ }
530
+
0 commit comments