@@ -747,3 +747,47 @@ define i8 @scmp_from_select_eq_and_gt_neg3(i32 %x, i32 %y) {
747747 %r = select i1 %eq , i8 0 , i8 %sel1
748748 ret i8 %r
749749}
750+
751+ define i32 @scmp_ashr (i32 %a ) {
752+ ; CHECK-LABEL: define i32 @scmp_ashr(
753+ ; CHECK-SAME: i32 [[A:%.*]]) {
754+ ; CHECK-NEXT: [[A_LOBIT:%.*]] = ashr i32 [[A]], 31
755+ ; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt i32 [[A]], 1
756+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP_INV]], i32 [[A_LOBIT]], i32 1
757+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
758+ ;
759+ %a.lobit = ashr i32 %a , 31
760+ %cmp.inv = icmp slt i32 %a , 1
761+ %retval.0 = select i1 %cmp.inv , i32 %a.lobit , i32 1
762+ ret i32 %retval.0
763+ }
764+
765+ ; Test the new SGT pattern: select (icmp sgt X, 0), 1, ashr X, bitwidth-1 -> scmp(X, 0)
766+ define i8 @scmp_ashr_sgt_pattern (i8 %a ) {
767+ ; CHECK-LABEL: define i8 @scmp_ashr_sgt_pattern(
768+ ; CHECK-SAME: i8 [[A:%.*]]) {
769+ ; CHECK-NEXT: [[A_LOBIT:%.*]] = ashr i8 [[A]], 7
770+ ; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt i8 [[A]], 1
771+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP_INV]], i8 [[A_LOBIT]], i8 1
772+ ; CHECK-NEXT: ret i8 [[R]]
773+ ;
774+ %a.lobit = ashr i8 %a , 7
775+ %cmp = icmp sgt i8 %a , 0
776+ %retval = select i1 %cmp , i8 1 , i8 %a.lobit
777+ ret i8 %retval
778+ }
779+
780+ ; Test the SLT pattern: select (icmp slt X, 1), ashr X, bitwidth-1, 1 -> scmp(X, 0)
781+ define i8 @scmp_ashr_slt_pattern (i8 %a ) {
782+ ; CHECK-LABEL: define i8 @scmp_ashr_slt_pattern(
783+ ; CHECK-SAME: i8 [[A:%.*]]) {
784+ ; CHECK-NEXT: [[A_LOBIT:%.*]] = ashr i8 [[A]], 7
785+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[A]], 1
786+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP]], i8 [[A_LOBIT]], i8 1
787+ ; CHECK-NEXT: ret i8 [[R]]
788+ ;
789+ %a.lobit = ashr i8 %a , 7
790+ %cmp = icmp slt i8 %a , 1
791+ %retval = select i1 %cmp , i8 %a.lobit , i8 1
792+ ret i8 %retval
793+ }
0 commit comments