mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-26 07:34:14 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141767 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
22e8a366ad
commit
a2e87912d8
@ -343,11 +343,6 @@ bool MachineLICM::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
continue;
|
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)
|
if (!PreRegAlloc)
|
||||||
HoistRegionPostRA();
|
HoistRegionPostRA();
|
||||||
else {
|
else {
|
||||||
@ -472,6 +467,12 @@ void MachineLICM::HoistRegionPostRA() {
|
|||||||
const std::vector<MachineBasicBlock*> Blocks = CurLoop->getBlocks();
|
const std::vector<MachineBasicBlock*> Blocks = CurLoop->getBlocks();
|
||||||
for (unsigned i = 0, e = Blocks.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Blocks.size(); i != e; ++i) {
|
||||||
MachineBasicBlock *BB = Blocks[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.
|
// Conservatively treat live-in's as an external def.
|
||||||
// FIXME: That means a reload that're reused in successor block(s) will not
|
// FIXME: That means a reload that're reused in successor block(s) will not
|
||||||
// be LICM'ed.
|
// be LICM'ed.
|
||||||
@ -607,6 +608,11 @@ void MachineLICM::HoistRegion(MachineDomTreeNode *N, bool IsHeader) {
|
|||||||
assert(N != 0 && "Null dominator tree node?");
|
assert(N != 0 && "Null dominator tree node?");
|
||||||
MachineBasicBlock *BB = N->getBlock();
|
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 this subregion is not in the top level loop at all, exit.
|
||||||
if (!CurLoop->contains(BB)) return;
|
if (!CurLoop->contains(BB)) return;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user