aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure/FunctionRepBuilder.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-04-17 03:24:59 +0000
committerChris Lattner <sabre@nondot.org>2002-04-17 03:24:59 +0000
commitfe14568a8122b7c9b832795594b7bae11b2b6cc4 (patch)
treec2d0983f282515c1933de2a3226670d314372071 /lib/Analysis/DataStructure/FunctionRepBuilder.cpp
parenta146183c2105911eade774490650389924dae524 (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.cpp27
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);