diff options
author | Owen Anderson <resistor@mac.com> | 2008-05-13 13:41:23 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-05-13 13:41:23 +0000 |
commit | 16db1f70b780db099972b05ec6418a3f82d46d91 (patch) | |
tree | 32f4341153ddc2f58c308eda6faac62b03220ee5 | |
parent | 0e68771536a8a3f92b81b6d57011eadf010a4fd7 (diff) |
Make the non-local CSE safety checks slightly more thorough.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51035 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/GVN.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index ba7f8b37d8..3333ecdc79 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -443,7 +443,7 @@ uint32_t ValueTable::lookup_or_add(Value* V) { DenseMap<BasicBlock*, Value*> deps; MD->getNonLocalDependency(C, deps); - Value* dep = 0; + CallInst* cdep = 0; for (DenseMap<BasicBlock*, Value*>::iterator I = deps.begin(), E = deps.end(); I != E; ++I) { @@ -453,22 +453,24 @@ uint32_t ValueTable::lookup_or_add(Value* V) { return nextValueNumber++; } else if (I->second != MemoryDependenceAnalysis::NonLocal) { if (DT->dominates(I->first, C->getParent())) { - dep = I->second; + if (CallInst* CD = dyn_cast<CallInst>(I->second)) + cdep = CD; + else { + valueNumbering.insert(std::make_pair(V, nextValueNumber)); + return nextValueNumber++; + } } else { valueNumbering.insert(std::make_pair(V, nextValueNumber)); - return nextValueNumber++; } } } - if (!dep || !isa<CallInst>(dep)) { + if (!cdep) { valueNumbering.insert(std::make_pair(V, nextValueNumber)); return nextValueNumber++; } - CallInst* cdep = cast<CallInst>(dep); - if (cdep->getCalledFunction() != C->getCalledFunction() || cdep->getNumOperands() != C->getNumOperands()) { valueNumbering.insert(std::make_pair(V, nextValueNumber)); |