[Mlir-commits] [mlir] [MLIR] Fix crash in RemoveDeadValues when terminator lacks RegionBranchTerminatorOpInterface (PR #175300)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sat Jan 10 01:18:39 PST 2026
https://github.com/nataliakokoromyti created https://github.com/llvm/llvm-project/pull/175300
The RemoveDeadValues pass was using cast<RegionBranchTerminatorOpInterface> which asserts that the terminator implements this interface. However, some dialects (like CIR) have region terminators that don't implement this interface, causing crashes.
This patch changes cast to dyn_cast and skips processing for terminators that don't implement RegionBranchTerminatorOpInterface.
Fixes #174502
>From 20c215a0df413e4110a7dcfcb22d327761eaf8a3 Mon Sep 17 00:00:00 2001
From: Natalia Kokoromyti <nataliakokoromyti at gmail.com>
Date: Sat, 10 Jan 2026 01:15:31 -0800
Subject: [PATCH] [MLIR] Fix crash in RemoveDeadValues when terminator lacks
RegionBranchTerminatorOpInterface
The RemoveDeadValues pass was using cast<RegionBranchTerminatorOpInterface>
which asserts that the terminator implements this interface. However, some
dialects (like CIR) have region terminators that don't implement this
interface, causing crashes.
This patch changes cast to dyn_cast and skips processing for terminators
that don't implement RegionBranchTerminatorOpInterface.
Fixes #174502
---
mlir/lib/Transforms/RemoveDeadValues.cpp | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/mlir/lib/Transforms/RemoveDeadValues.cpp b/mlir/lib/Transforms/RemoveDeadValues.cpp
index fc2c2acf8afd3..4d20abb415229 100644
--- a/mlir/lib/Transforms/RemoveDeadValues.cpp
+++ b/mlir/lib/Transforms/RemoveDeadValues.cpp
@@ -477,8 +477,10 @@ static void processRegionBranchOp(RegionBranchOpInterface regionBranchOp,
if (region.empty())
continue;
// TODO: this isn't correct in face of multiple terminators.
- auto terminator = cast<RegionBranchTerminatorOpInterface>(
+ auto terminator = dyn_cast<RegionBranchTerminatorOpInterface>(
region.front().getTerminator());
+ if (!terminator)
+ continue;
nonForwardedRets[terminator] =
BitVector(terminator->getNumOperands(), true);
for (const RegionSuccessor &successor : getSuccessors(terminator)) {
@@ -498,11 +500,17 @@ static void processRegionBranchOp(RegionBranchOpInterface regionBranchOp,
DenseMap<Region *, BitVector> &argsToKeep, Region *region = nullptr) {
Operation *terminator =
region ? region->front().getTerminator() : nullptr;
- RegionBranchPoint point =
+ auto terminatorIface =
terminator
- ? RegionBranchPoint(
- cast<RegionBranchTerminatorOpInterface>(terminator))
- : RegionBranchPoint::parent();
+ ? dyn_cast<RegionBranchTerminatorOpInterface>(terminator)
+ : nullptr;
+ // If terminator doesn't implement RegionBranchTerminatorOpInterface,
+ // we can't analyze it, so skip.
+ if (terminator && !terminatorIface)
+ return;
+ RegionBranchPoint point =
+ terminatorIface ? RegionBranchPoint(terminatorIface)
+ : RegionBranchPoint::parent();
for (const RegionSuccessor &successor : getSuccessors(point)) {
Region *successorRegion = successor.getSuccessor();
@@ -566,8 +574,10 @@ static void processRegionBranchOp(RegionBranchOpInterface regionBranchOp,
for (Region ®ion : regionBranchOp->getRegions()) {
if (region.empty())
continue;
- auto terminator = cast<RegionBranchTerminatorOpInterface>(
+ auto terminator = dyn_cast<RegionBranchTerminatorOpInterface>(
region.front().getTerminator());
+ if (!terminator)
+ continue;
for (const RegionSuccessor &successor : getSuccessors(terminator)) {
Region *successorRegion = successor.getSuccessor();
for (auto [opOperand, input] :
More information about the Mlir-commits
mailing list