Always remap results when replacing an operation. This prevents a crash when lowering...
authorRiver Riddle <riverriddle@google.com>
Wed, 5 Jun 2019 17:08:47 +0000 (10:08 -0700)
committerMehdi Amini <joker.eph@gmail.com>
Sun, 9 Jun 2019 23:18:44 +0000 (16:18 -0700)
PiperOrigin-RevId: 251665492

mlir/lib/Transforms/DialectConversion.cpp

index 333214e..6647434 100644 (file)
@@ -171,11 +171,14 @@ struct DialectConversionRewriter final : public PatternRewriter {
   void replaceOp(Operation *op, ArrayRef<Value *> newValues,
                  ArrayRef<Value *> valuesToRemoveIfDead) override {
     assert(newValues.size() == op->getNumResults());
-    // Create mappings for any type changes.
-    for (unsigned i = 0, e = newValues.size(); i < e; ++i)
-      if (newValues[i] &&
-          op->getResult(i)->getType() != newValues[i]->getType())
+
+    // Create mappings for each of the new result values.
+    for (unsigned i = 0, e = newValues.size(); i < e; ++i) {
+      assert((newValues[i] || op->getResult(i)->use_empty()) &&
+             "result value has remaining uses that must be replaced");
+      if (newValues[i])
         mapping.map(op->getResult(i), newValues[i]);
+    }
 
     // Record the requested operation replacement.
     replacements.emplace_back(op, newValues);