diff --git a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp @@ -213,6 +213,13 @@ // Modify Offset and FrameReg appropriately Register ScratchReg = MRI.createVirtualRegister(&RISCV::GPRRegClass); TII->movImm(MBB, II, DL, ScratchReg, Offset.getFixed()); + if (MI.getOpcode() == RISCV::ADDI) { + BuildMI(MBB, II, DL, TII->get(RISCV::ADD), MI.getOperand(0).getReg()) + .addReg(FrameReg) + .addReg(ScratchReg, RegState::Kill); + MI.eraseFromParent(); + return; + } BuildMI(MBB, II, DL, TII->get(RISCV::ADD), ScratchReg) .addReg(FrameReg) .addReg(ScratchReg, RegState::Kill); diff --git a/llvm/test/CodeGen/RISCV/large-stack.ll b/llvm/test/CodeGen/RISCV/large-stack.ll --- a/llvm/test/CodeGen/RISCV/large-stack.ll +++ b/llvm/test/CodeGen/RISCV/large-stack.ll @@ -101,7 +101,6 @@ ; RV32I-WITHFP-NEXT: lui a2, 1048478 ; RV32I-WITHFP-NEXT: addi a2, a2, 1388 ; RV32I-WITHFP-NEXT: add a2, s0, a2 -; RV32I-WITHFP-NEXT: mv a2, a2 ; RV32I-WITHFP-NEXT: add a1, a2, a1 ; RV32I-WITHFP-NEXT: #APP ; RV32I-WITHFP-NEXT: nop diff --git a/llvm/test/CodeGen/RISCV/stack-realignment.ll b/llvm/test/CodeGen/RISCV/stack-realignment.ll --- a/llvm/test/CodeGen/RISCV/stack-realignment.ll +++ b/llvm/test/CodeGen/RISCV/stack-realignment.ll @@ -460,7 +460,6 @@ ; RV32I-NEXT: lui a0, 1 ; RV32I-NEXT: addi a0, a0, -2048 ; RV32I-NEXT: add a0, sp, a0 -; RV32I-NEXT: mv a0, a0 ; RV32I-NEXT: call callee@plt ; RV32I-NEXT: lui a0, 1 ; RV32I-NEXT: sub sp, s0, a0 @@ -489,7 +488,6 @@ ; RV64I-NEXT: lui a0, 1 ; RV64I-NEXT: addiw a0, a0, -2048 ; RV64I-NEXT: add a0, sp, a0 -; RV64I-NEXT: mv a0, a0 ; RV64I-NEXT: call callee@plt ; RV64I-NEXT: lui a0, 1 ; RV64I-NEXT: sub sp, s0, a0 @@ -552,7 +550,6 @@ ; RV32I-NEXT: slli sp, a0, 12 ; RV32I-NEXT: lui a0, 1 ; RV32I-NEXT: add a0, sp, a0 -; RV32I-NEXT: mv a0, a0 ; RV32I-NEXT: call callee@plt ; RV32I-NEXT: lui a0, 2 ; RV32I-NEXT: sub sp, s0, a0 @@ -581,7 +578,6 @@ ; RV64I-NEXT: slli sp, a0, 12 ; RV64I-NEXT: lui a0, 1 ; RV64I-NEXT: add a0, sp, a0 -; RV64I-NEXT: mv a0, a0 ; RV64I-NEXT: call callee@plt ; RV64I-NEXT: lui a0, 2 ; RV64I-NEXT: sub sp, s0, a0 diff --git a/llvm/test/CodeGen/RISCV/vararg.ll b/llvm/test/CodeGen/RISCV/vararg.ll --- a/llvm/test/CodeGen/RISCV/vararg.ll +++ b/llvm/test/CodeGen/RISCV/vararg.ll @@ -1773,7 +1773,6 @@ ; ILP32-ILP32F-FPELIM-NEXT: lui a1, 24414 ; ILP32-ILP32F-FPELIM-NEXT: addi a1, a1, 280 ; ILP32-ILP32F-FPELIM-NEXT: add a1, sp, a1 -; ILP32-ILP32F-FPELIM-NEXT: mv a1, a1 ; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) ; ILP32-ILP32F-FPELIM-NEXT: lui a1, 24414 ; ILP32-ILP32F-FPELIM-NEXT: addi a1, a1, 304 @@ -1852,7 +1851,6 @@ ; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a1, 24414 ; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a1, 280 ; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, sp, a1 -; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv a1, a1 ; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) ; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a1, 24414 ; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a1, 304 @@ -1896,7 +1894,6 @@ ; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 ; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 284 ; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 -; LP64-LP64F-LP64D-FPELIM-NEXT: mv a0, a0 ; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) ; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 ; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 280