diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-10-12 02:58:01 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-10-12 02:58:01 +0000 |
commit | 918cea2c2747a48985a1031b4d8323a777fedd2b (patch) | |
tree | c30b835c543e447196db672855341defdb4c047f /llvm/lib/CodeGen | |
parent | b6d70ebc0a37c6e1657cb1f17d8f67dabefbeda8 (diff) | |
download | bcm5719-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.cpp | 16 |
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; |