summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2011-10-12 02:58:01 +0000
committerBill Wendling <isanbard@gmail.com>2011-10-12 02:58:01 +0000
commit918cea2c2747a48985a1031b4d8323a777fedd2b (patch)
treec30b835c543e447196db672855341defdb4c047f /llvm/lib/CodeGen
parentb6d70ebc0a37c6e1657cb1f17d8f67dabefbeda8 (diff)
downloadbcm5719-llvm-918cea2c2747a48985a1031b4d8323a777fedd2b.tar.gz
bcm5719-llvm-918cea2c2747a48985a1031b4d8323a777fedd2b.zip
Expand the check for a landing pad so that it looks at the basic block's
containing loop's header to see if that's a landing pad. If it is, then we don't want to hoist instructions out of the loop and above the header. llvm-svn: 141767
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/MachineLICM.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/MachineLICM.cpp b/llvm/lib/CodeGen/MachineLICM.cpp
index 6116281d598..889406a4869 100644
--- a/llvm/lib/CodeGen/MachineLICM.cpp
+++ b/llvm/lib/CodeGen/MachineLICM.cpp
@@ -343,11 +343,6 @@ bool MachineLICM::runOnMachineFunction(MachineFunction &MF) {
continue;
}
- // If the header is a landing pad, then we don't want to hoist instructions
- // out of it. This can happen with SjLj exception handling which has a
- // dispatch table as the landing pad.
- if (CurLoop->getHeader()->isLandingPad()) continue;
-
if (!PreRegAlloc)
HoistRegionPostRA();
else {
@@ -472,6 +467,12 @@ void MachineLICM::HoistRegionPostRA() {
const std::vector<MachineBasicBlock*> Blocks = CurLoop->getBlocks();
for (unsigned i = 0, e = Blocks.size(); i != e; ++i) {
MachineBasicBlock *BB = Blocks[i];
+
+ // If the header of the loop containing this basic block is a landing pad,
+ // then don't try to hoist instructions out of this loop.
+ const MachineLoop *ML = MLI->getLoopFor(BB);
+ if (ML && ML->getHeader()->isLandingPad()) continue;
+
// Conservatively treat live-in's as an external def.
// FIXME: That means a reload that're reused in successor block(s) will not
// be LICM'ed.
@@ -607,6 +608,11 @@ void MachineLICM::HoistRegion(MachineDomTreeNode *N, bool IsHeader) {
assert(N != 0 && "Null dominator tree node?");
MachineBasicBlock *BB = N->getBlock();
+ // If the header of the loop containing this basic block is a landing pad,
+ // then don't try to hoist instructions out of this loop.
+ const MachineLoop *ML = MLI->getLoopFor(BB);
+ if (ML && ML->getHeader()->isLandingPad()) return;
+
// If this subregion is not in the top level loop at all, exit.
if (!CurLoop->contains(BB)) return;
OpenPOWER on IntegriCloud