[Mlir-commits] [mlir] 3bef17e - [mlir] Handle cycles and back edges in --view-op-graph (#82002)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Sat Feb 17 13:37:52 PST 2024


Author: Artem Tyurin
Date: 2024-02-17T13:37:49-08:00
New Revision: 3bef17eac607f3501e684088158d3265f4893807

URL: https://github.com/llvm/llvm-project/commit/3bef17eac607f3501e684088158d3265f4893807
DIFF: https://github.com/llvm/llvm-project/commit/3bef17eac607f3501e684088158d3265f4893807.diff

LOG: [mlir] Handle cycles and back edges in --view-op-graph (#82002)

Fixes #62128.

Added: 
    mlir/test/Transforms/print-op-graph-back-edges.mlir
    mlir/test/Transforms/print-op-graph-cycles.mlir

Modified: 
    mlir/lib/Transforms/ViewOpGraph.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Transforms/ViewOpGraph.cpp b/mlir/lib/Transforms/ViewOpGraph.cpp
index 3d2723839957c4..c2eb2b893cea4c 100644
--- a/mlir/lib/Transforms/ViewOpGraph.cpp
+++ b/mlir/lib/Transforms/ViewOpGraph.cpp
@@ -13,6 +13,7 @@
 #include "mlir/IR/Operation.h"
 #include "mlir/Pass/Pass.h"
 #include "mlir/Support/IndentedOstream.h"
+#include "mlir/Transforms/TopologicalSortUtils.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/GraphWriter.h"
 #include <map>
@@ -126,6 +127,12 @@ class PrintOpPass : public impl::ViewOpGraphBase<PrintOpPass> {
   /// Emit all edges. This function should be called after all nodes have been
   /// emitted.
   void emitAllEdgeStmts() {
+    if (printDataFlowEdges) {
+      for (const auto &[value, node, label] : dataFlowEdges) {
+        emitEdgeStmt(valueToNode[value], node, label, kLineStyleDataFlow);
+      }
+    }
+
     for (const std::string &edge : edges)
       os << edge << ";\n";
     edges.clear();
@@ -313,9 +320,8 @@ class PrintOpPass : public impl::ViewOpGraphBase<PrintOpPass> {
     if (printDataFlowEdges) {
       unsigned numOperands = op->getNumOperands();
       for (unsigned i = 0; i < numOperands; i++)
-        emitEdgeStmt(valueToNode[op->getOperand(i)], node,
-                     /*label=*/numOperands == 1 ? "" : std::to_string(i),
-                     kLineStyleDataFlow);
+        dataFlowEdges.push_back({op->getOperand(i), node,
+                                 numOperands == 1 ? "" : std::to_string(i)});
     }
 
     for (Value result : op->getResults())
@@ -344,6 +350,8 @@ class PrintOpPass : public impl::ViewOpGraphBase<PrintOpPass> {
   std::vector<std::string> edges;
   /// Mapping of SSA values to Graphviz nodes/clusters.
   DenseMap<Value, Node> valueToNode;
+  /// Output for data flow edges is delayed until the end to handle cycles
+  std::vector<std::tuple<Value, Node, std::string>> dataFlowEdges;
   /// Counter for generating unique node/subgraph identifiers.
   int counter = 0;
 

diff  --git a/mlir/test/Transforms/print-op-graph-back-edges.mlir b/mlir/test/Transforms/print-op-graph-back-edges.mlir
new file mode 100644
index 00000000000000..ed922dd7cb13bd
--- /dev/null
+++ b/mlir/test/Transforms/print-op-graph-back-edges.mlir
@@ -0,0 +1,24 @@
+// RUN: mlir-opt -view-op-graph %s -o %t 2>&1 | FileCheck -check-prefix=DFG %s
+
+// DFG-LABEL: digraph G {
+//       DFG:   compound = true;
+//       DFG:   subgraph cluster_1 {
+//       DFG:     v2 [label = " ", shape = plain];
+//       DFG:     label = "builtin.module : ()\n";
+//       DFG:     subgraph cluster_3 {
+//       DFG:       v4 [label = " ", shape = plain];
+//       DFG:       label = "";
+//       DFG:       v5 [fillcolor = "0.000000 1.0 1.0", label = "arith.addi : (index)\n\noverflowFlags: #arith.overflow<none...", shape = ellipse, style = filled];
+//       DFG:       v6 [fillcolor = "0.333333 1.0 1.0", label = "arith.constant : (index)\n\nvalue: 0 : index", shape = ellipse, style = filled];
+//       DFG:       v7 [fillcolor = "0.333333 1.0 1.0", label = "arith.constant : (index)\n\nvalue: 1 : index", shape = ellipse, style = filled];
+//       DFG:     }
+//       DFG:   }
+//       DFG:   v6 -> v5 [label = "0", style = solid];
+//       DFG:   v7 -> v5 [label = "1", style = solid];
+//       DFG: }
+
+module {
+  %add = arith.addi %c0, %c1 : index
+  %c0 = arith.constant 0 : index
+  %c1 = arith.constant 1 : index
+}

diff  --git a/mlir/test/Transforms/print-op-graph-cycles.mlir b/mlir/test/Transforms/print-op-graph-cycles.mlir
new file mode 100644
index 00000000000000..7e4eb5616a28b3
--- /dev/null
+++ b/mlir/test/Transforms/print-op-graph-cycles.mlir
@@ -0,0 +1,51 @@
+// RUN: mlir-opt -view-op-graph -allow-unregistered-dialect %s -o %t 2>&1 | FileCheck -check-prefix=DFG %s
+
+// DFG-LABEL: digraph G {
+//       DFG:   compound = true;
+//       DFG:   subgraph cluster_1 {
+//       DFG:     v2 [label = " ", shape = plain];
+//       DFG:     label = "builtin.module : ()\n";
+//       DFG:     subgraph cluster_3 {
+//       DFG:       v4 [label = " ", shape = plain];
+//       DFG:       label = "";
+//       DFG:       subgraph cluster_5 {
+//       DFG:         v6 [label = " ", shape = plain];
+//       DFG:         label = "test.graph_region : ()\n";
+//       DFG:         subgraph cluster_7 {
+//       DFG:           v8 [label = " ", shape = plain];
+//       DFG:           label = "";
+//       DFG:           v9 [fillcolor = "0.000000 1.0 1.0", label = "op1 : (i32)\n", shape = ellipse, style = filled];
+//       DFG:           subgraph cluster_10 {
+//       DFG:             v11 [label = " ", shape = plain];
+//       DFG:             label = "test.ssacfg_region : (i32)\n";
+//       DFG:             subgraph cluster_12 {
+//       DFG:               v13 [label = " ", shape = plain];
+//       DFG:               label = "";
+//       DFG:               v14 [fillcolor = "0.166667 1.0 1.0", label = "op2 : (i32)\n", shape = ellipse, style = filled];
+//       DFG:             }
+//       DFG:           }
+//       DFG:           v15 [fillcolor = "0.166667 1.0 1.0", label = "op2 : (i32)\n", shape = ellipse, style = filled];
+//       DFG:           v16 [fillcolor = "0.500000 1.0 1.0", label = "op3 : (i32)\n", shape = ellipse, style = filled];
+//       DFG:         }
+//       DFG:       }
+//       DFG:     }
+//       DFG:   }
+//       DFG:   v9 -> v9 [label = "0", style = solid];
+//       DFG:   v15 -> v9 [label = "1", style = solid];
+//       DFG:   v9 -> v14 [label = "0", style = solid];
+//       DFG:   v11 -> v14 [ltail = cluster_10, style = solid];
+//       DFG:   v15 -> v14 [label = "2", style = solid];
+//       DFG:   v16 -> v14 [label = "3", style = solid];
+//       DFG:   v9 -> v15 [label = "0", style = solid];
+//       DFG:   v16 -> v15 [label = "1", style = solid];
+//       DFG:   v9 -> v16 [label = "", style = solid];
+//       DFG: }
+
+"test.graph_region"() ({ // A Graph region
+  %1 = "op1"(%1, %3) : (i32, i32) -> (i32)  // OK: %1, %3 allowed here
+  %2 = "test.ssacfg_region"() ({
+     %5 = "op2"(%1, %2, %3, %4) : (i32, i32, i32, i32) -> (i32) // OK: %1, %2, %3, %4 all defined in the containing region
+  }) : () -> (i32)
+  %3 = "op2"(%1, %4) : (i32, i32) -> (i32)  // OK: %4 allowed here
+  %4 = "op3"(%1) : (i32) -> (i32)
+}) : () -> ()


        


More information about the Mlir-commits mailing list