diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-03-24 20:31:41 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-03-24 20:31:41 +0000 |
commit | 01598de3ecf79176f7ae34dc0aa94d89fe570443 (patch) | |
tree | 3c29fcdc34645318deb708706d35babda3434d64 | |
parent | 6ae4bc89582ba23712149c3070bd5f806b8f3f2a (diff) | |
download | bcm5719-llvm-01598de3ecf79176f7ae34dc0aa94d89fe570443.tar.gz bcm5719-llvm-01598de3ecf79176f7ae34dc0aa94d89fe570443.zip |
[Hexagon] Be sure to treat subregisters of a CSR as CSRs as well
llvm-svn: 264331
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp b/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp index 6ee2e8bef61..acc92405aed 100644 --- a/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp +++ b/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp @@ -234,7 +234,8 @@ namespace { /// Checks if the basic block contains any instruction that needs a stack /// frame to be already in place. - bool needsStackFrame(const MachineBasicBlock &MBB, const BitVector &CSR) { + bool needsStackFrame(const MachineBasicBlock &MBB, const BitVector &CSR, + const HexagonRegisterInfo &HRI) { for (auto &I : MBB) { const MachineInstr *MI = &I; if (MI->isCall()) @@ -263,8 +264,9 @@ namespace { // a stack slot. if (TargetRegisterInfo::isVirtualRegister(R)) return true; - if (CSR[R]) - return true; + for (MCSubRegIterator S(R, &HRI, true); S.isValid(); ++S) + if (CSR[*S]) + return true; } } return false; @@ -335,10 +337,11 @@ void HexagonFrameLowering::findShrunkPrologEpilog(MachineFunction &MF, SmallVector<MachineBasicBlock*,16> SFBlocks; BitVector CSR(Hexagon::NUM_TARGET_REGS); for (const MCPhysReg *P = HRI.getCalleeSavedRegs(&MF); *P; ++P) - CSR[*P] = true; + for (MCSubRegIterator S(*P, &HRI, true); S.isValid(); ++S) + CSR[*S] = true; for (auto &I : MF) - if (needsStackFrame(I, CSR)) + if (needsStackFrame(I, CSR, HRI)) SFBlocks.push_back(&I); DEBUG({ |