aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/PHIElimination.h
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2009-11-11 19:31:31 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2009-11-11 19:31:31 +0000
commit3e20475feebca3bfb29375ac7f3e5acbeb2a95c8 (patch)
treeab6b159d6b6c15d5278703254f21998e6f66e0d1 /lib/CodeGen/PHIElimination.h
parenteba4ed9cbb8dc4d478c71b5cbe5b846ac79c105d (diff)
Fix liveness calculation when splitting critical edges during PHI elimination.
- Edges are split before any phis are eliminated, so the code is SSA. - Create a proper IR BasicBlock for the split edges. - LiveVariables::addNewBlock now has same syntax as MachineDominatorTree::addNewBlock. Algorithm calculates predecessor live-out set rather than successor live-in set. This feature still causes some miscompilations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86867 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/PHIElimination.h')
-rw-r--r--lib/CodeGen/PHIElimination.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/CodeGen/PHIElimination.h b/lib/CodeGen/PHIElimination.h
index 8188440c89..edc2d36670 100644
--- a/lib/CodeGen/PHIElimination.h
+++ b/lib/CodeGen/PHIElimination.h
@@ -90,7 +90,7 @@ namespace llvm {
void analyzePHINodes(const MachineFunction& Fn);
/// Split critical edges where necessary for good coalescer performance.
- void SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB);
+ bool SplitPHIEdges(MachineFunction &MF, MachineBasicBlock &MBB);
/// isLiveOut - Determine if Reg is live out from MBB, when not
/// considering PHI nodes. This means that Reg is either killed by
@@ -98,6 +98,12 @@ namespace llvm {
bool isLiveOut(unsigned Reg, const MachineBasicBlock &MBB,
LiveVariables &LV);
+ /// isLiveIn - Determine if Reg is live in to MBB, not considering PHI
+ /// source registers. This means that Reg is either killed by MBB or passes
+ /// through it.
+ bool isLiveIn(unsigned Reg, const MachineBasicBlock &MBB,
+ LiveVariables &LV);
+
/// SplitCriticalEdge - Split a critical edge from A to B by
/// inserting a new MBB. Update branches in A and PHI instructions
/// in B. Return the new block.