[mlir][vector] Implement Workaround Lowerings for Masked `fm**imum` Reductions
commit8f5d519458aaf8ca7731ee974b912f6897078282
authorDaniil Dudkin <unterumarmung@yandex.ru>
Wed, 13 Sep 2023 22:18:36 +0000 (13 22:18 +0000)
committerDiego Caballero <diegocaballero@google.com>
Wed, 13 Sep 2023 22:49:08 +0000 (13 22:49 +0000)
tree54b8ed65c66b57d337defc7def6173a459112f85
parent709b27427b4661bdd08fe80b0164acf53c895793
[mlir][vector] Implement Workaround Lowerings for Masked `fm**imum` Reductions

This patch is part of a larger initiative aimed at fixing floating-point `max` and `min` operations in MLIR: https://discourse.llvm.org/t/rfc-fix-floating-point-max-and-min-operations-in-mlir/72671.

Within LLVM, there are no masked reduction counterparts for vector reductions such as `fmaximum` and `fminimum`.
More information can be found here: https://github.com/llvm/llvm-project/issues/64940#issuecomment-1690694156.

To address this issue in MLIR, where we need to generate appropriate lowerings for these cases, we employ regular non-masked intrinsics.
However, we modify the input vector using the `arith.select` operation to effectively deactivate undesired elements using a "neutral mask value".
The neutral mask value is the smallest possible value for the `fmaximum` reduction and the largest possible value for the `fminimum` reduction.

Depends on D158618

Reviewed By: dcaballe

Differential Revision: https://reviews.llvm.org/D158773
mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
mlir/test/Conversion/VectorToLLVM/vector-reduction-to-llvm.mlir