mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-03 13:31:05 +00:00
When moving a block for table jumps, make sure the prior block terminator
is analyzable so it can be updated. If it's not, be safe and don't move the block. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89022 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2cbe71cdf0
commit
a0a95a3c1c
@ -1749,21 +1749,23 @@ AdjustJTTargetBlockForward(MachineBasicBlock *BB, MachineBasicBlock *JTBB)
|
||||
// heuristic. FIXME: We can definitely improve it.
|
||||
MachineBasicBlock *TBB = 0, *FBB = 0;
|
||||
SmallVector<MachineOperand, 4> Cond;
|
||||
SmallVector<MachineOperand, 4> CondPrior;
|
||||
MachineFunction::iterator BBi = BB;
|
||||
MachineFunction::iterator OldPrior = prior(BBi);
|
||||
|
||||
// If the block terminator isn't analyzable, don't try to move the block
|
||||
if (TII->AnalyzeBranch(*BB, TBB, FBB, Cond))
|
||||
return NULL;
|
||||
bool B = TII->AnalyzeBranch(*BB, TBB, FBB, Cond);
|
||||
|
||||
// If the block ends in an unconditional branch, move it. Be paranoid
|
||||
// If the block ends in an unconditional branch, move it. The prior block
|
||||
// has to have an analyzable terminator for us to move this one. Be paranoid
|
||||
// and make sure we're not trying to move the entry block of the function.
|
||||
if (Cond.empty() && BB != MF.begin()) {
|
||||
MachineFunction::iterator BBi = BB;
|
||||
MachineFunction::iterator OldPrior = prior(BBi);
|
||||
if (!B && Cond.empty() && BB != MF.begin() &&
|
||||
!TII->AnalyzeBranch(*OldPrior, TBB, FBB, CondPrior)) {
|
||||
BB->moveAfter(JTBB);
|
||||
OldPrior->updateTerminator();
|
||||
BB->updateTerminator();
|
||||
// Update numbering to account for the block being moved.
|
||||
MF.RenumberBlocks(OldPrior);
|
||||
MF.RenumberBlocks();
|
||||
++NumJTMoved;
|
||||
return NULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user