Implement cast nodes correctly.
authorChris Lattner <sabre@nondot.org>
Thu, 18 Jul 2002 15:54:42 +0000 (15:54 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 18 Jul 2002 15:54:42 +0000 (15:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2964 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructure.cpp
lib/Analysis/DataStructure/Local.cpp

index 800c82ad9823e927f8d9790feed8e58907f05477..6bc5a716fc9c140d829fadd0e986c8750e718dac 100644 (file)
@@ -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));
index f37146e57f025e87758025a3df879b6a7a8d01c7..f9e6a994c684d2facd2652e78feb40e769fa737c 100644 (file)
@@ -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;
+}
+