@@ -409,3 +409,122 @@ define i1 @PR38139(i8 %arg) {
409409 %r = icmp ne i8 %masked , %arg
410410 ret i1 %r
411411}
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