diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-02-12 16:27:23 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-02-12 16:27:23 +0000 |
commit | bdb04d9032c209cc4b0a6082f9c748ea38099bb8 (patch) | |
tree | a2c6498d8c017951af51e0049d66e88ffe24cd9a | |
parent | cd2be7f08406a3f6c711328fe6a9a2056341b1a8 (diff) | |
download | bcm5719-llvm-bdb04d9032c209cc4b0a6082f9c748ea38099bb8.tar.gz bcm5719-llvm-bdb04d9032c209cc4b0a6082f9c748ea38099bb8.zip |
[Hexagon] Handle out-of-range offsets in eliminateFrameIndex
Create a virtual register that will hold the actual address and use it
with the offset of 0 in the place of the original FI.
llvm-svn: 260688
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp b/llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp index 6e5f7324aca..94ce0ddfbd0 100644 --- a/llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp +++ b/llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp @@ -135,6 +135,7 @@ void HexagonRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, int Offset = HFI.getFrameIndexReference(MF, FI, BP); // Add the offset from the instruction. int RealOffset = Offset + MI.getOperand(FIOp+1).getImm(); + bool IsKill = false; unsigned Opc = MI.getOpcode(); switch (Opc) { @@ -149,20 +150,22 @@ void HexagonRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, break; } - if (HII.isValidOffset(Opc, RealOffset)) { - MI.getOperand(FIOp).ChangeToRegister(BP, false); - MI.getOperand(FIOp+1).ChangeToImmediate(RealOffset); - return; + if (!HII.isValidOffset(Opc, RealOffset)) { + // If the offset is not valid, calculate the address in a temporary + // register and use it with offset 0. + auto &MRI = MF.getRegInfo(); + unsigned TmpR = MRI.createVirtualRegister(&Hexagon::IntRegsRegClass); + DebugLoc DL = MI.getDebugLoc(); + BuildMI(MB, II, DL, HII.get(Hexagon::A2_addi), TmpR) + .addReg(BP) + .addImm(RealOffset); + BP = TmpR; + RealOffset = 0; + IsKill = true; } -#ifndef NDEBUG - const Function *F = MF.getFunction(); - dbgs() << "In function "; - if (F) dbgs() << F->getName(); - else dbgs() << "<?>"; - dbgs() << ", BB#" << MB.getNumber() << "\n" << MI; -#endif - llvm_unreachable("Unhandled instruction"); + MI.getOperand(FIOp).ChangeToRegister(BP, false, false, IsKill); + MI.getOperand(FIOp+1).ChangeToImmediate(RealOffset); } |