[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/Steensgaard.cpp

Chris Lattner lattner at cs.uiuc.edu
Sat Mar 26 14:43:36 PST 2005



Changes in directory llvm/lib/Analysis/DataStructure:

Steensgaard.cpp updated: 1.56 -> 1.57
---
Log message:

Teach steens-aa two things about mod/ref information:
  1. If memory never escapes the program, it cannot be mod/ref'd by external 
     functions.
  2. If memory is global never mod/ref'd in the program, it cannot be mod/ref'd
     by any call.


---
Diffs of the changes:  (+33 -3)

 Steensgaard.cpp |   36 +++++++++++++++++++++++++++++++++---
 1 files changed, 33 insertions(+), 3 deletions(-)


Index: llvm/lib/Analysis/DataStructure/Steensgaard.cpp
diff -u llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.56 llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.57
--- llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.56	Thu Mar 24 12:42:28 2005
+++ llvm/lib/Analysis/DataStructure/Steensgaard.cpp	Sat Mar 26 16:43:20 2005
@@ -62,10 +62,11 @@
     // Implement the AliasAnalysis API
     //  
 
-    // alias - This is the only method here that does anything interesting...
     AliasResult alias(const Value *V1, unsigned V1Size,
                       const Value *V2, unsigned V2Size);
-    
+
+    ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size);
+
   private:
     void ResolveFunctionCall(Function *F, const DSCallSite &Call,
                              DSNodeHandle &RetVal);
@@ -183,7 +184,6 @@
   return false;
 }
 
-// alias - This is the only method here that does anything interesting...
 AliasAnalysis::AliasResult Steens::alias(const Value *V1, unsigned V1Size,
                                          const Value *V2, unsigned V2Size) {
   assert(ResultGraph && "Result graph has not been computed yet!");
@@ -224,3 +224,33 @@
   //
   return AliasAnalysis::alias(V1, V1Size, V2, V2Size);
 }
+
+AliasAnalysis::ModRefResult
+Steens::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
+  AliasAnalysis::ModRefResult Result = ModRef;
+  
+  // Find the node in question.
+  DSGraph::ScalarMapTy &GSM = ResultGraph->getScalarMap();
+  DSGraph::ScalarMapTy::iterator I = GSM.find(P);
+  
+  if (I != GSM.end() && !I->second.isNull()) {
+    DSNode *N = I->second.getNode();
+    if (N->isComplete()) {
+      // If this is a direct call to an external function, and if the pointer
+      // points to a complete node, the external function cannot modify or read
+      // the value (we know it's not passed out of the program!).
+      if (Function *F = CS.getCalledFunction())
+        if (F->isExternal())
+          return NoModRef;
+    
+      // Otherwise, if the node is complete, but it is only M or R, return this.
+      // This can be useful for globals that should be marked const but are not.
+      if (!N->isModified())
+        Result = (ModRefResult)(Result & ~Mod);
+      if (!N->isRead())
+        Result = (ModRefResult)(Result & ~Ref);
+    }
+  }
+
+  return (ModRefResult)(Result & AliasAnalysis::getModRefInfo(CS, P, Size));
+}






More information about the llvm-commits mailing list