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 @@ -169,11 +169,22 @@ assert(isInt<32>(Offset) && "Int32 expected"); // The offset won't fit in an immediate, so use a scratch register instead // Modify Offset and FrameReg appropriately - Register ScratchReg = MRI.createVirtualRegister(&RISCV::GPRRegClass); + bool isADDI = MI.getOpcode() == RISCV::ADDI; + Register ScratchReg; + + ScratchReg = isADDI ? MI.getOperand(0).getReg() : + MRI.createVirtualRegister(&RISCV::GPRRegClass); + TII->movImm(MBB, II, DL, ScratchReg, Offset); BuildMI(MBB, II, DL, TII->get(RISCV::ADD), ScratchReg) .addReg(FrameReg) .addReg(ScratchReg, RegState::Kill); + + if (isADDI) { + MI.eraseFromParent(); + return; + } + Offset = 0; FrameReg = ScratchReg; FrameRegIsKill = true; 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 @@ -318,7 +318,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 ; RV32I-NEXT: lui a0, 1 ; RV32I-NEXT: addi a0, a0, -1024 @@ -340,7 +339,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 ; RV64I-NEXT: lui a0, 1 ; RV64I-NEXT: addiw a0, a0, -1024 @@ -393,7 +391,6 @@ ; RV32I-NEXT: andi sp, sp, -2048 ; RV32I-NEXT: lui a0, 1 ; RV32I-NEXT: add a0, sp, a0 -; RV32I-NEXT: mv a0, a0 ; RV32I-NEXT: call callee ; RV32I-NEXT: lui a0, 2 ; RV32I-NEXT: addi a0, a0, -2048 @@ -418,7 +415,6 @@ ; RV64I-NEXT: andi sp, sp, -2048 ; RV64I-NEXT: lui a0, 1 ; RV64I-NEXT: add a0, sp, a0 -; RV64I-NEXT: mv a0, a0 ; RV64I-NEXT: call callee ; RV64I-NEXT: lui a0, 2 ; RV64I-NEXT: addiw a0, a0, -2048 @@ -474,7 +470,6 @@ ; RV32I-NEXT: slli sp, a0, 12 ; RV32I-NEXT: lui a0, 2 ; RV32I-NEXT: add a0, sp, a0 -; RV32I-NEXT: mv a0, a0 ; RV32I-NEXT: call callee ; RV32I-NEXT: lui a0, 3 ; RV32I-NEXT: sub sp, s0, a0 @@ -499,7 +494,6 @@ ; RV64I-NEXT: slli sp, a0, 12 ; RV64I-NEXT: lui a0, 2 ; RV64I-NEXT: add a0, sp, a0 -; RV64I-NEXT: mv a0, a0 ; RV64I-NEXT: call callee ; RV64I-NEXT: lui a0, 3 ; 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 @@ -1793,7 +1793,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 @@ -1872,7 +1871,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 @@ -1916,7 +1914,6 @@ ; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 ; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 280 ; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 -; LP64-LP64F-LP64D-FPELIM-NEXT: mv a0, a0 ; LP64-LP64F-LP64D-FPELIM-NEXT: ori a0, a0, 4 ; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) ; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414