aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure/FunctionRepBuilder.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-03-27 19:45:12 +0000
committerChris Lattner <sabre@nondot.org>2002-03-27 19:45:12 +0000
commitf4066b3fe15f89912951c902abd522dc2ffe1bf0 (patch)
treee2a71a1c27598e077b8f89a9764c148484271ce9 /lib/Analysis/DataStructure/FunctionRepBuilder.cpp
parentea4af65b729eb67dbdd0a5f2be6635433230ccc6 (diff)
* Add critical node support
* Optimize graph after building it. This should be unneccesary in the future git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2002 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/DataStructure/FunctionRepBuilder.cpp')
-rw-r--r--lib/Analysis/DataStructure/FunctionRepBuilder.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/lib/Analysis/DataStructure/FunctionRepBuilder.cpp b/lib/Analysis/DataStructure/FunctionRepBuilder.cpp
index 19c406ca0a..e2544c82dc 100644
--- a/lib/Analysis/DataStructure/FunctionRepBuilder.cpp
+++ b/lib/Analysis/DataStructure/FunctionRepBuilder.cpp
@@ -1,4 +1,4 @@
-//===- FunctionRepBuilder.cpp - Build the datastructure graph for a method --===//
+//===- FunctionRepBuilder.cpp - Build the local datastructure graph -------===//
//
// Build the local datastructure graph for a single method.
//
@@ -47,6 +47,9 @@ void InitVisitor::visitOperand(Value *V) {
Rep->Nodes.push_back(N);
Rep->ValueMap[V].add(N);
Rep->addAllUsesToWorkList(GV);
+
+ // FIXME: If the global variable has fields, we should add critical
+ // shadow nodes to represent them!
}
}
@@ -61,9 +64,9 @@ void InitVisitor::visitCallInst(CallInst *CI) {
Rep->CallMap[CI] = C;
if (isa<PointerType>(CI->getType())) {
- // Create a shadow node to represent the memory object that the return
- // value points to...
- ShadowDSNode *Shad = new ShadowDSNode(C, Func->getParent());
+ // Create a critical shadow node to represent the memory object that the
+ // return value points to...
+ ShadowDSNode *Shad = new ShadowDSNode(C, Func->getParent(), true);
Rep->ShadowNodes.push_back(Shad);
// The return value of the function is a pointer to the shadow value
@@ -143,9 +146,9 @@ void FunctionRepBuilder::initializeWorkList(Function *Func) {
ArgDSNode *Arg = new ArgDSNode(*I);
Nodes.push_back(Arg);
- // Add a shadow value for it to represent what it is pointing
+ // Add a critical shadow value for it to represent what it is pointing
// to and add this to the value map...
- ShadowDSNode *Shad = new ShadowDSNode(Arg, Func->getParent());
+ ShadowDSNode *Shad = new ShadowDSNode(Arg, Func->getParent(), true);
ShadowNodes.push_back(Shad);
ValueMap[*I].add(PointerVal(Shad), *I);
@@ -327,5 +330,16 @@ FunctionDSGraph::FunctionDSGraph(Function *F) : Func(F) {
ShadowNodes = Builder.getShadowNodes();
RetNode = Builder.getRetNode();
ValueMap = Builder.getValueMap();
+
+ bool Changed = true;
+ while (Changed) {
+ // Eliminate shadow nodes that are not distinguishable from some other
+ // node in the graph...
+ //
+ Changed = UnlinkUndistinguishableShadowNodes();
+
+ // Eliminate shadow nodes that are now extraneous due to linking...
+ Changed |= RemoveUnreachableShadowNodes();
+ }
}