From 055dc2c67e405307fa734ae446037f121bf392ab Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 18 Jul 2002 15:54:42 +0000 Subject: Implement cast nodes correctly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2964 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DataStructure/DataStructure.cpp | 4 ++-- lib/Analysis/DataStructure/Local.cpp | 29 ++++++++++++++++------------ 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index 800c82ad98..6bc5a716fc 100644 --- a/lib/Analysis/DataStructure/DataStructure.cpp +++ b/lib/Analysis/DataStructure/DataStructure.cpp @@ -248,9 +248,9 @@ void DSGraph::markIncompleteNodes() { markIncompleteNode(Args[i]); } - // Mark all of the nodes pointed to by global nodes as incomplete... + // Mark all of the nodes pointed to by global or cast nodes as incomplete... for (unsigned i = 0, e = Nodes.size(); i != e; ++i) - if (Nodes[i]->NodeType & DSNode::GlobalNode) { + if (Nodes[i]->NodeType & (DSNode::GlobalNode | DSNode::CastNode)) { DSNode *N = Nodes[i]; for (unsigned i = 0, e = N->getNumLinks(); i != e; ++i) markIncompleteNode(N->getLink(i)); diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp index f37146e57f..f9e6a994c6 100644 --- a/lib/Analysis/DataStructure/Local.cpp +++ b/lib/Analysis/DataStructure/Local.cpp @@ -5,6 +5,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Analysis/DataStructure.h" #include "llvm/Function.h" #include "llvm/iMemory.h" #include "llvm/iTerminators.h" @@ -14,7 +15,6 @@ #include "llvm/GlobalVariable.h" #include "llvm/DerivedTypes.h" #include "llvm/Support/InstVisitor.h" -#include "llvm/Analysis/DataStructure.h" // FIXME: using std::map; using std::vector; @@ -66,17 +66,7 @@ namespace { void visitCallInst(CallInst &CI); void visitSetCondInst(SetCondInst &SCI) {} // SetEQ & friends are ignored void visitFreeInst(FreeInst &FI) {} // Ignore free instructions - void visitInstruction(Instruction &I) { -#ifndef NDEBUG - bool bad = isa(I.getType()); - for (Instruction::op_iterator i = I.op_begin(), E = I.op_end(); i!=E; ++i) - bad |= isa(i->get()->getType()); - if (bad) { - std::cerr << "\n\n\nUNKNOWN PTR INSTRUCTION type: " << I << "\n\n\n"; - assert(0 && "Cannot proceed"); - } -#endif - } + void visitInstruction(Instruction &I); // Visit unsafe ptr instruction private: // Helper functions used to implement the visitation functions... @@ -307,3 +297,18 @@ void GraphBuilder::visitCallInst(CallInst &CI) { if (isa(CI.getOperand(i)->getType())) Args.push_back(getLink(getValueNode(*CI.getOperand(i)), 0)); } + +// visitInstruction - All safe instructions have been processed above, this case +// is where unsafe ptr instructions land. +// +void GraphBuilder::visitInstruction(Instruction &I) { + // If the return type is a pointer, mark the pointed node as being a cast node + if (isa(I.getType())) + getLink(getValueNode(I), 0)->NodeType |= DSNode::CastNode; + + // If any operands are pointers, mark the pointed nodes as being a cast node + for (Instruction::op_iterator i = I.op_begin(), E = I.op_end(); i!=E; ++i) + if (isa(i->get()->getType())) + getLink(getValueNode(*i->get()), 0)->NodeType |= DSNode::CastNode; +} + -- cgit v1.2.3