@@ -729,6 +729,44 @@ define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
729729 ret i8 %sext
730730}
731731
732+ ; Make sure we don't use seqz+th.ext instead of snez+addi
733+ define signext i32 @sexti1_i32_setcc_2 (i32 signext %a , i32 signext %b ) {
734+ ; RV64I-LABEL: sexti1_i32_setcc_2:
735+ ; RV64I: # %bb.0:
736+ ; RV64I-NEXT: xor a0, a0, a1
737+ ; RV64I-NEXT: snez a0, a0
738+ ; RV64I-NEXT: addi a0, a0, -1
739+ ; RV64I-NEXT: ret
740+ ;
741+ ; RV64XTHEADBB-LABEL: sexti1_i32_setcc_2:
742+ ; RV64XTHEADBB: # %bb.0:
743+ ; RV64XTHEADBB-NEXT: xor a0, a0, a1
744+ ; RV64XTHEADBB-NEXT: snez a0, a0
745+ ; RV64XTHEADBB-NEXT: addi a0, a0, -1
746+ ; RV64XTHEADBB-NEXT: ret
747+ %icmp = icmp eq i32 %a , %b
748+ %sext = sext i1 %icmp to i32
749+ ret i32 %sext
750+ }
751+
752+ ; Make sure we don't use th.ext instead of neg.
753+ define signext i32 @sexti1_i32_setcc_3 (i32 signext %a , i32 signext %b ) {
754+ ; RV64I-LABEL: sexti1_i32_setcc_3:
755+ ; RV64I: # %bb.0:
756+ ; RV64I-NEXT: slt a0, a0, a1
757+ ; RV64I-NEXT: neg a0, a0
758+ ; RV64I-NEXT: ret
759+ ;
760+ ; RV64XTHEADBB-LABEL: sexti1_i32_setcc_3:
761+ ; RV64XTHEADBB: # %bb.0:
762+ ; RV64XTHEADBB-NEXT: slt a0, a0, a1
763+ ; RV64XTHEADBB-NEXT: neg a0, a0
764+ ; RV64XTHEADBB-NEXT: ret
765+ %icmp = icmp slt i32 %a , %b
766+ %sext = sext i1 %icmp to i32
767+ ret i32 %sext
768+ }
769+
732770define i64 @sexti1_i64 (i64 %a ) nounwind {
733771; RV64I-LABEL: sexti1_i64:
734772; RV64I: # %bb.0:
@@ -780,6 +818,44 @@ define zeroext i8 @sexti1_i64_setcc(i64 %a) {
780818 ret i8 %sext
781819}
782820
821+ ; Make sure we don't use seqz+th.ext instead of snez+addi
822+ define i64 @sexti1_i64_setcc_2 (i64 %a , i64 %b ) {
823+ ; RV64I-LABEL: sexti1_i64_setcc_2:
824+ ; RV64I: # %bb.0:
825+ ; RV64I-NEXT: xor a0, a0, a1
826+ ; RV64I-NEXT: snez a0, a0
827+ ; RV64I-NEXT: addi a0, a0, -1
828+ ; RV64I-NEXT: ret
829+ ;
830+ ; RV64XTHEADBB-LABEL: sexti1_i64_setcc_2:
831+ ; RV64XTHEADBB: # %bb.0:
832+ ; RV64XTHEADBB-NEXT: xor a0, a0, a1
833+ ; RV64XTHEADBB-NEXT: snez a0, a0
834+ ; RV64XTHEADBB-NEXT: addi a0, a0, -1
835+ ; RV64XTHEADBB-NEXT: ret
836+ %icmp = icmp eq i64 %a , %b
837+ %sext = sext i1 %icmp to i64
838+ ret i64 %sext
839+ }
840+
841+ ; Make sure we don't use th.ext instead of neg.
842+ define i64 @sexti1_i64_setcc_3 (i64 %a , i64 %b ) {
843+ ; RV64I-LABEL: sexti1_i64_setcc_3:
844+ ; RV64I: # %bb.0:
845+ ; RV64I-NEXT: slt a0, a0, a1
846+ ; RV64I-NEXT: neg a0, a0
847+ ; RV64I-NEXT: ret
848+ ;
849+ ; RV64XTHEADBB-LABEL: sexti1_i64_setcc_3:
850+ ; RV64XTHEADBB: # %bb.0:
851+ ; RV64XTHEADBB-NEXT: slt a0, a0, a1
852+ ; RV64XTHEADBB-NEXT: neg a0, a0
853+ ; RV64XTHEADBB-NEXT: ret
854+ %icmp = icmp slt i64 %a , %b
855+ %sext = sext i1 %icmp to i64
856+ ret i64 %sext
857+ }
858+
783859define signext i32 @sextb_i32 (i32 signext %a ) nounwind {
784860; RV64I-LABEL: sextb_i32:
785861; RV64I: # %bb.0:
0 commit comments