diff options
author | Chris Lattner <sabre@nondot.org> | 2002-03-27 19:45:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-03-27 19:45:12 +0000 |
commit | f4066b3fe15f89912951c902abd522dc2ffe1bf0 (patch) | |
tree | e2a71a1c27598e077b8f89a9764c148484271ce9 /lib/Analysis/DataStructure/FunctionRepBuilder.cpp | |
parent | ea4af65b729eb67dbdd0a5f2be6635433230ccc6 (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.cpp | 26 |
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(); + } } |