mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
This survived a bootstrap, so let's try 98104 again.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98137 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fac4f1f181
commit
c5cf227f3d
@ -347,15 +347,29 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1,
|
||||
--I1; --I2;
|
||||
// Skip debugging pseudos; necessary to avoid changing the code.
|
||||
while (I1->isDebugValue()) {
|
||||
if (I1==MBB1->begin())
|
||||
if (I1==MBB1->begin()) {
|
||||
while (I2->isDebugValue()) {
|
||||
if (I2==MBB2->begin())
|
||||
// I1==DBG at begin; I2==DBG at begin
|
||||
return TailLen;
|
||||
--I2;
|
||||
}
|
||||
++I2;
|
||||
// I1==DBG at begin; I2==non-DBG, or first of DBGs not at begin
|
||||
return TailLen;
|
||||
}
|
||||
--I1;
|
||||
}
|
||||
// I1==first (untested) non-DBG preceding known match
|
||||
while (I2->isDebugValue()) {
|
||||
if (I2==MBB2->begin())
|
||||
if (I2==MBB2->begin()) {
|
||||
++I1;
|
||||
// I1==non-DBG, or first of DBGs not at begin; I2==DBG at begin
|
||||
return TailLen;
|
||||
}
|
||||
--I2;
|
||||
}
|
||||
// I1, I2==first (untested) non-DBGs preceding known match
|
||||
if (!I1->isIdenticalTo(I2) ||
|
||||
// FIXME: This check is dubious. It's used to get around a problem where
|
||||
// people incorrectly expect inline asm directives to remain in the same
|
||||
@ -368,6 +382,29 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1,
|
||||
}
|
||||
++TailLen;
|
||||
}
|
||||
// Back past possible debugging pseudos at beginning of block. This matters
|
||||
// when one block differs from the other only by whether debugging pseudos
|
||||
// are present at the beginning. (This way, the various checks later for
|
||||
// I1==MBB1->begin() work as expected.)
|
||||
if (I1 == MBB1->begin() && I2 != MBB2->begin()) {
|
||||
--I2;
|
||||
while (I2->isDebugValue()) {
|
||||
if (I2 == MBB2->begin()) {
|
||||
return TailLen;
|
||||
}
|
||||
--I2;
|
||||
}
|
||||
++I2;
|
||||
}
|
||||
if (I2 == MBB2->begin() && I1 != MBB1->begin()) {
|
||||
--I1;
|
||||
while (I1->isDebugValue()) {
|
||||
if (I1 == MBB1->begin())
|
||||
return TailLen;
|
||||
--I1;
|
||||
}
|
||||
++I1;
|
||||
}
|
||||
return TailLen;
|
||||
}
|
||||
|
||||
@ -934,6 +971,18 @@ bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
// Blocks should be considered empty if they contain only debug info;
|
||||
// else the debug info would affect codegen.
|
||||
static bool IsEmptyBlock(MachineBasicBlock *MBB) {
|
||||
if (MBB->empty())
|
||||
return true;
|
||||
for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end();
|
||||
MBBI!=MBBE; ++MBBI) {
|
||||
if (!MBBI->isDebugValue())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// IsBetterFallthrough - Return true if it would be clearly better to
|
||||
/// fall-through to MBB1 than to fall through into MBB2. This has to return
|
||||
@ -971,7 +1020,7 @@ ReoptimizeBlock:
|
||||
// explicitly. Landing pads should not do this since the landing-pad table
|
||||
// points to this block. Blocks with their addresses taken shouldn't be
|
||||
// optimized away.
|
||||
if (MBB->empty() && !MBB->isLandingPad() && !MBB->hasAddressTaken()) {
|
||||
if (IsEmptyBlock(MBB) && !MBB->isLandingPad() && !MBB->hasAddressTaken()) {
|
||||
// Dead block? Leave for cleanup later.
|
||||
if (MBB->pred_empty()) return MadeChange;
|
||||
|
||||
@ -1163,7 +1212,23 @@ ReoptimizeBlock:
|
||||
// be 'non-branch terminators' in the block, try removing the branch and
|
||||
// then seeing if the block is empty.
|
||||
TII->RemoveBranch(*MBB);
|
||||
|
||||
// If the only things remaining in the block are debug info, remove these
|
||||
// as well, so this will behave the same as an empty block in non-debug
|
||||
// mode.
|
||||
if (!MBB->empty()) {
|
||||
bool NonDebugInfoFound = false;
|
||||
for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
|
||||
I != E; ++I) {
|
||||
if (!I->isDebugValue()) {
|
||||
NonDebugInfoFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!NonDebugInfoFound)
|
||||
// Make the block empty, losing the debug info (we could probably
|
||||
// improve this in some cases.)
|
||||
MBB->erase(MBB->begin(), MBB->end());
|
||||
}
|
||||
// If this block is just an unconditional branch to CurTBB, we can
|
||||
// usually completely eliminate the block. The only case we cannot
|
||||
// completely eliminate the block is when the block before this one
|
||||
|
Loading…
Reference in New Issue
Block a user