[Mlir-commits] [mlir] a1a714b - [MLIR][Interfaces] Make `getMutableSuccessorOperands` overridable on `ReturnLike` ops (#186832)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Mar 17 06:12:24 PDT 2026
Author: Robert Konicar
Date: 2026-03-17T14:12:19+01:00
New Revision: a1a714b8b87e78bd42c47cb0b0e18dacca073a19
URL: https://github.com/llvm/llvm-project/commit/a1a714b8b87e78bd42c47cb0b0e18dacca073a19
DIFF: https://github.com/llvm/llvm-project/commit/a1a714b8b87e78bd42c47cb0b0e18dacca073a19.diff
LOG: [MLIR][Interfaces] Make `getMutableSuccessorOperands` overridable on `ReturnLike` ops (#186832)
Move the `getMutableSuccessorOperands` implementation from `ReturnLike`
trait to the `RegionBranchTerminatorOpInterface` to allow overriding of
the implementation. This allows to have the trait on operations that are
not a return of all of their operands. This can be used, for example, to
implement custom `ReturnLike` terminator that consumes non-returned
operands in combination with `func.func`.
The `RegionBranchTerminatorOpInterface` now provides a default
implementation for the `getMutableSuccessorOperands` method that returns
all of the operands.
Added:
Modified:
mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
mlir/test/lib/Dialect/Test/TestOpDefs.cpp
mlir/test/lib/Dialect/Test/TestOps.td
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 25e3dbd29043d..c8030b14e96c1 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -2354,7 +2354,8 @@ def OpenACC_DataOp
def OpenACC_TerminatorOp
: OpenACC_Op<"terminator", [Pure, Terminator,
DeclareOpInterfaceMethods<
- RegionBranchTerminatorOpInterface>]> {
+ RegionBranchTerminatorOpInterface,
+ ["getMutableSuccessorOperands"]>]> {
let summary = "Generic terminator for OpenACC regions";
let description = [{
diff --git a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
index a08cf3c95e6ce..6ed85c611983a 100644
--- a/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
+++ b/mlir/include/mlir/Dialect/SCF/IR/SCFOps.td
@@ -54,7 +54,7 @@ class SCF_Op<string mnemonic, list<Trait> traits = []> :
def ConditionOp : SCF_Op<"condition", [
HasParent<"WhileOp">,
DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface,
- ["getSuccessorRegions"]>,
+ ["getSuccessorRegions", "getMutableSuccessorOperands"]>,
Pure,
Terminator
]> {
@@ -904,7 +904,8 @@ def ParallelOp : SCF_Op<"parallel",
def ReduceOp : SCF_Op<"reduce", [
Terminator, HasParent<"ParallelOp">, RecursiveMemoryEffects,
- DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface>]> {
+ DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface,
+ ["getMutableSuccessorOperands"]>]> {
let summary = "reduce operation for scf.parallel";
let description = [{
The `scf.reduce` operation is the terminator for `scf.parallel` operations. It can model
diff --git a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
index 8975b1235a7e3..06fa724e05fab 100644
--- a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
+++ b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
@@ -432,7 +432,11 @@ def RegionBranchTerminatorOpInterface :
passing them to the region successor indicated by `point`.
}],
"::mlir::MutableOperandRange", "getMutableSuccessorOperands",
- (ins "::mlir::RegionSuccessor":$point)
+ (ins "::mlir::RegionSuccessor":$point),
+ [{}],
+ /*defaultImplementation=*/[{
+ return ::mlir::MutableOperandRange($_op);
+ }]
>,
InterfaceMethod<[{
Returns the potential region successors that are branched to after this
@@ -632,17 +636,6 @@ def WeightedRegionBranchOpInterface
// Op is "return-like".
def ReturnLike : TraitList<[
DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface>,
- NativeOpTrait<
- /*name=*/"ReturnLike",
- /*traits=*/[],
- /*extraOpDeclaration=*/"",
- /*extraOpDefinition=*/[{
- ::mlir::MutableOperandRange $cppClass::getMutableSuccessorOperands(
- ::mlir::RegionSuccessor successor) {
- return ::mlir::MutableOperandRange(*this);
- }
- }]
- >
-]>;
+ NativeOpTrait</*name=*/"ReturnLike">]>;
#endif // MLIR_INTERFACES_CONTROLFLOWINTERFACES
diff --git a/mlir/test/lib/Dialect/Test/TestOpDefs.cpp b/mlir/test/lib/Dialect/Test/TestOpDefs.cpp
index bd825c858a615..ed5dc5bead78a 100644
--- a/mlir/test/lib/Dialect/Test/TestOpDefs.cpp
+++ b/mlir/test/lib/Dialect/Test/TestOpDefs.cpp
@@ -1331,6 +1331,15 @@ TestCrashingReturnOp::getMutableSuccessorOperands(RegionSuccessor successor) {
return getArgsMutable();
}
+//===----------------------------------------------------------------------===//
+// TestReturnWithIgnoredValueOp
+//===----------------------------------------------------------------------===//
+
+MutableOperandRange TestReturnWithIgnoredValueOp::getMutableSuccessorOperands(
+ RegionSuccessor /*successor*/) {
+ return getValuesMutable();
+}
+
//===----------------------------------------------------------------------===//
// SwitchWithNoBreakOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td
index 02bac016eeed1..4c9e6b3fe9e45 100644
--- a/mlir/test/lib/Dialect/Test/TestOps.td
+++ b/mlir/test/lib/Dialect/Test/TestOps.td
@@ -2244,7 +2244,8 @@ def TestReturnOp : TEST_Op<"return", [Pure, ReturnLike, Terminator]> {
// emits an error, but getMutableSuccessorOperands() calls report_fatal_error
// to expose the fact that FuncOp::verify() runs before the region is checked.
def TestCrashingReturnOp : TEST_Op<"crashing_return", [
- DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface>,
+ DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface,
+ ["getMutableSuccessorOperands"]>,
Terminator]> {
let arguments = (ins Variadic<AnyType>:$args, UnitAttr:$valid);
let assemblyFormat = "($args^ `:` type($args))? attr-dict";
@@ -2300,6 +2301,19 @@ def TestSignatureConversionNoConverterOp
let regions = (region AnyRegion);
}
+// A return-like operation with override on the successor operand getter
+// interface method.
+def TestReturnWithIgnoredValueOp : TEST_Op<"return_with_ignored_value", [
+ Pure,
+ ReturnLike,
+ DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface, [
+ "getMutableSuccessorOperands"
+ ]>,
+ Terminator
+]> {
+ let arguments = (ins Variadic<AnyType>:$values, AnyType:$unwanted_value);
+}
+
//===----------------------------------------------------------------------===//
// Test parser.
//===----------------------------------------------------------------------===//
@@ -2707,8 +2721,9 @@ def LoopBlockOp : TEST_Op<"loop_block",
}
def LoopBlockTerminatorOp : TEST_Op<"loop_block_term",
- [DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface>, Pure,
- Terminator]> {
+ [DeclareOpInterfaceMethods<RegionBranchTerminatorOpInterface,
+ ["getMutableSuccessorOperands"]>,
+ Pure, Terminator]> {
let arguments = (ins I32:$nextIterArg, F32:$exitArg);
let assemblyFormat = [{
More information about the Mlir-commits
mailing list