[Mlir-commits] [mlir] [mlir][tosa][tosa-to-linalg] Add NaN Mode Lowering (PR #125668)
Jack Frankland
llvmlistbot at llvm.org
Tue Feb 25 02:56:54 PST 2025
================
@@ -1113,26 +1182,127 @@ static LogicalResult reduceMatchAndRewriteHelper(Operation *op, uint64_t axis,
.create<linalg::FillOp>(loc, ValueRange{fillValue},
ValueRange{emptyTensor})
.result();
+ outputs.push_back(filledTensor);
+
+ bool isNanIgnoreMode = false;
+ if constexpr (std::is_same_v<OpTy, tosa::ReduceMinOp> ||
+ std::is_same_v<OpTy, tosa::ReduceMaxOp>) {
+ if (op.getNanMode() == "IGNORE") {
+ isNanIgnoreMode = true;
+ // Because the TOSA spec requires the result be NaN iff all elements in
+ // the reduction are NaN we can't simply perform a compare and select.
+ // Additionally we have to keep track of whether we've seen any non-NaN
+ // values and then do a final select based on this predicate.
+ auto trueAttr = rewriter.getBoolAttr(true);
+ auto trueValue = rewriter.create<arith::ConstantOp>(loc, trueAttr);
+ auto emptyBoolTensor =
+ rewriter
+ .create<tensor::EmptyOp>(loc, reduceShape, trueValue.getType(),
+ dynDims)
+ .getResult();
+ auto allResultsNaNTensor =
+ rewriter
+ .create<linalg::FillOp>(loc, ValueRange{trueValue},
+ ValueRange{emptyBoolTensor})
+ .result();
+ // Note that because the linalg::ReduceOp has two variadic arguments
+ // (inputs and outputs) and it has the SameVariadicOperandSize trait we
+ // need to have the same number of inputs and outputs.
+ //
+ // The second input isn't actully used anywhere since the value used to
----------------
FranklandJack wrote:
Good catch, fixed.
https://github.com/llvm/llvm-project/pull/125668
More information about the Mlir-commits
mailing list