From b70a571c99932464ed828fa425ea1e2783d08fab Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Mon, 23 Jun 2008 17:49:45 +0000 Subject: [PATCH] Tighten the conditions under which we do PRE, remove some unneeded code, and correct our preserved analyses list, since we do now change the CFG by splitting critical edges during PRE. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52631 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/GVN.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index 26dec0fa9a0..9d9dcca2474 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -719,10 +719,11 @@ namespace { // This transformation requires dominator postdominator info virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesCFG(); AU.addRequired(); AU.addRequired(); AU.addRequired(); + + AU.addPreserved(); AU.addPreserved(); AU.addPreserved(); } @@ -1019,7 +1020,11 @@ bool GVN::processLoad(LoadInst *L, DenseMap &lastLoad, } Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) { - ValueNumberScope* locals = localAvail[BB]; + DenseMap::iterator I = localAvail.find(BB); + if (I == localAvail.end()) + return 0; + + ValueNumberScope* locals = I->second; while (locals) { DenseMap::iterator I = locals->table.find(num); @@ -1167,9 +1172,9 @@ bool GVN::performPRE(Function& F) { for (BasicBlock::iterator BI = CurrentBlock->begin(), BE = CurrentBlock->end(); BI != BE; ) { - if (isa(BI) || isa(BI) || - isa(BI) || isa(BI) || - isa(BI) || isa(BI)) { + if (isa(BI) || isa(BI) || + isa(BI) || BI->mayReadFromMemory() || + BI->mayWriteToMemory()) { BI++; continue; } @@ -1282,13 +1287,6 @@ bool GVN::performPRE(Function& F) { Phi->addIncoming(predMap[*PI], *PI); VN.add(Phi, valno); - - // The newly created PHI completely replaces the old instruction, - // so we need to update the maps to reflect this. - DomTreeNode* DTN = getAnalysis()[CurrentBlock]; - for (DomTreeNode::iterator UI = DTN->begin(), UE = DTN->end(); - UI != UE; ++UI) - localAvail[(*UI)->getBlock()]->table[valno] = Phi; localAvail[CurrentBlock]->table[valno] = Phi; BI->replaceAllUsesWith(Phi); -- 2.34.1