@@ -186,6 +186,7 @@ define i32 @ashr_xor(i32 %x, i32 %py) {
186186 ret i32 %sh1
187187}
188188
189+
189190define i32 @shr_mismatch_xor (i32 %x , i32 %y ) {
190191; CHECK-LABEL: @shr_mismatch_xor(
191192; CHECK-NEXT: [[SH0:%.*]] = ashr i32 [[X:%.*]], 5
@@ -546,3 +547,104 @@ define <2 x i64> @lshr_sub_poison(<2 x i64> %x, <2 x i64> %py) {
546547 %sh1 = lshr <2 x i64 > %r , <i64 7 , i64 poison>
547548 ret <2 x i64 > %sh1
548549}
550+
551+ define i32 @ashr_xor_operand_match (i32 %x , i32 %y ) {
552+ ; CHECK-LABEL: @ashr_xor_operand_match(
553+ ; CHECK-NEXT: [[R:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
554+ ; CHECK-NEXT: [[RET:%.*]] = ashr i32 [[R]], [[X]]
555+ ; CHECK-NEXT: ret i32 [[RET]]
556+ ;
557+ %r = xor i32 %x , %y
558+ %ret = ashr i32 %r , %x
559+ ret i32 %ret
560+ }
561+
562+ define i32 @ashr_xor_operand_mismtach (i32 %x , i32 %y ) {
563+ ; CHECK-LABEL: @ashr_xor_operand_mismtach(
564+ ; CHECK-NEXT: [[R:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
565+ ; CHECK-NEXT: [[RET:%.*]] = ashr i32 [[R]], [[Y]]
566+ ; CHECK-NEXT: ret i32 [[RET]]
567+ ;
568+ %r = xor i32 %x , %y
569+ %ret = ashr i32 %r , %y
570+ ret i32 %ret
571+ }
572+
573+ define i32 @lshr_xor_operand_match (i32 %x , i32 %y ) {
574+ ; CHECK-LABEL: @lshr_xor_operand_match(
575+ ; CHECK-NEXT: [[R:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
576+ ; CHECK-NEXT: [[RET:%.*]] = lshr i32 [[R]], [[X]]
577+ ; CHECK-NEXT: ret i32 [[RET]]
578+ ;
579+ %r = xor i32 %x , %y
580+ %ret = lshr i32 %r , %x
581+ ret i32 %ret
582+ }
583+
584+ define i32 @lshr_xor_operand_mismtach (i32 %x , i32 %y ) {
585+ ; CHECK-LABEL: @lshr_xor_operand_mismtach(
586+ ; CHECK-NEXT: [[R:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
587+ ; CHECK-NEXT: [[RET:%.*]] = lshr i32 [[R]], [[Y]]
588+ ; CHECK-NEXT: ret i32 [[RET]]
589+ ;
590+ %r = xor i32 %x , %y
591+ %ret = lshr i32 %r , %y
592+ ret i32 %ret
593+ }
594+
595+ define i32 @ashr_or_operand_match (i32 %x , i32 %y ) {
596+ ; CHECK-LABEL: @ashr_or_operand_match(
597+ ; CHECK-NEXT: [[R:%.*]] = or i32 [[X:%.*]], [[Y:%.*]]
598+ ; CHECK-NEXT: [[RET:%.*]] = ashr i32 [[R]], [[X]]
599+ ; CHECK-NEXT: ret i32 [[RET]]
600+ ;
601+ %r = or i32 %x , %y
602+ %ret = ashr i32 %r , %x
603+ ret i32 %ret
604+ }
605+
606+ define i32 @ashr_or_operand_mismtach (i32 %x , i32 %y ) {
607+ ; CHECK-LABEL: @ashr_or_operand_mismtach(
608+ ; CHECK-NEXT: [[R:%.*]] = or i32 [[X:%.*]], [[Y:%.*]]
609+ ; CHECK-NEXT: [[RET:%.*]] = ashr i32 [[R]], [[Y]]
610+ ; CHECK-NEXT: ret i32 [[RET]]
611+ ;
612+ %r = or i32 %x , %y
613+ %ret = ashr i32 %r , %y
614+ ret i32 %ret
615+ }
616+
617+ define i32 @lshr_or_operand_match (i32 %x , i32 %y ) {
618+ ; CHECK-LABEL: @lshr_or_operand_match(
619+ ; CHECK-NEXT: [[R:%.*]] = or i32 [[X:%.*]], [[Y:%.*]]
620+ ; CHECK-NEXT: [[RET:%.*]] = lshr i32 [[R]], [[X]]
621+ ; CHECK-NEXT: ret i32 [[RET]]
622+ ;
623+ %r = or i32 %x , %y
624+ %ret = lshr i32 %r , %x
625+ ret i32 %ret
626+ }
627+
628+ define i32 @lshr_or_operand_mismtach (i32 %x , i32 %y ) {
629+ ; CHECK-LABEL: @lshr_or_operand_mismtach(
630+ ; CHECK-NEXT: [[R:%.*]] = or i32 [[X:%.*]], [[Y:%.*]]
631+ ; CHECK-NEXT: [[RET:%.*]] = lshr i32 [[R]], [[Y]]
632+ ; CHECK-NEXT: ret i32 [[RET]]
633+ ;
634+ %r = or i32 %x , %y
635+ %ret = lshr i32 %r , %y
636+ ret i32 %ret
637+ }
638+
639+ define i32 @ashr_xor_operand_match_multiuse (i32 %x , i32 %y ) {
640+ ; CHECK-LABEL: @ashr_xor_operand_match_multiuse(
641+ ; CHECK-NEXT: [[R:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
642+ ; CHECK-NEXT: [[Q:%.*]] = ashr i32 [[R]], [[X]]
643+ ; CHECK-NEXT: [[RET:%.*]] = xor i32 [[R]], [[Q]]
644+ ; CHECK-NEXT: ret i32 [[RET]]
645+ ;
646+ %r = xor i32 %x , %y
647+ %q = ashr i32 %r , %x
648+ %ret = xor i32 %r , %q
649+ ret i32 %ret
650+ }
0 commit comments