diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-03-27 21:56:55 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-03-27 21:56:55 +0000 |
| commit | f290da862dbe57fc9d5247ba06a1157a4d80fd1a (patch) | |
| tree | 41025e2ffd14665e52aad4d3bf567a930472c16f /llvm/lib/Analysis/DataStructure/Steensgaard.cpp | |
| parent | ea69f1f9e8f1d8913b61eb6ab79cf0139f1aea51 (diff) | |
| download | bcm5719-llvm-f290da862dbe57fc9d5247ba06a1157a4d80fd1a.tar.gz bcm5719-llvm-f290da862dbe57fc9d5247ba06a1157a4d80fd1a.zip | |
speed up steens by using spliceFrom, improve its precision by realizing that
an incomplete node cannot alias a complete node.
llvm-svn: 20882
Diffstat (limited to 'llvm/lib/Analysis/DataStructure/Steensgaard.cpp')
| -rw-r--r-- | llvm/lib/Analysis/DataStructure/Steensgaard.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/DataStructure/Steensgaard.cpp b/llvm/lib/Analysis/DataStructure/Steensgaard.cpp index 0d63c645a05..aa7f54b8904 100644 --- a/llvm/lib/Analysis/DataStructure/Steensgaard.cpp +++ b/llvm/lib/Analysis/DataStructure/Steensgaard.cpp @@ -124,7 +124,7 @@ bool Steens::runOnModule(Module &M) { // for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) if (!I->isExternal()) - ResultGraph->cloneInto(LDS.getDSGraph(*I)); + ResultGraph->spliceFrom(LDS.getDSGraph(*I)); ResultGraph->removeTriviallyDeadNodes(); @@ -191,13 +191,18 @@ AliasAnalysis::AliasResult Steens::alias(const Value *V1, unsigned V1Size, DSGraph::ScalarMapTy &GSM = ResultGraph->getScalarMap(); DSGraph::ScalarMapTy::iterator I = GSM.find(const_cast<Value*>(V1)); + DSGraph::ScalarMapTy::iterator J = GSM.find(const_cast<Value*>(V2)); if (I != GSM.end() && !I->second.isNull() && - I->second.getNode()->isComplete()) { + J != GSM.end() && !J->second.isNull()) { DSNodeHandle &V1H = I->second; - DSGraph::ScalarMapTy::iterator J=GSM.find(const_cast<Value*>(V2)); - if (J != GSM.end() && !J->second.isNull() && + DSNodeHandle &V2H = J->second; + + // If at least one of the nodes is complete, we can say something about + // this. If one is complete and the other isn't, then they are obviously + // different nodes. If they are both complete, we can't say anything + // useful. + if (I->second.getNode()->isComplete() || J->second.getNode()->isComplete()) { - DSNodeHandle &V2H = J->second; // If the two pointers point to different data structure graph nodes, they // cannot alias! if (V1H.getNode() != V2H.getNode()) |

