diff options
author | Min-Yih Hsu <min.hsu@sifive.com> | 2024-05-10 16:01:47 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-10 16:01:47 -0700 |
commit | f8063ffe73a3a1d704b9738169bb76ebb0f8a5e0 (patch) | |
tree | 68be5f20752b27d66d57e4d11652b324132f6ce0 /llvm/lib/CodeGen/ExpandVectorPredication.cpp | |
parent | 4198aebc96cb0236fc63e29a92d886e6a2e3fedb (diff) | |
download | llvm-f8063ffe73a3a1d704b9738169bb76ebb0f8a5e0.zip llvm-f8063ffe73a3a1d704b9738169bb76ebb0f8a5e0.tar.gz llvm-f8063ffe73a3a1d704b9738169bb76ebb0f8a5e0.tar.bz2 |
[VP][RISCV] Add vp.reduce.fmaximum/fminimum and its RISC-V codegen (#91782)
`vp.reduce.fmaximum/fminimum` are the VP version of
`vector.reduce.fmaximum/fminimum`.
Diffstat (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ExpandVectorPredication.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp index 8e623c8..dc35f33 100644 --- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp +++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp @@ -367,7 +367,8 @@ static Value *getNeutralReductionElement(const VPReductionIntrinsic &VPI, Type *EltTy) { bool Negative = false; unsigned EltBits = EltTy->getScalarSizeInBits(); - switch (VPI.getIntrinsicID()) { + Intrinsic::ID VID = VPI.getIntrinsicID(); + switch (VID) { default: llvm_unreachable("Expecting a VP reduction intrinsic"); case Intrinsic::vp_reduce_add: @@ -387,12 +388,17 @@ static Value *getNeutralReductionElement(const VPReductionIntrinsic &VPI, return ConstantInt::get(EltTy->getContext(), APInt::getSignedMinValue(EltBits)); case Intrinsic::vp_reduce_fmax: + case Intrinsic::vp_reduce_fmaximum: Negative = true; [[fallthrough]]; - case Intrinsic::vp_reduce_fmin: { + case Intrinsic::vp_reduce_fmin: + case Intrinsic::vp_reduce_fminimum: { + bool PropagatesNaN = VID == Intrinsic::vp_reduce_fminimum || + VID == Intrinsic::vp_reduce_fmaximum; FastMathFlags Flags = VPI.getFastMathFlags(); const fltSemantics &Semantics = EltTy->getFltSemantics(); - return !Flags.noNaNs() ? ConstantFP::getQNaN(EltTy, Negative) + return (!Flags.noNaNs() && !PropagatesNaN) + ? ConstantFP::getQNaN(EltTy, Negative) : !Flags.noInfs() ? ConstantFP::getInfinity(EltTy, Negative) : ConstantFP::get(EltTy, @@ -480,6 +486,18 @@ CachingVPExpander::expandPredicationInReduction(IRBuilder<> &Builder, Reduction = Builder.CreateBinaryIntrinsic(Intrinsic::minnum, Reduction, Start); break; + case Intrinsic::vp_reduce_fmaximum: + Reduction = Builder.CreateFPMaximumReduce(RedOp); + transferDecorations(*Reduction, VPI); + Reduction = + Builder.CreateBinaryIntrinsic(Intrinsic::maximum, Reduction, Start); + break; + case Intrinsic::vp_reduce_fminimum: + Reduction = Builder.CreateFPMinimumReduce(RedOp); + transferDecorations(*Reduction, VPI); + Reduction = + Builder.CreateBinaryIntrinsic(Intrinsic::minimum, Reduction, Start); + break; case Intrinsic::vp_reduce_fadd: Reduction = Builder.CreateFAddReduce(Start, RedOp); break; |