Skip to content

Commit c4649d0

Browse files
committed
[RISCV] Teach RISCVOptWInstrs that 'bset x0, 30-0' satisfies isSignExtendingOpW.
Constant materialization can use bset x0, 11 to create 2048.
1 parent e2c440b commit c4649d0

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ static bool isSignExtendingOpW(const MachineInstr &MI,
359359
// An ORI with an >11 bit immediate (negative 12-bit) will set bits 63:11.
360360
case RISCV::ORI:
361361
return !isUInt<11>(MI.getOperand(2).getImm());
362+
// A bseti with X0 is sign extended if the immediate is less than 31.
363+
case RISCV::BSETI:
364+
return MI.getOperand(2).getImm() < 31 &&
365+
MI.getOperand(1).getReg() == RISCV::X0;
362366
// Copying from X0 produces zero.
363367
case RISCV::COPY:
364368
return MI.getOperand(1).getReg() == RISCV::X0;

llvm/test/CodeGen/RISCV/rv64-legal-i32/rv64zbs.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,6 @@ define signext i32 @bseti_i32_11(i32 signext %a) nounwind {
616616
; RV64ZBS: # %bb.0:
617617
; RV64ZBS-NEXT: bseti a1, zero, 11
618618
; RV64ZBS-NEXT: or a0, a0, a1
619-
; RV64ZBS-NEXT: sext.w a0, a0
620619
; RV64ZBS-NEXT: ret
621620
%or = or i32 %a, 2048
622621
ret i32 %or
@@ -751,7 +750,6 @@ define signext i32 @binvi_i32_11(i32 signext %a) nounwind {
751750
; RV64ZBS: # %bb.0:
752751
; RV64ZBS-NEXT: bseti a1, zero, 11
753752
; RV64ZBS-NEXT: xor a0, a0, a1
754-
; RV64ZBS-NEXT: sext.w a0, a0
755753
; RV64ZBS-NEXT: ret
756754
%xor = xor i32 %a, 2048
757755
ret i32 %xor

0 commit comments

Comments
 (0)