Author: resistor Date: Tue Aug 7 18:12:31 2007 New Revision: 40909 URL: http://llvm.org/viewvc/llvm-project?rev=40909&view=rev Log: Don't insert nearly as many redundant phi nodes.
Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=40909&r1=40908&r2=40909&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Tue Aug 7 18:12:31 2007 @@ -642,6 +642,10 @@ DenseMap<BasicBlock*, ValueNumberedSet> availableOut; + typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType; + PhiMapType phiMap; + + // This transformation requires dominator postdominator info virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); @@ -780,6 +784,7 @@ return first; } + phiMap[orig->getPointerOperand()].insert(PN); return PN; } @@ -791,6 +796,7 @@ MD.getNonLocalDependency(L, deps); DenseMap<BasicBlock*, Value*> repl; + for (DenseMap<BasicBlock*, Value*>::iterator I = deps.begin(), E = deps.end(); I != E; ++I) if (I->second == MemoryDependenceAnalysis::None) { @@ -799,24 +805,40 @@ continue; }else if (StoreInst* S = dyn_cast<StoreInst>(I->second)) { if (S->getPointerOperand() == L->getPointerOperand()) - repl.insert(std::make_pair(I->first, S->getOperand(0))); + repl[I->first] = S->getOperand(0); else return false; } else if (LoadInst* LD = dyn_cast<LoadInst>(I->second)) { if (LD->getPointerOperand() == L->getPointerOperand()) - repl.insert(std::make_pair(I->first, LD)); + repl[I->first] = LD; else return false; } else { return false; } + SmallPtrSet<Instruction*, 4>& p = phiMap[L->getPointerOperand()]; + for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end(); + I != E; ++I) { + if ((*I)->getParent() == L->getParent()) { + MD.removeInstruction(L); + L->replaceAllUsesWith(*I); + toErase.push_back(L); + NumGVNLoad++; + + return true; + } else { + repl.insert(std::make_pair((*I)->getParent(), *I)); + } + } + SmallPtrSet<BasicBlock*, 4> visited; Value* v = GetValueForBlock(L->getParent(), L, repl, true); MD.removeInstruction(L); L->replaceAllUsesWith(v); toErase.push_back(L); + NumGVNLoad++; return true; } @@ -917,6 +939,7 @@ // Clean out global sets from any previous functions VN.clear(); availableOut.clear(); + phiMap.clear(); bool changed_function = false; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits