Two changes:
authorChris Lattner <sabre@nondot.org>
Wed, 25 Feb 2004 23:36:08 +0000 (23:36 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 25 Feb 2004 23:36:08 +0000 (23:36 +0000)
 1. Functions do not make things incomplete, only variables
 2. Constant global variables no longer need to be marked incomplete, because
    we are guaranteed that the initializer for the global will be in the
    graph we are hacking on now.  This makes resolution of indirect calls happen
    a lot more in the bu pass, supports things like vtables and the C counterparts
    (giant constant arrays of function pointers), etc...

Testcase here: test/Regression/Analysis/DSGraph/constant_globals.ll

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

lib/Analysis/DataStructure/DataStructure.cpp

index 3339d6152f007d472ca6a5a7553a5db0ff80ede1..686655637be5ebccaa86a2cca4bb469ed4def384 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "llvm/Analysis/DSGraph.h"
 #include "llvm/Function.h"
+#include "llvm/GlobalVariable.h"
 #include "llvm/iOther.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Target/TargetData.h"
@@ -1353,7 +1354,9 @@ void DSGraph::markIncompleteNodes(unsigned Flags) {
   if ((Flags & DSGraph::IgnoreGlobals) == 0)
     for (DSScalarMap::global_iterator I = ScalarMap.global_begin(),
            E = ScalarMap.global_end(); I != E; ++I)
-      markIncompleteNode(ScalarMap[*I].getNode());
+      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I))
+        if (!GV->isConstant())
+          markIncompleteNode(ScalarMap[GV].getNode());
 }
 
 static inline void killIfUselessEdge(DSNodeHandle &Edge) {