[DRR] Use eraseOp() to replace no-result ops
authorLei Zhang <antiagainst@google.com>
Fri, 18 Oct 2019 15:19:54 +0000 (08:19 -0700)
committerA. Unique TensorFlower <gardener@tensorflow.org>
Fri, 18 Oct 2019 15:20:25 +0000 (08:20 -0700)
PiperOrigin-RevId: 275475229

mlir/tools/mlir-tblgen/RewriterGen.cpp

index 07a3d7e..cefd1d6 100644 (file)
@@ -542,18 +542,26 @@ void PatternEmitter::emitRewriteLogic() {
       os.indent(4) << val << ";\n";
   }
 
-  // Process replacement result patterns.
-  os.indent(4) << "SmallVector<Value *, 4> tblgen_values;";
-  for (int i = replStartIndex; i < numResultPatterns; ++i) {
-    DagNode resultTree = pattern.getResultPattern(i);
-    auto val = handleResultPattern(resultTree, offsets[i], 0);
+  if (numExpectedResults == 0) {
+    assert(replStartIndex >= numResultPatterns &&
+           "invalid auxiliary vs. replacement pattern division!");
+    // No result to replace. Just erase the op.
+    os.indent(4) << "rewriter.eraseOp(op0);\n";
+  } else {
+    // Process replacement result patterns.
+    os.indent(4) << "SmallVector<Value *, 4> tblgen_values;";
+    for (int i = replStartIndex; i < numResultPatterns; ++i) {
+      DagNode resultTree = pattern.getResultPattern(i);
+      auto val = handleResultPattern(resultTree, offsets[i], 0);
+      os.indent(4) << "\n";
+      // Resolve each symbol for all range use so that we can loop over them.
+      os << symbolInfoMap.getAllRangeUse(
+          val, "    for (auto *v : {0}) tblgen_values.push_back(v);", "\n");
+    }
     os.indent(4) << "\n";
-    // Resolve each symbol for all range use so that we can loop over them.
-    os << symbolInfoMap.getAllRangeUse(
-        val, "    for (auto *v : {0}) tblgen_values.push_back(v);", "\n");
+    os.indent(4) << "rewriter.replaceOp(op0, tblgen_values);\n";
   }
-  os.indent(4) << "\n";
-  os.indent(4) << "rewriter.replaceOp(op0, tblgen_values);\n";
+
   LLVM_DEBUG(llvm::dbgs() << "--- done emitting rewrite logic ---\n");
 }