diff options
author | Philip Reames <preames@rivosinc.com> | 2024-08-30 12:25:50 -0700 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2024-08-30 12:34:56 -0700 |
commit | c315d787e3680e7f48d9de0502bb83300b190f84 (patch) | |
tree | 0b397f480aaf4a7edd716e3c491e1633d5208764 /llvm/lib/CodeGen/ExpandVectorPredication.cpp | |
parent | 5eda4988117021b36ebe01b49082f63365846507 (diff) | |
download | llvm-c315d787e3680e7f48d9de0502bb83300b190f84.zip llvm-c315d787e3680e7f48d9de0502bb83300b190f84.tar.gz llvm-c315d787e3680e7f48d9de0502bb83300b190f84.tar.bz2 |
[VP] Reduce duplicate code in vp.reduce expansions
Primary goal is having one way of doing this, to ensure that we don't
end up with accidental divergence.
Diffstat (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ExpandVectorPredication.cpp | 65 |
1 files changed, 15 insertions, 50 deletions
diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp index 675d88d..5140f59 100644 --- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp +++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp @@ -26,6 +26,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" +#include "llvm/Transforms/Utils/LoopUtils.h" #include <optional> using namespace llvm; @@ -437,69 +438,33 @@ CachingVPExpander::expandPredicationInReduction(IRBuilder<> &Builder, default: llvm_unreachable("Impossible reduction kind"); case Intrinsic::vp_reduce_add: - Reduction = Builder.CreateAddReduce(RedOp); - Reduction = Builder.CreateAdd(Reduction, Start); - break; case Intrinsic::vp_reduce_mul: - Reduction = Builder.CreateMulReduce(RedOp); - Reduction = Builder.CreateMul(Reduction, Start); - break; case Intrinsic::vp_reduce_and: - Reduction = Builder.CreateAndReduce(RedOp); - Reduction = Builder.CreateAnd(Reduction, Start); - break; case Intrinsic::vp_reduce_or: - Reduction = Builder.CreateOrReduce(RedOp); - Reduction = Builder.CreateOr(Reduction, Start); - break; - case Intrinsic::vp_reduce_xor: - Reduction = Builder.CreateXorReduce(RedOp); - Reduction = Builder.CreateXor(Reduction, Start); - break; - case Intrinsic::vp_reduce_smax: - Reduction = Builder.CreateIntMaxReduce(RedOp, /*IsSigned*/ true); + case Intrinsic::vp_reduce_xor: { + Intrinsic::ID RedID = *VPI.getFunctionalIntrinsicID(); + unsigned Opc = getArithmeticReductionInstruction(RedID); + assert(Instruction::isBinaryOp(Opc)); + Reduction = Builder.CreateUnaryIntrinsic(RedID, RedOp); Reduction = - Builder.CreateBinaryIntrinsic(Intrinsic::smax, Reduction, Start); + Builder.CreateBinOp((Instruction::BinaryOps)Opc, Reduction, Start); break; + } + case Intrinsic::vp_reduce_smax: case Intrinsic::vp_reduce_smin: - Reduction = Builder.CreateIntMinReduce(RedOp, /*IsSigned*/ true); - Reduction = - Builder.CreateBinaryIntrinsic(Intrinsic::smin, Reduction, Start); - break; case Intrinsic::vp_reduce_umax: - Reduction = Builder.CreateIntMaxReduce(RedOp, /*IsSigned*/ false); - Reduction = - Builder.CreateBinaryIntrinsic(Intrinsic::umax, Reduction, Start); - break; case Intrinsic::vp_reduce_umin: - Reduction = Builder.CreateIntMinReduce(RedOp, /*IsSigned*/ false); - Reduction = - Builder.CreateBinaryIntrinsic(Intrinsic::umin, Reduction, Start); - break; case Intrinsic::vp_reduce_fmax: - Reduction = Builder.CreateFPMaxReduce(RedOp); - transferDecorations(*Reduction, VPI); - Reduction = - Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, Reduction, Start); - break; case Intrinsic::vp_reduce_fmin: - Reduction = Builder.CreateFPMinReduce(RedOp); - transferDecorations(*Reduction, VPI); - 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); + case Intrinsic::vp_reduce_fminimum: { + Intrinsic::ID RedID = *VPI.getFunctionalIntrinsicID(); + Intrinsic::ID ScalarID = getMinMaxReductionIntrinsicOp(RedID); + Reduction = Builder.CreateUnaryIntrinsic(RedID, RedOp); transferDecorations(*Reduction, VPI); - Reduction = - Builder.CreateBinaryIntrinsic(Intrinsic::minimum, Reduction, Start); + Reduction = Builder.CreateBinaryIntrinsic(ScalarID, Reduction, Start); break; + } case Intrinsic::vp_reduce_fadd: Reduction = Builder.CreateFAddReduce(Start, RedOp); break; |