diff options
author | Quentin Colombet <qcolombet@apple.com> | 2015-07-10 22:09:55 +0000 |
---|---|---|
committer | Quentin Colombet <qcolombet@apple.com> | 2015-07-10 22:09:55 +0000 |
commit | 8b984d19f2c8b22e26a7b8f8beca6dfde2873a7e (patch) | |
tree | 1f45415d4bd76cc2e8ad823ef3866e6bb168be51 /llvm/lib/CodeGen | |
parent | 3f0a0e4a282edcc7c0fb67c8021c1b4e7a076d07 (diff) | |
download | bcm5719-llvm-8b984d19f2c8b22e26a7b8f8beca6dfde2873a7e.tar.gz bcm5719-llvm-8b984d19f2c8b22e26a7b8f8beca6dfde2873a7e.zip |
[ShrinkWrap][PEI] Do not insert epilogue for unreachable blocks.
Although this is not incorrect to insert such code, it is useless
and it hurts the binary size.
llvm-svn: 241946
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index 76583f0de88..7e162332de6 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -92,7 +92,7 @@ private: void insertPrologEpilogCode(MachineFunction &Fn); // Convenience for recognizing return blocks. - bool isReturnBlock(MachineBasicBlock *MBB); + bool isReturnBlock(const MachineBasicBlock *MBB) const; }; } // namespace @@ -127,7 +127,7 @@ void PEI::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU); } -bool PEI::isReturnBlock(MachineBasicBlock* MBB) { +bool PEI::isReturnBlock(const MachineBasicBlock* MBB) const { return (MBB && !MBB->empty() && MBB->back().isReturn()); } @@ -143,7 +143,12 @@ void PEI::calculateSets(MachineFunction &Fn) { if (MFI->getSavePoint()) { SaveBlock = MFI->getSavePoint(); assert(MFI->getRestorePoint() && "Both restore and save must be set"); - RestoreBlocks.push_back(MFI->getRestorePoint()); + MachineBasicBlock *RestoreBlock = MFI->getRestorePoint(); + // If RestoreBlock does not have any successor and is not a return block + // then the end point is unreachable and we do not need to insert any + // epilogue. + if (!RestoreBlock->succ_empty() || isReturnBlock(RestoreBlock)) + RestoreBlocks.push_back(RestoreBlock); return; } |