Make -steens-aa more conservative (aka correct) by making sure to obey
authorChris Lattner <sabre@nondot.org>
Wed, 23 Mar 2005 01:48:09 +0000 (01:48 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 23 Mar 2005 01:48:09 +0000 (01:48 +0000)
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

lib/Analysis/DataStructure/Steensgaard.cpp

index 17863d1ce0bb54154b6c3d07d32ad5053ad1b211..a80a3e66764c5ab6039d8a203ecc980b1bfae78f 100644 (file)
@@ -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;
+      }
     }
   }