aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/ExpandVectorPredication.cpp
diff options
context:
space:
mode:
authorPhilip Reames <preames@rivosinc.com>2024-08-30 12:25:50 -0700
committerPhilip Reames <listmail@philipreames.com>2024-08-30 12:34:56 -0700
commitc315d787e3680e7f48d9de0502bb83300b190f84 (patch)
tree0b397f480aaf4a7edd716e3c491e1633d5208764 /llvm/lib/CodeGen/ExpandVectorPredication.cpp
parent5eda4988117021b36ebe01b49082f63365846507 (diff)
downloadllvm-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.cpp65
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;