[Mlir-commits] [mlir] [mlir] [linalg] Fold reduce(broadcast(x)) max/min (PR #213190)
Chuanqi Xu
llvmlistbot at llvm.org
Wed Aug 5 19:53:12 PDT 2026
================
@@ -2016,6 +2016,143 @@ LogicalResult ReduceOp::verify() {
return success();
}
+namespace {
+
+enum class BroadcastReduceKind {
+ MaxSI,
+ MaxUI,
+ MinSI,
+ MinUI,
+};
+
+static std::optional<BroadcastReduceKind>
+matchBroadcastReduceBody(ReduceOp reduceOp) {
+ if (reduceOp.getNumDpsInputs() != 1 || reduceOp.getNumDpsInits() != 1 ||
+ !reduceOp.getBody())
+ return std::nullopt;
+
+ // Match the simplest linalg.reduce body. e.g.,
+ //
+ // ^bb0(%in: i32, %acc: i32):
+ // %max = arith.maxsi %in, %acc : i32
+ // linalg.yield %max : i32
+ Block &block = *reduceOp.getBody();
+ if (block.getNumArguments() != 2 ||
+ !llvm::hasSingleElement(block.without_terminator()))
+ return std::nullopt;
+
+ auto yieldOp = dyn_cast<YieldOp>(block.getTerminator());
+ if (!yieldOp || yieldOp.getNumOperands() != 1)
+ return std::nullopt;
+
+ Operation *combineOp = yieldOp.getOperand(0).getDefiningOp();
+ if (!combineOp || combineOp->getNumOperands() != 2 ||
+ combineOp->getOperand(0).getType() != block.getArgument(0).getType() ||
+ combineOp->getOperand(1).getType() != block.getArgument(1).getType())
----------------
ChuanqiXu9 wrote:
Done
https://github.com/llvm/llvm-project/pull/213190
More information about the Mlir-commits
mailing list