diff --git a/mlir/include/mlir/Interfaces/SideEffectInterfaces.h b/mlir/include/mlir/Interfaces/SideEffectInterfaces.h --- a/mlir/include/mlir/Interfaces/SideEffectInterfaces.h +++ b/mlir/include/mlir/Interfaces/SideEffectInterfaces.h @@ -316,6 +316,8 @@ /// Return true if the given operation would be dead if unused, and has no side /// effects on memory that would prevent erasing. This is equivalent to checking /// `isOpTriviallyDead` if `op` was unused. +/// +/// Note: Terminators and symbols are never considered to be trivially dead. bool wouldOpBeTriviallyDead(Operation *op); /// Returns true if the given operation is free of memory effects. diff --git a/mlir/lib/Interfaces/SideEffectInterfaces.cpp b/mlir/lib/Interfaces/SideEffectInterfaces.cpp --- a/mlir/lib/Interfaces/SideEffectInterfaces.cpp +++ b/mlir/lib/Interfaces/SideEffectInterfaces.cpp @@ -8,6 +8,7 @@ #include "mlir/Interfaces/SideEffectInterfaces.h" +#include "mlir/IR/SymbolTable.h" #include "llvm/ADT/SmallPtrSet.h" using namespace mlir; @@ -152,6 +153,8 @@ bool mlir::wouldOpBeTriviallyDead(Operation *op) { if (op->mightHaveTrait()) return false; + if (isa(op)) + return false; return wouldOpBeTriviallyDeadImpl(op); } diff --git a/mlir/test/Dialect/Transform/test-interpreter.mlir b/mlir/test/Dialect/Transform/test-interpreter.mlir --- a/mlir/test/Dialect/Transform/test-interpreter.mlir +++ b/mlir/test/Dialect/Transform/test-interpreter.mlir @@ -1,5 +1,9 @@ // RUN: mlir-opt %s --test-transform-dialect-interpreter -allow-unregistered-dialect --split-input-file --verify-diagnostics | FileCheck %s +// Make sure that canonicalizing the IR (including transform IR) does not result +// in invalid IR. +// RUN: mlir-opt %s -canonicalize -allow-unregistered-dialect --split-input-file + transform.sequence failures(propagate) { ^bb0(%arg0: !transform.any_op): // expected-remark @below {{applying transformation}}