From 241f65321efc6ad84ed875cd9494df8ca1cff309 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Thu, 17 Apr 2008 05:36:50 +0000 Subject: [PATCH] Make GVN able to remove unnecessary calls to read-only functions again. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49842 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/MemoryDependenceAnalysis.cpp | 3 +- lib/Transforms/Scalar/GVN.cpp | 46 ++++++++++++------- .../{const-dce.ll => pure-const-dce.ll} | 2 +- 3 files changed, 32 insertions(+), 19 deletions(-) rename test/Analysis/BasicAA/{const-dce.ll => pure-const-dce.ll} (99%) diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp index 314d6e4b3a7..161c2fed1c7 100644 --- a/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -134,8 +134,7 @@ Instruction* MemoryDependenceAnalysis::getCallSiteDependency(CallSite C, } else if (isa(QI)) { AliasAnalysis::ModRefBehavior result = AA.getModRefBehavior(CallSite::get(QI)); - if (result != AliasAnalysis::DoesNotAccessMemory && - result != AliasAnalysis::OnlyReadsMemory) { + if (result != AliasAnalysis::DoesNotAccessMemory) { if (!start && !block) { cachedResult.first = QI; cachedResult.second = true; diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index b33d3af31fc..bd360520a70 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -135,6 +135,7 @@ namespace { DenseMap valueNumbering; DenseMap expressionNumbering; AliasAnalysis* AA; + MemoryDependenceAnalysis* MD; uint32_t nextValueNumber; @@ -159,6 +160,7 @@ namespace { void erase(Value* v); unsigned size(); void setAliasAnalysis(AliasAnalysis* A) { AA = A; } + void setMemDep(MemoryDependenceAnalysis* M) { MD = M; } }; } @@ -432,6 +434,33 @@ uint32_t ValueTable::lookup_or_add(Value* V) { return nextValueNumber++; } + } else if (AA->onlyReadsMemory(C)) { + Expression e = create_expression(C); + + Instruction* dep = MD->getDependency(C); + + if (dep == MemoryDependenceAnalysis::NonLocal || + !isa(dep)) { + expressionNumbering.insert(std::make_pair(e, nextValueNumber)); + valueNumbering.insert(std::make_pair(V, nextValueNumber)); + + return nextValueNumber++; + } + + CallInst* cdep = cast(dep); + Expression d_exp = create_expression(cdep); + + if (e != d_exp) { + expressionNumbering.insert(std::make_pair(e, nextValueNumber)); + valueNumbering.insert(std::make_pair(V, nextValueNumber)); + + return nextValueNumber++; + } else { + uint32_t v = expressionNumbering[d_exp]; + valueNumbering.insert(std::make_pair(V, v)); + return v; + } + } else { valueNumbering.insert(std::make_pair(V, nextValueNumber)); return nextValueNumber++; @@ -993,22 +1022,6 @@ bool GVN::processInstruction(Instruction *I, ValueNumberedSet &currAvail, } else if (currAvail.test(num)) { Value* repl = find_leader(currAvail, num); - if (CallInst* CI = dyn_cast(I)) { - AliasAnalysis& AA = getAnalysis(); - if (!AA.doesNotAccessMemory(CI)) { - MemoryDependenceAnalysis& MD = getAnalysis(); - if (cast(repl)->getParent() != CI->getParent() || - MD.getDependency(CI) != MD.getDependency(cast(repl))) { - // There must be an intervening may-alias store, so nothing from - // this point on will be able to be replaced with the preceding call - currAvail.erase(repl); - currAvail.insert(I); - - return false; - } - } - } - // Remove it! MemoryDependenceAnalysis& MD = getAnalysis(); MD.removeInstruction(I); @@ -1030,6 +1043,7 @@ bool GVN::processInstruction(Instruction *I, ValueNumberedSet &currAvail, // bool GVN::runOnFunction(Function& F) { VN.setAliasAnalysis(&getAnalysis()); + VN.setMemDep(&getAnalysis()); bool changed = false; bool shouldContinue = true; diff --git a/test/Analysis/BasicAA/const-dce.ll b/test/Analysis/BasicAA/pure-const-dce.ll similarity index 99% rename from test/Analysis/BasicAA/const-dce.ll rename to test/Analysis/BasicAA/pure-const-dce.ll index dcde91434ff..b01b5c5cb81 100644 --- a/test/Analysis/BasicAA/const-dce.ll +++ b/test/Analysis/BasicAA/pure-const-dce.ll @@ -1,5 +1,5 @@ ; RUN: llvm-as < %s | opt -basicaa -gvn | llvm-dis | grep TestConst | count 2 -; RUN: llvm-as < %s | opt -basicaa -gvn | llvm-dis | grep TestPure | count 4 +; RUN: llvm-as < %s | opt -basicaa -gvn | llvm-dis | grep TestPure | count 3 ; RUN: llvm-as < %s | opt -basicaa -gvn | llvm-dis | grep TestNone | count 4 @g = global i32 0 ; [#uses=1] -- 2.34.1