[Mlir-commits] [mlir] [mlir][tosa][tosa-to-linalg] Add NaN Mode Lowering (PR #125668)
Georgios Pinitas
llvmlistbot at llvm.org
Tue Feb 25 03:19:31 PST 2025
================
@@ -404,7 +445,31 @@ static Value createLinalgBodyCalculationForElementwiseOp(
loc, elementTy, rewriter.getFloatAttr(elementTy, minApf));
auto max = rewriter.create<arith::ConstantOp>(
loc, elementTy, rewriter.getFloatAttr(elementTy, maxApf));
- return clampFloatHelper(loc, args[0], min, max, rewriter);
+ auto result = clampFloatHelper(loc, args[0], min, max, rewriter);
+
+ auto clampOp = llvm::cast<tosa::ClampOp>(op);
+ const auto nanMode = clampOp.getNanMode();
+ // In the case of "PROPAGATE" semantics no compare and selection is
+ // required.
+ if (nanMode == "PROPAGATE")
+ return result;
+
+ // In the case of "IGNORE" semantics materialize a comparison
+ // of the current operand to the reduction which will return true for a NaN
+ // argument and then selects between the initial reduction value and the
+ // calculated result based on whether the argument is NaN or not. In pseudo
+ // code:
+ //
+ // reduce<op>(x, init):
+ // result = op(init, x)
+ // return init if x == NaN else result
+
+ // Unordered comparison of NaN against itself will always return true.
+ Value isNaN = rewriter.create<arith::CmpFOp>(
----------------
GeorgeARM wrote:
I think you can pack a `CmpFOp` and `SelectOp` and reuse this with as many arguments.
Eitherway, looks fine; but would be great if you could see if this logic could be improved and patch this up.
https://github.com/llvm/llvm-project/pull/125668
More information about the Mlir-commits
mailing list