diff options
author | Chris Lattner <sabre@nondot.org> | 2005-03-23 01:48:09 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-03-23 01:48:09 +0000 |
commit | 943814bb01682da176034c609556a12a07310961 (patch) | |
tree | 30cdef7c4bcc90464b79069baaf8e6e0a4fa4fc3 /lib/Analysis | |
parent | 9532ab98392d28abd190c82f110cdadcf3068a59 (diff) |
Make -steens-aa more conservative (aka correct) by making sure to obey
incompleteness flags.
Make it more aggressive by taking field sensitive information into
account.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20781 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/DataStructure/Steensgaard.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/Analysis/DataStructure/Steensgaard.cpp b/lib/Analysis/DataStructure/Steensgaard.cpp index 17863d1ce0..a80a3e6676 100644 --- a/lib/Analysis/DataStructure/Steensgaard.cpp +++ b/lib/Analysis/DataStructure/Steensgaard.cpp @@ -192,21 +192,31 @@ AliasAnalysis::AliasResult Steens::alias(const Value *V1, unsigned V1Size, DSGraph::ScalarMapTy &GSM = ResultGraph->getScalarMap(); DSGraph::ScalarMapTy::iterator I = GSM.find(const_cast<Value*>(V1)); - if (I != GSM.end() && I->second.getNode()) { + if (I != GSM.end() && !I->second.isNull() && + I->second.getNode()->isComplete()) { DSNodeHandle &V1H = I->second; DSGraph::ScalarMapTy::iterator J=GSM.find(const_cast<Value*>(V2)); - if (J != GSM.end() && J->second.getNode()) { + if (J != GSM.end() && !J->second.isNull() && + 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()) // FIXME: Handle incompleteness! + if (V1H.getNode() != V2H.getNode()) return NoAlias; - // FIXME: If the two pointers point to the same node, and the offsets are - // different, and the LinkIndex vector doesn't alias the section, then the - // two pointers do not alias. We need access size information for the two - // accesses though! - // + // See if they point to different offsets... if so, we may be able to + // determine that they do not alias... + unsigned O1 = I->second.getOffset(), O2 = J->second.getOffset(); + if (O1 != O2) { + if (O2 < O1) { // Ensure that O1 <= O2 + std::swap(V1, V2); + std::swap(O1, O2); + std::swap(V1Size, V2Size); + } + + if (O1+V1Size <= O2) + return NoAlias; + } } } |