PHI elimination should not break back edge. It can cause some significant code placement issues. rdar://8263994

good:
LBB0_2:
  mov     r2, r0
  . . .
  mov     r1, r2
  bne     LBB0_2

bad:
LBB0_2:
  mov     r2, r0
  . . .
@ BB#3:
  mov     r1, r2
  b       LBB0_2


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111221 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng
2010-08-17 01:20:36 +00:00
parent 922157c834
commit 97b9b97853
4 changed files with 45 additions and 7 deletions

View File

@ -439,6 +439,14 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
if (TII->AnalyzeBranch(*this, TBB, FBB, Cond))
return NULL;
// Avoid splitting backedges of loops. It would introduce small out-of-line
// blocks into the loop which is very bad for code placement.
if (this == Succ)
return NULL;
MachineLoopInfo *MLI = P->getAnalysisIfAvailable<MachineLoopInfo>();
if (MLI->isLoopHeader(Succ))
return NULL;
MachineBasicBlock *NMBB = MF->CreateMachineBasicBlock();
MF->insert(llvm::next(MachineFunction::iterator(this)), NMBB);
DEBUG(dbgs() << "PHIElimination splitting critical edge:"
@ -471,8 +479,7 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
P->getAnalysisIfAvailable<MachineDominatorTree>())
MDT->addNewBlock(NMBB, this);
if (MachineLoopInfo *MLI =
P->getAnalysisIfAvailable<MachineLoopInfo>())
if (MLI)
if (MachineLoop *TIL = MLI->getLoopFor(this)) {
// If one or the other blocks were not in a loop, the new block is not
// either, and thus LI doesn't need to be updated.