[Mlir-commits] [mlir] [mlir][Transforms] Allow RemoveDeadValues to process a function which the last block is not the exit. (PR #156123)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Aug 29 16:11:45 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-core
Author: xin liu (navyxliu)
<details>
<summary>Changes</summary>
'processFuncOp' queries the number of returned values of a function using the terminator of the last block's getNumOperands(). It presumes the last block is the exit. It is not always the case. We encounter a function that the last block jumps backward and then exit. append it as a lit test.
If processFuncOp gets the wrong number, it can't delete a dead returned value. here is the stacktrace.
```
```
This patch fixes the bug by querying from FunctionInterfaceOp directly.
---
Full diff: https://github.com/llvm/llvm-project/pull/156123.diff
2 Files Affected:
- (modified) mlir/lib/Transforms/RemoveDeadValues.cpp (+1-2)
- (modified) mlir/test/Transforms/remove-dead-values.mlir (+23)
``````````diff
diff --git a/mlir/lib/Transforms/RemoveDeadValues.cpp b/mlir/lib/Transforms/RemoveDeadValues.cpp
index 02dad69e49614..0e84b6dd17f29 100644
--- a/mlir/lib/Transforms/RemoveDeadValues.cpp
+++ b/mlir/lib/Transforms/RemoveDeadValues.cpp
@@ -344,8 +344,7 @@ static void processFuncOp(FunctionOpInterface funcOp, Operation *module,
// being returned, in order to optimize our IR. So, this demonstrates how we
// can make our optimization strong by even removing a live return value (%0),
// since it forwards only to non-live value(s) (%1#1).
- Operation *lastReturnOp = funcOp.back().getTerminator();
- size_t numReturns = lastReturnOp->getNumOperands();
+ size_t numReturns = funcOp.getNumResults();
BitVector nonLiveRets(numReturns, true);
for (SymbolTable::SymbolUse use : uses) {
Operation *callOp = use.getUser();
diff --git a/mlir/test/Transforms/remove-dead-values.mlir b/mlir/test/Transforms/remove-dead-values.mlir
index 0f8d757086e87..fa2c145bd3701 100644
--- a/mlir/test/Transforms/remove-dead-values.mlir
+++ b/mlir/test/Transforms/remove-dead-values.mlir
@@ -592,3 +592,26 @@ module @dynamically_unreachable {
return
}
}
+
+// CHECK-LABEL: module @last_block_not_exit
+module @last_block_not_exit {
+ // return value can be removed because it's private.
+ func.func private @terminated_with_condbr(%arg0: i1, %arg1: i1) -> i1 {
+ %true = arith.constant true
+ %false = arith.constant false
+ cf.cond_br %arg0, ^bb1(%false : i1), ^bb2
+ ^bb1(%1: i1): // 2 preds: ^bb0, ^bb2
+ return %1 : i1
+ ^bb2: // pred: ^bb3
+ cf.cond_br %arg1, ^bb1(%false : i1), ^bb1(%true : i1)
+ }
+
+ func.func public @call_private_but_not_use() {
+ %i0 = arith.constant 0: i1
+ %i1 = arith.constant 1: i1
+ call @terminated_with_condbr(%i0, %i1) : (i1, i1) -> i1
+ func.return
+ }
+ // CHECK-LABEL: @call_private_but_not_use
+ // CHECK: call @terminated_with_condbr(%false, %true) : (i1, i1)
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/156123
More information about the Mlir-commits
mailing list