[Mlir-commits] [mlir] [mlir][Interfaces] Use `areTypesCompatible` instead of `mayForwardTypeToSuccessor` (PR #216471)

Matthias Springer llvmlistbot at llvm.org
Sat Aug 15 01:57:26 PDT 2026


https://github.com/matthias-springer created https://github.com/llvm/llvm-project/pull/216471

This is a follow-up for #215036. The new `mayForwardTypeToSuccessor` interface method is not needed. The existing `areTypesCompatible` interface method can be used. If a type is not supported a branch op, `areTypesCompatible(x, x)` can return "false".

Assisted-by: Cursor


>From 4c6ec79714ce078593c7247f92f8f751d59ad359 Mon Sep 17 00:00:00 2001
From: Matthias Springer <me at m-sp.org>
Date: Sat, 15 Aug 2026 08:49:38 +0000
Subject: [PATCH] [mlir][Interfaces] Use `areTypesCompatible` instead of
 `mayForwardTypeToSuccessor`

---
 mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td   | 20 +++++++++----------
 .../mlir/Interfaces/ControlFlowInterfaces.td  | 19 +++---------------
 mlir/lib/Transforms/Utils/RegionUtils.cpp     |  5 ++---
 3 files changed, 15 insertions(+), 29 deletions(-)

diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index e670e6699e57d..86b9e6f58ea31 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -769,8 +769,8 @@ def LLVM_InvokeOp
     LLVMFunctionType getCalleeFunctionType();
 
     /// Successor operands are restricted to LLVM-compatible types.
-    bool mayForwardTypeToSuccessor(unsigned index, Type type) {
-      return isCompatibleType(type);
+    bool areTypesCompatible(Type lhs, Type rhs) {
+      return lhs == rhs && isCompatibleType(lhs);
     }
   }];
 }
@@ -1130,8 +1130,8 @@ def LLVM_BrOp : LLVM_TerminatorOp<"br",
   ];
   let extraClassDeclaration = [{
     /// Successor operands are restricted to LLVM-compatible types.
-    bool mayForwardTypeToSuccessor(unsigned index, Type type) {
-      return isCompatibleType(type);
+    bool areTypesCompatible(Type lhs, Type rhs) {
+      return lhs == rhs && isCompatibleType(lhs);
     }
   }];
 }
@@ -1173,8 +1173,8 @@ def LLVM_CondBrOp
   }]>, LLVM_TerminatorPassthroughOpBuilder];
   let extraClassDeclaration = [{
     /// Successor operands are restricted to LLVM-compatible types.
-    bool mayForwardTypeToSuccessor(unsigned index, Type type) {
-      return isCompatibleType(type);
+    bool areTypesCompatible(Type lhs, Type rhs) {
+      return lhs == rhs && isCompatibleType(lhs);
     }
   }];
 }
@@ -1297,8 +1297,8 @@ def LLVM_SwitchOp
     }
 
     /// Successor operands are restricted to LLVM-compatible types.
-    bool mayForwardTypeToSuccessor(unsigned index, Type type) {
-      return isCompatibleType(type);
+    bool areTypesCompatible(Type lhs, Type rhs) {
+      return lhs == rhs && isCompatibleType(lhs);
     }
   }];
 }
@@ -1961,8 +1961,8 @@ def LLVM_IndirectBrOp : LLVM_TerminatorOp<"indirectbr",
   ];
   let extraClassDeclaration = [{
     /// Successor operands are restricted to LLVM-compatible types.
-    bool mayForwardTypeToSuccessor(unsigned index, Type type) {
-      return isCompatibleType(type);
+    bool areTypesCompatible(Type lhs, Type rhs) {
+      return lhs == rhs && isCompatibleType(lhs);
     }
   }];
 }
diff --git a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
index d6aac2114e467..080829238a153 100644
--- a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
+++ b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.td
@@ -93,27 +93,14 @@ def BranchOpInterface : OpInterface<"BranchOpInterface"> {
     InterfaceMethod<[{
         This method is called to compare types along control-flow edges. By
         default, the types are checked as equal.
+
+        Note: Operations that do not support a certain type for successor
+        operands at all should return "false" if `lhs` / `rhs` is that type.
       }],
       "bool", "areTypesCompatible",
       (ins "::mlir::Type":$lhs, "::mlir::Type":$rhs), [{}],
        [{ return lhs == rhs; }]
     >,
-    InterfaceMethod<[{
-        Returns true if a value of the given type may be appended to the
-        forwarded operands of the successor at the given index, i.e. whether
-        the operation could pass such a value along the corresponding
-        control-flow edge. Transformations that thread new values across a
-        branch, such as block merging, must check this before appending to
-        `getSuccessorOperands`: an operation whose successor operands are
-        constrained to a subset of types (the LLVM dialect terminators, for
-        example, only forward LLVM-compatible values) would otherwise be
-        rewritten into an operation that no longer verifies. The default
-        implementation accepts any type.
-      }],
-      "bool", "mayForwardTypeToSuccessor",
-      (ins "unsigned":$index, "::mlir::Type":$type), [{}],
-      /*defaultImplementation=*/[{ return true; }]
-    >,
   ];
 
   let verify = [{
diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp
index b63a50f6af0a1..349a03f897441 100644
--- a/mlir/lib/Transforms/Utils/RegionUtils.cpp
+++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp
@@ -834,15 +834,14 @@ LogicalResult BlockMergeCluster::addToCluster(BlockEquivalenceData &blockData) {
 /// Returns true if the predecessor terminators of the given block can have
 /// their operands updated by appending values of the given types: each must
 /// implement BranchOpInterface and be willing to forward every one of the
-/// types to the block.
+/// types to the block (`areTypesCompatible(T, T)`).
 static bool ableToUpdatePredOperands(Block *block, ArrayRef<Type> types) {
   for (auto it = block->pred_begin(), e = block->pred_end(); it != e; ++it) {
     auto branch = dyn_cast<BranchOpInterface>((*it)->getTerminator());
     if (!branch)
       return false;
-    unsigned succIndex = it.getSuccessorIndex();
     for (Type type : types)
-      if (!branch.mayForwardTypeToSuccessor(succIndex, type))
+      if (!branch.areTypesCompatible(type, type))
         return false;
   }
   return true;



More information about the Mlir-commits mailing list