Skip to content

Commit 9025202

Browse files
committed
[RISCV] Make (sext_inreg X, i1) legal for XTHeadBb to cover the existing isel pattern.
I just happened to notice the untested isel pattern.
1 parent 6370546 commit 9025202

File tree

3 files changed

+95
-1
lines changed

3 files changed

+95
-1
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
299299
setOperationAction(ISD::VASTART, MVT::Other, Custom);
300300
setOperationAction({ISD::VAARG, ISD::VACOPY, ISD::VAEND}, MVT::Other, Expand);
301301

302-
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
302+
if (!Subtarget.hasVendorXTHeadBb())
303+
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
303304

304305
setOperationAction(ISD::EH_DWARF_CFA, MVT::i32, Custom);
305306

llvm/test/CodeGen/RISCV/rv32xtheadbb.ll

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,37 @@ define i64 @cttz_i64(i64 %a) nounwind {
266266
ret i64 %1
267267
}
268268

269+
define i32 @sexti1_i32(i32 %a) nounwind {
270+
; RV32I-LABEL: sexti1_i32:
271+
; RV32I: # %bb.0:
272+
; RV32I-NEXT: slli a0, a0, 31
273+
; RV32I-NEXT: srai a0, a0, 31
274+
; RV32I-NEXT: ret
275+
;
276+
; RV32XTHEADBB-LABEL: sexti1_i32:
277+
; RV32XTHEADBB: # %bb.0:
278+
; RV32XTHEADBB-NEXT: th.ext a0, a0, 0, 0
279+
; RV32XTHEADBB-NEXT: ret
280+
%shl = shl i32 %a, 31
281+
%shr = ashr exact i32 %shl, 31
282+
ret i32 %shr
283+
}
284+
285+
define i32 @sexti1_i32_2(i1 %a) nounwind {
286+
; RV32I-LABEL: sexti1_i32_2:
287+
; RV32I: # %bb.0:
288+
; RV32I-NEXT: slli a0, a0, 31
289+
; RV32I-NEXT: srai a0, a0, 31
290+
; RV32I-NEXT: ret
291+
;
292+
; RV32XTHEADBB-LABEL: sexti1_i32_2:
293+
; RV32XTHEADBB: # %bb.0:
294+
; RV32XTHEADBB-NEXT: th.ext a0, a0, 0, 0
295+
; RV32XTHEADBB-NEXT: ret
296+
%sext = sext i1 %a to i32
297+
ret i32 %sext
298+
}
299+
269300
define i32 @sextb_i32(i32 %a) nounwind {
270301
; RV32I-LABEL: sextb_i32:
271302
; RV32I: # %bb.0:

llvm/test/CodeGen/RISCV/rv64xtheadbb.ll

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,68 @@ define i64 @cttz_i64(i64 %a) nounwind {
558558
ret i64 %1
559559
}
560560

561+
define signext i32 @sexti1_i32(i32 signext %a) nounwind {
562+
; RV64I-LABEL: sexti1_i32:
563+
; RV64I: # %bb.0:
564+
; RV64I-NEXT: slli a0, a0, 63
565+
; RV64I-NEXT: srai a0, a0, 63
566+
; RV64I-NEXT: ret
567+
;
568+
; RV64XTHEADBB-LABEL: sexti1_i32:
569+
; RV64XTHEADBB: # %bb.0:
570+
; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
571+
; RV64XTHEADBB-NEXT: ret
572+
%shl = shl i32 %a, 31
573+
%shr = ashr exact i32 %shl, 31
574+
ret i32 %shr
575+
}
576+
577+
define signext i32 @sexti1_i32_2(i1 %a) nounwind {
578+
; RV64I-LABEL: sexti1_i32_2:
579+
; RV64I: # %bb.0:
580+
; RV64I-NEXT: slli a0, a0, 63
581+
; RV64I-NEXT: srai a0, a0, 63
582+
; RV64I-NEXT: ret
583+
;
584+
; RV64XTHEADBB-LABEL: sexti1_i32_2:
585+
; RV64XTHEADBB: # %bb.0:
586+
; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
587+
; RV64XTHEADBB-NEXT: ret
588+
%sext = sext i1 %a to i32
589+
ret i32 %sext
590+
}
591+
592+
define i64 @sexti1_i64(i64 %a) nounwind {
593+
; RV64I-LABEL: sexti1_i64:
594+
; RV64I: # %bb.0:
595+
; RV64I-NEXT: slli a0, a0, 63
596+
; RV64I-NEXT: srai a0, a0, 63
597+
; RV64I-NEXT: ret
598+
;
599+
; RV64XTHEADBB-LABEL: sexti1_i64:
600+
; RV64XTHEADBB: # %bb.0:
601+
; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
602+
; RV64XTHEADBB-NEXT: ret
603+
%shl = shl i64 %a, 63
604+
%shr = ashr exact i64 %shl, 63
605+
ret i64 %shr
606+
}
607+
608+
define i64 @sexti1_i64_2(i1 %a) nounwind {
609+
; RV64I-LABEL: sexti1_i64_2:
610+
; RV64I: # %bb.0:
611+
; RV64I-NEXT: slli a0, a0, 63
612+
; RV64I-NEXT: srai a0, a0, 63
613+
; RV64I-NEXT: ret
614+
;
615+
; RV64XTHEADBB-LABEL: sexti1_i64_2:
616+
; RV64XTHEADBB: # %bb.0:
617+
; RV64XTHEADBB-NEXT: th.ext a0, a0, 0, 0
618+
; RV64XTHEADBB-NEXT: ret
619+
%sext = sext i1 %a to i64
620+
ret i64 %sext
621+
}
622+
561623
define signext i32 @sextb_i32(i32 signext %a) nounwind {
562624
; RV64I-LABEL: sextb_i32:
563625
; RV64I: # %bb.0:

0 commit comments

Comments
 (0)