[Mlir-commits] [mlir] [MLIR][DataFlow] Guard getTerminator() with mightHaveTerminator() check (PR #188727)

Mehdi Amini llvmlistbot at llvm.org
Thu Mar 26 04:27:58 PDT 2026


https://github.com/joker-eph created https://github.com/llvm/llvm-project/pull/188727

`isRegionOrCallableReturn` in `DeadCodeAnalysis.cpp` called `Block::getTerminator()` without first checking
`Block::mightHaveTerminator()`. For regions with the `NoTerminator` trait (e.g. `acc.kernel_environment`), blocks do not have a terminator and `getTerminator()` asserts.

Add a `mightHaveTerminator()` guard before calling `getTerminator()`.

Fixes #188408

Assisted-by: Claude Code

>From 17aa93b890ea49c1e0eaee61cafbc99480638aa0 Mon Sep 17 00:00:00 2001
From: Mehdi Amini <joker.eph at gmail.com>
Date: Wed, 25 Mar 2026 15:35:03 -0700
Subject: [PATCH] [MLIR][DataFlow] Guard getTerminator() with
 mightHaveTerminator() check

`isRegionOrCallableReturn` in `DeadCodeAnalysis.cpp` called
`Block::getTerminator()` without first checking
`Block::mightHaveTerminator()`. For regions with the `NoTerminator`
trait (e.g. `acc.kernel_environment`), blocks do not have a terminator
and `getTerminator()` asserts.

Add a `mightHaveTerminator()` guard before calling `getTerminator()`.

Fixes #188408

Assisted-by: Claude Code
---
 mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp |  1 +
 .../test-dead-code-analysis-no-terminator.mlir  | 17 +++++++++++++++++
 2 files changed, 18 insertions(+)
 create mode 100644 mlir/test/Analysis/DataFlow/test-dead-code-analysis-no-terminator.mlir

diff --git a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
index 936b0c678f20c..c36efbf2e1472 100644
--- a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
+++ b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
@@ -249,6 +249,7 @@ void DeadCodeAnalysis::initializeSymbolCallables(Operation *top) {
 static bool isRegionOrCallableReturn(Operation *op) {
   return op->getBlock() != nullptr && !op->getNumSuccessors() &&
          isa<RegionBranchOpInterface, CallableOpInterface>(op->getParentOp()) &&
+         op->getBlock()->mightHaveTerminator() &&
          op->getBlock()->getTerminator() == op;
 }
 
diff --git a/mlir/test/Analysis/DataFlow/test-dead-code-analysis-no-terminator.mlir b/mlir/test/Analysis/DataFlow/test-dead-code-analysis-no-terminator.mlir
new file mode 100644
index 0000000000000..7d6e85201c123
--- /dev/null
+++ b/mlir/test/Analysis/DataFlow/test-dead-code-analysis-no-terminator.mlir
@@ -0,0 +1,17 @@
+// RUN: mlir-opt --sccp %s | FileCheck %s
+
+// Regression test for https://github.com/llvm/llvm-project/issues/188408
+// DeadCodeAnalysis crashed when visiting a block inside a region with the
+// NoTerminator trait (e.g. acc.kernel_environment) because
+// isRegionOrCallableReturn called Block::getTerminator() without first
+// checking Block::mightHaveTerminator().
+
+// CHECK-LABEL: func.func @f
+func.func @f(%arg0: memref<8xi32>) {
+  acc.kernel_environment {
+    acc.compute_region {
+      acc.yield
+    } {origin = "acc.parallel"}
+  }
+  return
+}



More information about the Mlir-commits mailing list