Implement review feedback from Devang: make use
authorDuncan Sands <baldrick@free.fr>
Sat, 20 Sep 2008 16:45:58 +0000 (16:45 +0000)
committerDuncan Sands <baldrick@free.fr>
Sat, 20 Sep 2008 16:45:58 +0000 (16:45 +0000)
of mayReadFromMemory and mayWriteToMemory.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56387 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/AddReadAttrs.cpp

index 1052e06b72f76d3318025a2482ee37bec06def83..8f7fd6e6a8c7bc54e5298f25aaf4b0de6f8accac 100644 (file)
@@ -54,7 +54,7 @@ bool AddReadAttrs::runOnSCC(const std::vector<CallGraphNode *> &SCC) {
     Function *F = SCC[i]->getFunction();
 
     if (F == 0)
-      // May write memory.
+      // External node - may write memory.
       return false;
 
     if (F->doesNotAccessMemory())
@@ -72,34 +72,19 @@ bool AddReadAttrs::runOnSCC(const std::vector<CallGraphNode *> &SCC) {
       continue;
     }
 
-    // Scan the function body for explicit loads and stores, or calls to
-    // functions that may read or write memory.
+    // Scan the function body for instructions that may read or write memory.
     for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) {
-      Instruction *I = &*II;
-      if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
-        if (LI->isVolatile())
-          // Volatile loads may have side-effects, so treat them as writing
-          // memory.
-          return false;
-        ReadsMemory = true;
-      } else if (isa<StoreInst>(I) || isa<MallocInst>(I) || isa<FreeInst>(I)) {
-        // Writes memory.
-        return false;
-      } else if (isa<CallInst>(I) || isa<InvokeInst>(I)) {
-        CallSite CS(I);
-
-        if (std::find(SCC.begin(), SCC.end(), CG[CS.getCalledFunction()]) !=
-            SCC.end())
-          // The callee is inside our current SCC - ignore it.
-          continue;
+      CallSite CS = CallSite::get(&*II);
 
-        if (!CS.onlyReadsMemory())
-          // May write memory.
-          return false;
+      // Ignore calls to functions in the same SCC.
+      if (CS.getInstruction() &&
+          std::find(SCC.begin(), SCC.end(), CG[CS.getCalledFunction()]) !=
+          SCC.end())
+        continue;
 
-        if (!CS.doesNotAccessMemory())
-          ReadsMemory = true;
-      }
+      if (II->mayWriteToMemory())
+        return false;
+      ReadsMemory |= II->mayReadFromMemory();
     }
   }