summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-07-18 15:54:42 +0000
committerChris Lattner <sabre@nondot.org>2002-07-18 15:54:42 +0000
commit055dc2c67e405307fa734ae446037f121bf392ab (patch)
tree5db3da78d9b47bb759d07cb7eae91db7bc636a3a /lib
parentf7ccb70604282fb7ce77edb8ed7423e2c8f6dcda (diff)
downloadllvm-055dc2c67e405307fa734ae446037f121bf392ab.tar.gz
llvm-055dc2c67e405307fa734ae446037f121bf392ab.tar.bz2
llvm-055dc2c67e405307fa734ae446037f121bf392ab.tar.xz
Implement cast nodes correctly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2964 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Analysis/DataStructure/DataStructure.cpp4
-rw-r--r--lib/Analysis/DataStructure/Local.cpp29
2 files changed, 19 insertions, 14 deletions
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<PointerType>(I.getType());
- for (Instruction::op_iterator i = I.op_begin(), E = I.op_end(); i!=E; ++i)
- bad |= isa<PointerType>(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<PointerType>(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<PointerType>(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<PointerType>(i->get()->getType()))
+ getLink(getValueNode(*i->get()), 0)->NodeType |= DSNode::CastNode;
+}
+