@@ -655,6 +655,44 @@ define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {
655655 ret i8 %sext
656656}
657657
658+ ; Make sure we don't use seqz+th.ext instead of snez+addi
659+ define signext i32 @sexti1_i32_setcc_2 (i32 signext %a , i32 signext %b ) {
660+ ; RV64I-LABEL: sexti1_i32_setcc_2:
661+ ; RV64I: # %bb.0:
662+ ; RV64I-NEXT: xor a0, a0, a1
663+ ; RV64I-NEXT: snez a0, a0
664+ ; RV64I-NEXT: addi a0, a0, -1
665+ ; RV64I-NEXT: ret
666+ ;
667+ ; RV64XTHEADBB-LABEL: sexti1_i32_setcc_2:
668+ ; RV64XTHEADBB: # %bb.0:
669+ ; RV64XTHEADBB-NEXT: xor a0, a0, a1
670+ ; RV64XTHEADBB-NEXT: seqz a0, a0
671+ ; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
672+ ; RV64XTHEADBB-NEXT: ret
673+ %icmp = icmp eq i32 %a , %b
674+ %sext = sext i1 %icmp to i32
675+ ret i32 %sext
676+ }
677+
678+ ; Make sure we don't use th.ext instead of neg.
679+ define signext i32 @sexti1_i32_setcc_3 (i32 signext %a , i32 signext %b ) {
680+ ; RV64I-LABEL: sexti1_i32_setcc_3:
681+ ; RV64I: # %bb.0:
682+ ; RV64I-NEXT: slt a0, a0, a1
683+ ; RV64I-NEXT: neg a0, a0
684+ ; RV64I-NEXT: ret
685+ ;
686+ ; RV64XTHEADBB-LABEL: sexti1_i32_setcc_3:
687+ ; RV64XTHEADBB: # %bb.0:
688+ ; RV64XTHEADBB-NEXT: slt a0, a0, a1
689+ ; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
690+ ; RV64XTHEADBB-NEXT: ret
691+ %icmp = icmp slt i32 %a , %b
692+ %sext = sext i1 %icmp to i32
693+ ret i32 %sext
694+ }
695+
658696define i64 @sexti1_i64 (i64 %a ) nounwind {
659697; RV64I-LABEL: sexti1_i64:
660698; RV64I: # %bb.0:
@@ -706,6 +744,44 @@ define zeroext i8 @sexti1_i64_setcc(i64 %a) {
706744 ret i8 %sext
707745}
708746
747+ ; Make sure we don't use seqz+th.ext instead of snez+addi
748+ define i64 @sexti1_i64_setcc_2 (i64 %a , i64 %b ) {
749+ ; RV64I-LABEL: sexti1_i64_setcc_2:
750+ ; RV64I: # %bb.0:
751+ ; RV64I-NEXT: xor a0, a0, a1
752+ ; RV64I-NEXT: snez a0, a0
753+ ; RV64I-NEXT: addi a0, a0, -1
754+ ; RV64I-NEXT: ret
755+ ;
756+ ; RV64XTHEADBB-LABEL: sexti1_i64_setcc_2:
757+ ; RV64XTHEADBB: # %bb.0:
758+ ; RV64XTHEADBB-NEXT: xor a0, a0, a1
759+ ; RV64XTHEADBB-NEXT: seqz a0, a0
760+ ; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
761+ ; RV64XTHEADBB-NEXT: ret
762+ %icmp = icmp eq i64 %a , %b
763+ %sext = sext i1 %icmp to i64
764+ ret i64 %sext
765+ }
766+
767+ ; Make sure we don't use th.ext instead of neg.
768+ define i64 @sexti1_i64_setcc_3 (i64 %a , i64 %b ) {
769+ ; RV64I-LABEL: sexti1_i64_setcc_3:
770+ ; RV64I: # %bb.0:
771+ ; RV64I-NEXT: slt a0, a0, a1
772+ ; RV64I-NEXT: neg a0, a0
773+ ; RV64I-NEXT: ret
774+ ;
775+ ; RV64XTHEADBB-LABEL: sexti1_i64_setcc_3:
776+ ; RV64XTHEADBB: # %bb.0:
777+ ; RV64XTHEADBB-NEXT: slt a0, a0, a1
778+ ; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
779+ ; RV64XTHEADBB-NEXT: ret
780+ %icmp = icmp slt i64 %a , %b
781+ %sext = sext i1 %icmp to i64
782+ ret i64 %sext
783+ }
784+
709785define signext i32 @sextb_i32 (i32 signext %a ) nounwind {
710786; RV64I-LABEL: sextb_i32:
711787; RV64I: # %bb.0:
0 commit comments