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/IR/greedy-pattern-rewriter-driver.mlir b/mlir/test/IR/greedy-pattern-rewriter-driver.mlir --- a/mlir/test/IR/greedy-pattern-rewriter-driver.mlir +++ b/mlir/test/IR/greedy-pattern-rewriter-driver.mlir @@ -24,3 +24,12 @@ }) {hoist_eligible_ops}: () -> () return } + +// ----- + +// There are no patterns in this test that apply to "test.symbol". This test is +// to ensure that symbols are not getting removed due to being "trivially dead" +// as part of a greedy rewrite. Symbols are never trivially dead. + +// CHECK: "test.symbol"() <{sym_name = "foo"}> +"test.symbol"() <{sym_name = "foo"}> : () -> () diff --git a/mlir/test/Transforms/test-operation-folder-commutative.mlir b/mlir/test/Transforms/test-operation-folder-commutative.mlir --- a/mlir/test/Transforms/test-operation-folder-commutative.mlir +++ b/mlir/test/Transforms/test-operation-folder-commutative.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt --pass-pipeline="builtin.module(func.func(test-patterns))" %s | FileCheck %s +// RUN: mlir-opt --pass-pipeline="builtin.module(test-patterns)" %s | FileCheck %s // CHECK-LABEL: func @test_reorder_constants_and_match func.func @test_reorder_constants_and_match(%arg0 : i32) -> (i32) { diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td --- a/mlir/test/lib/Dialect/Test/TestOps.td +++ b/mlir/test/lib/Dialect/Test/TestOps.td @@ -106,7 +106,7 @@ // Test Symbols //===----------------------------------------------------------------------===// -def SymbolOp : TEST_Op<"symbol", [Symbol]> { +def SymbolOp : TEST_Op<"symbol", [NoMemoryEffect, Symbol]> { let summary = "operation which defines a new symbol"; let arguments = (ins StrAttr:$sym_name, OptionalAttr:$sym_visibility); diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp --- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp +++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp @@ -200,7 +200,7 @@ }; struct TestPatternDriver - : public PassWrapper> { + : public PassWrapper> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestPatternDriver) TestPatternDriver() = default;