[Mlir-commits] [mlir] [mlir][tosa][tosa-to-linalg] Add NaN Mode Lowering (PR #125668)
Jack Frankland
llvmlistbot at llvm.org
Tue Feb 25 08:21:15 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>(
----------------
FranklandJack wrote:
I've not been able to find a way to bundle a compare and select in such a way that can be reused across the various patterns due to them having quite different logic in each operator case.
https://github.com/llvm/llvm-project/pull/125668
More information about the Mlir-commits
mailing list