[llvm-commits] [llvm] r55714 - /llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp

Duncan Sands baldrick at free.fr
Wed Sep 3 12:37:17 PDT 2008


Author: baldrick
Date: Wed Sep  3 14:37:16 2008
New Revision: 55714

URL: http://llvm.org/viewvc/llvm-project?rev=55714&view=rev
Log:
If a SCC has a node without a function, then the SCC
analysis would bail out without removing function
records for other members of the SCC (which may exist
if those functions read or wrote global variables).
Since these are initialized to "readnone", this
resulted in incorrect alias analysis results.

Modified:
    llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp

Modified: llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp?rev=55714&r1=55713&r2=55714&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp (original)
+++ llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp Wed Sep  3 14:37:16 2008
@@ -354,13 +354,18 @@
   for (scc_iterator<CallGraph*> I = scc_begin(&CG), E = scc_end(&CG); I != E;
        ++I) {
     std::vector<CallGraphNode *> &SCC = *I;
-    assert(!SCC.empty() && "SCC with no functions?");
 
-    if (!SCC[0]->getFunction())
-      // Do not process the external node, assume the worst.
-      continue;
+    FunctionRecord *FR = 0;
+    // Find a function record from the SCC (it doesn't matter which one).
+    for (unsigned i = 0, e = SCC.size(); i != e; ++i)
+      if (Function *F = SCC[i]->getFunction()) {
+        FR = &FunctionInfo[F];
+        break;
+      }
 
-    FunctionRecord &FR = FunctionInfo[SCC[0]->getFunction()];
+    if (!FR)
+      // Nothing to do.
+      continue;
 
     bool KnowNothing = false;
     unsigned FunctionEffect = 0;
@@ -384,7 +389,7 @@
           // mark all globals read somewhere as being read by this function.
           for (std::set<GlobalValue*>::iterator GI = ReadGlobals.begin(),
                E = ReadGlobals.end(); GI != E; ++GI)
-            FR.GlobalInfo[*GI] |= Ref;
+            FR->GlobalInfo[*GI] |= Ref;
         } else {
           // Can't say anything useful.
           KnowNothing = true;
@@ -403,7 +408,7 @@
             for (std::map<GlobalValue*, unsigned>::iterator GI =
                    CalleeFR->GlobalInfo.begin(), E = CalleeFR->GlobalInfo.end();
                  GI != E; ++GI)
-              FR.GlobalInfo[GI->first] |= GI->second;
+              FR->GlobalInfo[GI->first] |= GI->second;
           } else {
             // Can't say anything about it.  However, if it is inside our SCC,
             // then nothing needs to be done.
@@ -440,12 +445,12 @@
       ++NumReadMemFunctions;
     if (FunctionEffect == 0)
       ++NumNoMemFunctions;
-    FR.FunctionEffect = FunctionEffect;
+    FR->FunctionEffect = FunctionEffect;
 
     // Finally, now that we know the full effect on this SCC, clone the
     // information to each function in the SCC.
     for (unsigned i = 1, e = SCC.size(); i != e; ++i)
-      FunctionInfo[SCC[i]->getFunction()] = FR;
+      FunctionInfo[SCC[i]->getFunction()] = *FR;
   }
 }
 





More information about the llvm-commits mailing list