aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/PHIElimination.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2009-11-14 00:38:13 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2009-11-14 00:38:13 +0000
commit3b6ced15108909de2fab0766fc693fe66c48ab68 (patch)
treec2a3cd7195bc079f344d3505430ec8c170e18f25 /lib/CodeGen/PHIElimination.cpp
parent9aebb61daf4d787aa7dcff9e3caa89bac88e11d1 (diff)
Fix bug in -split-phi-edges.
When splitting an edge after a machine basic block with fall-through, we forgot to insert a jump instruction. Fix this by calling updateTerminator() on the fall-through block when relevant. Also be more precise in PHIElimination::isLiveIn. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@88728 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/PHIElimination.cpp')
-rw-r--r--lib/CodeGen/PHIElimination.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/CodeGen/PHIElimination.cpp b/lib/CodeGen/PHIElimination.cpp
index e42d7a5a8c..cb0211f38d 100644
--- a/lib/CodeGen/PHIElimination.cpp
+++ b/lib/CodeGen/PHIElimination.cpp
@@ -64,7 +64,6 @@ bool llvm::PHIElimination::runOnMachineFunction(MachineFunction &Fn) {
PHIDefs.clear();
PHIKills.clear();
-
bool Changed = false;
// Split critical edges to help the coalescer
@@ -419,7 +418,16 @@ bool llvm::PHIElimination::isLiveIn(unsigned Reg, const MachineBasicBlock &MBB,
LiveVariables &LV) {
LiveVariables::VarInfo &VI = LV.getVarInfo(Reg);
- return VI.AliveBlocks.test(MBB.getNumber()) || VI.findKill(&MBB);
+ if (VI.AliveBlocks.test(MBB.getNumber()))
+ return true;
+
+ // defined in MBB?
+ const MachineInstr *Def = MRI->getVRegDef(Reg);
+ if (Def && Def->getParent() == &MBB)
+ return false;
+
+ // killed in MBB?
+ return VI.findKill(&MBB);
}
MachineBasicBlock *PHIElimination::SplitCriticalEdge(MachineBasicBlock *A,
@@ -436,9 +444,12 @@ MachineBasicBlock *PHIElimination::SplitCriticalEdge(MachineBasicBlock *A,
<< " -- BB#" << B->getNumber() << '\n');
A->ReplaceUsesOfBlockWith(B, NMBB);
- NMBB->addSuccessor(B);
+ // If A may fall through to B, we may have to insert a branch.
+ if (A->isLayoutSuccessor(B))
+ A->updateTerminator();
// Insert unconditional "jump B" instruction in NMBB.
+ NMBB->addSuccessor(B);
SmallVector<MachineOperand, 4> Cond;
MF->getTarget().getInstrInfo()->InsertBranch(*NMBB, B, NULL, Cond);