aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-25 23:36:08 +0000
committerChris Lattner <sabre@nondot.org>2004-02-25 23:36:08 +0000
commitcf14e71c5e6efdf4323b150cc52a5411a2ce6e4d (patch)
treeb2f6acb50b719f0e0a15c95dc1f844a0f68c0b97
parent26b6dac640907dd79fc88b366ef53110309a2201 (diff)
Two changes:
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
-rw-r--r--lib/Analysis/DataStructure/DataStructure.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp
index 3339d6152f..686655637b 100644
--- a/lib/Analysis/DataStructure/DataStructure.cpp
+++ b/lib/Analysis/DataStructure/DataStructure.cpp
@@ -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) {