summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2007-12-10 08:07:09 +0000
committerOwen Anderson <resistor@mac.com>2007-12-10 08:07:09 +0000
commitba61806ef120d6a1805154430106fa3a0e93d2ad (patch)
treebd907deb0269cdfe820b3485812adc3ffe9bb00c
parentd202e03fe56ca9c95ee20060f293f77cc2d77160 (diff)
downloadbcm5719-llvm-ba61806ef120d6a1805154430106fa3a0e93d2ad.tar.gz
bcm5719-llvm-ba61806ef120d6a1805154430106fa3a0e93d2ad.zip
A little more progress on StrongPHIElimination, now that I have a better sense of
how the CodeGen machinery works. llvm-svn: 44786
-rw-r--r--llvm/lib/CodeGen/StrongPHIElimination.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/llvm/lib/CodeGen/StrongPHIElimination.cpp b/llvm/lib/CodeGen/StrongPHIElimination.cpp
index d023b59277a..fa7c10cf60c 100644
--- a/llvm/lib/CodeGen/StrongPHIElimination.cpp
+++ b/llvm/lib/CodeGen/StrongPHIElimination.cpp
@@ -39,6 +39,9 @@ namespace {
static char ID; // Pass identification, replacement for typeid
StrongPHIElimination() : MachineFunctionPass((intptr_t)&ID) {}
+ DenseMap<MachineBasicBlock*,
+ SmallVector<std::pair<unsigned, unsigned>, 2> > Waiting;
+
bool runOnMachineFunction(MachineFunction &Fn);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
@@ -263,6 +266,8 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
while (P->getOpcode() == TargetInstrInfo::PHI) {
LiveVariables::VarInfo& PHIInfo = LV.getVarInfo(P->getOperand(0).getReg());
+ unsigned DestReg = P->getOperand(0).getReg();
+
// Hold the names that are currently in the candidate set.
std::set<unsigned> PHIUnion;
std::set<MachineBasicBlock*> UnionedBlocks;
@@ -271,17 +276,17 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
unsigned SrcReg = P->getOperand(i-1).getReg();
LiveVariables::VarInfo& SrcInfo = LV.getVarInfo(SrcReg);
- if (isLiveIn(SrcInfo, P->getParent())) {
+ // Check for trivial interferences
+ if (isLiveIn(SrcInfo, P->getParent()) ||
+ isLiveOut(PHIInfo, SrcInfo.DefInst->getParent()) ||
+ ( PHIInfo.DefInst->getOpcode() == TargetInstrInfo::PHI &&
+ isLiveIn(PHIInfo, SrcInfo.DefInst->getParent()) ) ||
+ ProcessedNames.count(SrcReg) ||
+ UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
+
// add a copy from a_i to p in Waiting[From[a_i]]
- } else if (isLiveOut(PHIInfo, SrcInfo.DefInst->getParent())) {
- // add a copy to Waiting[From[a_i]]
- } else if (PHIInfo.DefInst->getOpcode() == TargetInstrInfo::PHI &&
- isLiveIn(PHIInfo, SrcInfo.DefInst->getParent())) {
- // add a copy to Waiting[From[a_i]]
- } else if (ProcessedNames.count(SrcReg)) {
- // add a copy to Waiting[From[a_i]]
- } else if (UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
- // add a copy to Waiting[From[a_i]]
+ MachineBasicBlock* From = P->getOperand(i).getMachineBasicBlock();
+ Waiting[From].push_back(std::make_pair(SrcReg, DestReg));
} else {
PHIUnion.insert(SrcReg);
UnionedBlocks.insert(SrcInfo.DefInst->getParent());
@@ -291,7 +296,7 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
std::vector<StrongPHIElimination::DomForestNode*> DF =
computeDomForest(PHIUnion);
- // DO STUFF HERE
+ // Walk DomForest to resolve interferences
ProcessedNames.insert(PHIUnion.begin(), PHIUnion.end());
++P;
OpenPOWER on IntegriCloud