Enhance the GraphWriter support for edge destinations, and teach the
authorDan Gohman <gohman@apple.com>
Mon, 21 Jul 2008 21:06:55 +0000 (21:06 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 21 Jul 2008 21:06:55 +0000 (21:06 +0000)
SelectionDAG graph writer to make use of them. Now, nodes with multiple
values are displayed as such, with incoming edges pointing to the
specific value they use.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53875 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/DOTGraphTraits.h
include/llvm/Support/GraphWriter.h
lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp

index 080c09b5f48eb733fbf3c5c3f44c1dab5e4af453..2367c0e260c51f7b6dff3d1840d658f0e4cbbeba 100644 (file)
@@ -100,6 +100,24 @@ struct DefaultDOTGraphTraits {
     return I;
   }
 
+  /// hasEdgeDestLabels - If this function returns true, the graph is able
+  /// to provide labels for edge destinations.
+  static bool hasEdgeDestLabels() {
+    return false;
+  }
+
+  /// numEdgeDestLabels - If hasEdgeDestLabels, this function returns the
+  /// number of incoming edge labels the given node has.
+  static unsigned numEdgeDestLabels(const void *Node) {
+    return 0;
+  }
+
+  /// getEdgeDestLabel - If hasEdgeDestLabels, this function returns the
+  /// incoming edge label with the given index in the given node.
+  static std::string getEdgeDestLabel(const void *Node, unsigned i) {
+    return "";
+  }
+
   /// addCustomGraphFeatures - If a graph is made up of more than just
   /// straight-forward nodes and edges, this is the place to put all of the
   /// custom stuff necessary.  The GraphWriter object, instantiated with your
index afb2f545bbd5ae9d1eb188e20fd2398e3d38f41a..20e85cce7de9b12ba3b68c96011c16b631565846 100644 (file)
@@ -146,11 +146,11 @@ public:
 
       for (unsigned i = 0; EI != EE && i != 64; ++EI, ++i) {
         if (i) O << "|";
-        O << "<g" << i << ">" << DOTTraits::getEdgeSourceLabel(Node, EI);
+        O << "<s" << i << ">" << DOTTraits::getEdgeSourceLabel(Node, EI);
       }
 
       if (EI != EE)
-        O << "|<g64>truncated...";
+        O << "|<s64>truncated...";
       O << "}";
       if (DOTTraits::renderGraphFromBottomUp()) O << "|";
     }
@@ -163,6 +163,20 @@ public:
         O << "|" << (void*)Node;
     }
 
+    if (DOTTraits::hasEdgeDestLabels()) {
+      O << "|{";
+
+      unsigned i = 0, e = DOTTraits::numEdgeDestLabels(Node);
+      for (; i != e && i != 64; ++i) {
+        if (i) O << "|";
+        O << "<d" << i << ">" << DOTTraits::getEdgeDestLabel(Node, i);
+      }
+
+      if (i != e)
+        O << "|<d64>truncated...";
+      O << "}";
+    }
+
     O << "}\"];\n";   // Finish printing the "node" line
 
     // Output all of the edges now
@@ -223,10 +237,10 @@ public:
 
     O << "\tNode" << SrcNodeID;
     if (SrcNodePort >= 0)
-      O << ":g" << SrcNodePort;
+      O << ":s" << SrcNodePort;
     O << " -> Node" << reinterpret_cast<const void*>(DestNodeID);
     if (DestNodePort >= 0)
-      O << ":g" << DestNodePort;
+      O << ":d" << DestNodePort;
 
     if (!Attrs.empty())
       O << "[" << Attrs << "]";
index ea93d11f6dd7a3ce230822a31047c464c68b68b9..184c50e9037d245c871fdba395c157338cedb6a6 100644 (file)
@@ -32,6 +32,37 @@ using namespace llvm;
 namespace llvm {
   template<>
   struct DOTGraphTraits<SelectionDAG*> : public DefaultDOTGraphTraits {
+    static bool hasEdgeDestLabels() {
+      return true;
+    }
+
+    static unsigned numEdgeDestLabels(const void *Node) {
+      return ((const SDNode *) Node)->getNumValues();
+    }
+
+    static std::string getEdgeDestLabel(const void *Node, unsigned i) {
+      return ((const SDNode *) Node)->getValueType(i).getMVTString();
+    }
+
+    /// edgeTargetsEdgeSource - This method returns true if this outgoing edge
+    /// should actually target another edge source, not a node.  If this method is
+    /// implemented, getEdgeTarget should be implemented.
+    template<typename EdgeIter>
+    static bool edgeTargetsEdgeSource(const void *Node, EdgeIter I) {
+      return true;
+    }
+
+    /// getEdgeTarget - If edgeTargetsEdgeSource returns true, this method is
+    /// called to determine which outgoing edge of Node is the target of this
+    /// edge.
+    template<typename EdgeIter>
+    static EdgeIter getEdgeTarget(const void *Node, EdgeIter I) {
+      SDNode *TargetNode = *I;
+      SDNodeIterator NI = SDNodeIterator::begin(TargetNode);
+      std::advance(NI, I.getNode()->getOperand(I.getOperand()).ResNo);
+      return NI;
+    }
+
     static std::string getGraphName(const SelectionDAG *G) {
       return G->getMachineFunction().getFunction()->getName();
     }
@@ -88,12 +119,6 @@ std::string DOTGraphTraits<SelectionDAG*>::getNodeLabel(const SDNode *Node,
                                                         const SelectionDAG *G) {
   std::string Op = Node->getOperationName(G);
 
-  for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
-    if (Node->getValueType(i) == MVT::Other)
-      Op += ":ch";
-    else
-      Op = Op + ":" + Node->getValueType(i).getMVTString();
-    
   if (const ConstantSDNode *CSDN = dyn_cast<ConstantSDNode>(Node)) {
     Op += ": " + utostr(CSDN->getValue());
   } else if (const ConstantFPSDNode *CSDN = dyn_cast<ConstantFPSDNode>(Node)) {