Skip to content

Commit b8e708b

Browse files
authored
[RISCV] Merge ADDI with X0 into base offset (#78940)
If offset is `addi rd, x0, imm`, merge imm into base offset.
1 parent 4db4d7f commit b8e708b

File tree

2 files changed

+18
-23
lines changed

2 files changed

+18
-23
lines changed

llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,16 @@ bool RISCVMergeBaseOffsetOpt::foldLargeOffset(MachineInstr &Hi,
193193
if (AddiImmOp.getTargetFlags() != RISCVII::MO_None)
194194
return false;
195195
Register AddiReg = OffsetTail.getOperand(1).getReg();
196-
if (!AddiReg.isVirtual())
197-
return false;
198196
int64_t OffLo = AddiImmOp.getImm();
197+
198+
// Handle rs1 of ADDI is X0.
199+
if (AddiReg == RISCV::X0) {
200+
LLVM_DEBUG(dbgs() << " Offset Instrs: " << OffsetTail);
201+
foldOffset(Hi, Lo, TailAdd, OffLo);
202+
OffsetTail.eraseFromParent();
203+
return true;
204+
}
205+
199206
MachineInstr &OffsetLui = *MRI->getVRegDef(AddiReg);
200207
MachineOperand &LuiImmOp = OffsetLui.getOperand(1);
201208
if (OffsetLui.getOpcode() != RISCV::LUI ||
@@ -206,7 +213,7 @@ bool RISCVMergeBaseOffsetOpt::foldLargeOffset(MachineInstr &Hi,
206213
Offset += OffLo;
207214
// RV32 ignores the upper 32 bits. ADDIW sign extends the result.
208215
if (!ST->is64Bit() || OffsetTail.getOpcode() == RISCV::ADDIW)
209-
Offset = SignExtend64<32>(Offset);
216+
Offset = SignExtend64<32>(Offset);
210217
// We can only fold simm32 offsets.
211218
if (!isInt<32>(Offset))
212219
return false;

llvm/test/CodeGen/RISCV/fold-addi-loadstore.ll

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -971,49 +971,37 @@ declare void @f(ptr)
971971
define i32 @crash() {
972972
; RV32I-LABEL: crash:
973973
; RV32I: # %bb.0: # %entry
974-
; RV32I-NEXT: li a0, 1
975-
; RV32I-NEXT: lui a1, %hi(g)
976-
; RV32I-NEXT: addi a1, a1, %lo(g)
977-
; RV32I-NEXT: add a0, a1, a0
978-
; RV32I-NEXT: lbu a0, 400(a0)
974+
; RV32I-NEXT: lui a0, %hi(g+401)
975+
; RV32I-NEXT: lbu a0, %lo(g+401)(a0)
979976
; RV32I-NEXT: seqz a0, a0
980977
; RV32I-NEXT: sw a0, 0(zero)
981978
; RV32I-NEXT: li a0, 0
982979
; RV32I-NEXT: ret
983980
;
984981
; RV32I-MEDIUM-LABEL: crash:
985982
; RV32I-MEDIUM: # %bb.0: # %entry
986-
; RV32I-MEDIUM-NEXT: li a0, 1
987983
; RV32I-MEDIUM-NEXT: .Lpcrel_hi14:
988-
; RV32I-MEDIUM-NEXT: auipc a1, %pcrel_hi(g)
989-
; RV32I-MEDIUM-NEXT: addi a1, a1, %pcrel_lo(.Lpcrel_hi14)
990-
; RV32I-MEDIUM-NEXT: add a0, a1, a0
991-
; RV32I-MEDIUM-NEXT: lbu a0, 400(a0)
984+
; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g+401)
985+
; RV32I-MEDIUM-NEXT: lbu a0, %pcrel_lo(.Lpcrel_hi14)(a0)
992986
; RV32I-MEDIUM-NEXT: seqz a0, a0
993987
; RV32I-MEDIUM-NEXT: sw a0, 0(zero)
994988
; RV32I-MEDIUM-NEXT: li a0, 0
995989
; RV32I-MEDIUM-NEXT: ret
996990
;
997991
; RV64I-LABEL: crash:
998992
; RV64I: # %bb.0: # %entry
999-
; RV64I-NEXT: li a0, 1
1000-
; RV64I-NEXT: lui a1, %hi(g)
1001-
; RV64I-NEXT: addi a1, a1, %lo(g)
1002-
; RV64I-NEXT: add a0, a1, a0
1003-
; RV64I-NEXT: lbu a0, 400(a0)
993+
; RV64I-NEXT: lui a0, %hi(g+401)
994+
; RV64I-NEXT: lbu a0, %lo(g+401)(a0)
1004995
; RV64I-NEXT: seqz a0, a0
1005996
; RV64I-NEXT: sw a0, 0(zero)
1006997
; RV64I-NEXT: li a0, 0
1007998
; RV64I-NEXT: ret
1008999
;
10091000
; RV64I-MEDIUM-LABEL: crash:
10101001
; RV64I-MEDIUM: # %bb.0: # %entry
1011-
; RV64I-MEDIUM-NEXT: li a0, 1
10121002
; RV64I-MEDIUM-NEXT: .Lpcrel_hi14:
1013-
; RV64I-MEDIUM-NEXT: auipc a1, %pcrel_hi(g)
1014-
; RV64I-MEDIUM-NEXT: addi a1, a1, %pcrel_lo(.Lpcrel_hi14)
1015-
; RV64I-MEDIUM-NEXT: add a0, a1, a0
1016-
; RV64I-MEDIUM-NEXT: lbu a0, 400(a0)
1003+
; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g+401)
1004+
; RV64I-MEDIUM-NEXT: lbu a0, %pcrel_lo(.Lpcrel_hi14)(a0)
10171005
; RV64I-MEDIUM-NEXT: seqz a0, a0
10181006
; RV64I-MEDIUM-NEXT: sw a0, 0(zero)
10191007
; RV64I-MEDIUM-NEXT: li a0, 0

0 commit comments

Comments
 (0)