slightly improve mod/ref for DSAA by checking the globals graph for fallback
authorChris Lattner <sabre@nondot.org>
Sat, 26 Mar 2005 22:47:03 +0000 (22:47 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 26 Mar 2005 22:47:03 +0000 (22:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20868 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructureAA.cpp

index 6f1cb56d860b3d2683338e1306ba3e0166a86172..c2449c2b74ab614ffd7f42e28fa91ee4f0d4ff36 100644 (file)
@@ -222,6 +222,18 @@ DSAA::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
     cast<GlobalVariable>(P)->getType()->getElementType()->isFirstClassType() &&
              "This isn't a global that DSA inconsiderately dropped "
              "from the graph?");
+
+      DSGraph &GG = *CallerTDGraph.getGlobalsGraph();
+      DSScalarMap::iterator NI = GG.getScalarMap().find(P);
+      if (NI != GG.getScalarMap().end() && !NI->second.isNull()) {
+        // Otherwise, if the node is only M or R, return this.  This can be
+        // useful for globals that should be marked const but are not.
+        DSNode *N = NI->second.getNode();
+        if (!N->isModified())
+          Result = (ModRefResult)(Result & ~Mod);
+        if (!N->isRead())
+          Result = (ModRefResult)(Result & ~Ref);
+      }
     }
     return Result;
   }