diff options
author | Florian Hahn <flo@fhahn.com> | 2025-04-28 11:16:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-28 11:16:36 +0100 |
commit | ec1016f7ef9ff97ecef6e2e84a55d36d7bfbe803 (patch) | |
tree | a68424f79c857918292a17214f1896e1c4caa451 /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | cf17ee1d3a7ec78dbd922b3eb3944ac49cb78737 (diff) | |
download | llvm-ec1016f7ef9ff97ecef6e2e84a55d36d7bfbe803.zip llvm-ec1016f7ef9ff97ecef6e2e84a55d36d7bfbe803.tar.gz llvm-ec1016f7ef9ff97ecef6e2e84a55d36d7bfbe803.tar.bz2 |
[IVDescriptors] Support reductions with minimumnum/maximumnum. (#137335)
Add a new reduction recurrence kind for reductions with
minimumnum/maximumnum. Such reductions can be vectorized without
nsz/nnans, same as reductions with maximum/minimum intrinsics.
Note that a new reduction kind is needed to make sure partial reductions
are also combined with minimumnum/maximumnum.
Note that the final reduction to a scalar value is performed with
vector.reduce.fmin/fmax. This should be fine, as the results of the
partial reductions with maximumnum/minimumnum silences any sNaNs.
In-loop and reductions in SLP are not supported yet, as there's no
reduction version of maximumnum/minimumnum yet and fmax may be
incorrect.
PR: https://github.com/llvm/llvm-project/pull/137335
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index f57d95e..2fff9521 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -958,6 +958,10 @@ constexpr Intrinsic::ID llvm::getReductionIntrinsicID(RecurKind RK) { return Intrinsic::vector_reduce_fmaximum; case RecurKind::FMinimum: return Intrinsic::vector_reduce_fminimum; + case RecurKind::FMaximumNum: + return Intrinsic::vector_reduce_fmax; + case RecurKind::FMinimumNum: + return Intrinsic::vector_reduce_fmin; } } @@ -1053,6 +1057,10 @@ Intrinsic::ID llvm::getMinMaxReductionIntrinsicOp(RecurKind RK) { return Intrinsic::minimum; case RecurKind::FMaximum: return Intrinsic::maximum; + case RecurKind::FMinimumNum: + return Intrinsic::minimumnum; + case RecurKind::FMaximumNum: + return Intrinsic::maximumnum; } } @@ -1101,7 +1109,8 @@ Value *llvm::createMinMaxOp(IRBuilderBase &Builder, RecurKind RK, Value *Left, Value *Right) { Type *Ty = Left->getType(); if (Ty->isIntOrIntVectorTy() || - (RK == RecurKind::FMinimum || RK == RecurKind::FMaximum)) { + (RK == RecurKind::FMinimum || RK == RecurKind::FMaximum || + RK == RecurKind::FMinimumNum || RK == RecurKind::FMaximumNum)) { // TODO: Add float minnum/maxnum support when FMF nnan is set. Intrinsic::ID Id = getMinMaxReductionIntrinsicOp(RK); return Builder.CreateIntrinsic(Ty, Id, {Left, Right}, nullptr, @@ -1320,6 +1329,8 @@ Value *llvm::createSimpleReduction(IRBuilderBase &Builder, Value *Src, case RecurKind::FMin: case RecurKind::FMinimum: case RecurKind::FMaximum: + case RecurKind::FMinimumNum: + case RecurKind::FMaximumNum: return Builder.CreateUnaryIntrinsic(getReductionIntrinsicID(RdxKind), Src); case RecurKind::FMulAdd: case RecurKind::FAdd: |