diff options
author | Owen Anderson <resistor@mac.com> | 2007-11-13 20:04:45 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-11-13 20:04:45 +0000 |
commit | 17b1418bead13b5f78764f1435fc514475123dfc (patch) | |
tree | 517c4d7a8ff7095493c8548d18805ffac4cad33a | |
parent | 660c5b951493c7e9a70279a95511211d89a0ca97 (diff) |
Preserve LiveVariables when doing critical edge splitting.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44063 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/StrongPHIElimination.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index 3d5ee9fb3c..a1654deceb 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/lib/CodeGen/StrongPHIElimination.cpp @@ -26,6 +26,7 @@ #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/SSARegMap.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/ADT/Statistic.h" @@ -296,12 +297,15 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) { } } +/// breakCriticalEdges - Break critical edges coming into blocks with PHI +/// nodes, preserving dominator and livevariable info. void StrongPHIElimination::breakCriticalEdges(MachineFunction &Fn) { typedef std::pair<MachineBasicBlock*, MachineBasicBlock*> MBB_pair; MachineDominatorTree& MDT = getAnalysis<MachineDominatorTree>(); - //LiveVariables& LV = getAnalysis<LiveVariables>(); + LiveVariables& LV = getAnalysis<LiveVariables>(); + // Find critical edges std::vector<MBB_pair> criticals; for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) if (!I->empty() && @@ -314,9 +318,16 @@ void StrongPHIElimination::breakCriticalEdges(MachineFunction &Fn) { for (std::vector<MBB_pair>::iterator I = criticals.begin(), E = criticals.end(); I != E; ++I) { - SplitCriticalMachineEdge(I->first, I->second); + // Split the edge + MachineBasicBlock* new_bb = SplitCriticalMachineEdge(I->first, I->second); + // Update dominators MDT.splitBlock(I->first); + + // Update livevariables + for (unsigned var = 1024; var < Fn.getSSARegMap()->getLastVirtReg(); ++var) + if (isLiveOut(LV.getVarInfo(var), I->first)) + LV.getVarInfo(var).AliveBlocks.set(new_bb->getNumber()); } } |