diff options
author | Chris Lattner <sabre@nondot.org> | 2002-04-17 03:24:59 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-04-17 03:24:59 +0000 |
commit | fe14568a8122b7c9b832795594b7bae11b2b6cc4 (patch) | |
tree | c2d0983f282515c1933de2a3226670d314372071 /lib/Analysis/DataStructure/FunctionRepBuilder.cpp | |
parent | a146183c2105911eade774490650389924dae524 (diff) |
Make data structure acurately get ALL edges, even loads of null fields of
nodes that are not shadow nodes
This fixes em3d to be _correct_ if not optimial
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2274 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/DataStructure/FunctionRepBuilder.cpp')
-rw-r--r-- | lib/Analysis/DataStructure/FunctionRepBuilder.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/Analysis/DataStructure/FunctionRepBuilder.cpp b/lib/Analysis/DataStructure/FunctionRepBuilder.cpp index 6dc2930243..e9b6f199d7 100644 --- a/lib/Analysis/DataStructure/FunctionRepBuilder.cpp +++ b/lib/Analysis/DataStructure/FunctionRepBuilder.cpp @@ -20,22 +20,30 @@ // chain.. // FIXME: This should not take a FunctionRepBuilder as an argument! // -ShadowDSNode *ShadowDSNode::synthesizeNode(const Type *Ty, - FunctionRepBuilder *Rep) { +ShadowDSNode *DSNode::synthesizeNode(const Type *Ty, + FunctionRepBuilder *Rep) { // If we are a derived shadow node, defer to our parent to synthesize the node - if (ShadowParent) return ShadowParent->synthesizeNode(Ty, Rep); + if (ShadowDSNode *Th = dyn_cast<ShadowDSNode>(this)) + if (Th->getShadowParent()) + return Th->getShadowParent()->synthesizeNode(Ty, Rep); // See if we have already synthesized a node of this type... for (unsigned i = 0, e = SynthNodes.size(); i != e; ++i) if (SynthNodes[i].first == Ty) return SynthNodes[i].second; // No we haven't. Do so now and add it to our list of saved nodes... - ShadowDSNode *SN = new ShadowDSNode(Ty, Mod, this); + ShadowDSNode *SN = Rep->makeSynthesizedShadow(Ty, this); SynthNodes.push_back(make_pair(Ty, SN)); - Rep->addShadowNode(SN); return SN; } +ShadowDSNode *FunctionRepBuilder::makeSynthesizedShadow(const Type *Ty, + DSNode *Parent) { + ShadowDSNode *Result = new ShadowDSNode(Ty, F->getFunction()->getParent(), + Parent); + ShadowNodes.push_back(Result); + return Result; +} @@ -195,7 +203,6 @@ PointerVal FunctionRepBuilder::getIndexedPointerDest(const PointerVal &InP, static PointerValSet &getField(const PointerVal &DestPtr) { assert(DestPtr.Node != 0); - return DestPtr.Node->getLink(DestPtr.Index); } @@ -232,8 +239,8 @@ void FunctionRepBuilder::visitReturnInst(ReturnInst *RI) { void FunctionRepBuilder::visitLoadInst(LoadInst *LI) { // Only loads that return pointers are interesting... - if (!isa<PointerType>(LI->getType())) return; - const PointerType *DestTy = cast<PointerType>(LI->getType()); + const PointerType *DestTy = dyn_cast<PointerType>(LI->getType()); + if (DestTy == 0) return; const PointerValSet &SrcPVS = ValueMap[LI->getOperand(0)]; PointerValSet &LIPVS = ValueMap[LI]; @@ -245,12 +252,12 @@ void FunctionRepBuilder::visitLoadInst(LoadInst *LI) { if (Field.size()) { // Field loaded wasn't null? Changed |= LIPVS.add(Field); - } else if (ShadowDSNode *Shad = dyn_cast<ShadowDSNode>(Ptr.Node)) { + } else { // If we are loading a null field out of a shadow node, we need to // synthesize a new shadow node and link it in... // ShadowDSNode *SynthNode = - Shad->synthesizeNode(DestTy->getElementType(), this); + Ptr.Node->synthesizeNode(DestTy->getElementType(), this); Field.add(SynthNode); Changed |= LIPVS.add(Field); |