aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/LoopUtils.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2024-02-16 10:36:16 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2024-02-16 11:20:34 +0000
commit2ed2a3ad90934efac12cbeb01cf73afebc01d963 (patch)
tree46d7c9bc663c7bafbaa73bd2562163afb2f7c6e8 /llvm/lib/Transforms/Utils/LoopUtils.cpp
parent0ea64ad88abcbb939547a92000d98efb2b00d95f (diff)
downloadllvm-2ed2a3ad90934efac12cbeb01cf73afebc01d963.zip
llvm-2ed2a3ad90934efac12cbeb01cf73afebc01d963.tar.gz
llvm-2ed2a3ad90934efac12cbeb01cf73afebc01d963.tar.bz2
[Transforms][Utils] Add helpers to map between Reduction IntrinsicID and Arithmetic Instruction Opcode and MinMax IntrinsicID / RecurKind
Noticed on #81852
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/LoopUtils.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp
index 5948512..002bc90 100644
--- a/llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -917,6 +917,58 @@ bool llvm::hasIterationCountInvariantInParent(Loop *InnerLoop,
return true;
}
+unsigned llvm::getArithmeticReductionInstruction(Intrinsic::ID RdxID) {
+ switch (RdxID) {
+ case Intrinsic::vector_reduce_fadd:
+ return Instruction::FAdd;
+ case Intrinsic::vector_reduce_fmul:
+ return Instruction::FMul;
+ case Intrinsic::vector_reduce_add:
+ return Instruction::Add;
+ case Intrinsic::vector_reduce_mul:
+ return Instruction::Mul;
+ case Intrinsic::vector_reduce_and:
+ return Instruction::And;
+ case Intrinsic::vector_reduce_or:
+ return Instruction::Or;
+ case Intrinsic::vector_reduce_xor:
+ return Instruction::Xor;
+ case Intrinsic::vector_reduce_smax:
+ case Intrinsic::vector_reduce_smin:
+ case Intrinsic::vector_reduce_umax:
+ case Intrinsic::vector_reduce_umin:
+ return Instruction::ICmp;
+ case Intrinsic::vector_reduce_fmax:
+ case Intrinsic::vector_reduce_fmin:
+ return Instruction::FCmp;
+ default:
+ llvm_unreachable("Unexpected ID");
+ }
+}
+
+Intrinsic::ID llvm::getMinMaxReductionIntrinsicOp(Intrinsic::ID RdxID) {
+ switch (RdxID) {
+ default:
+ llvm_unreachable("Unknown min/max recurrence kind");
+ case Intrinsic::vector_reduce_umin:
+ return Intrinsic::umin;
+ case Intrinsic::vector_reduce_umax:
+ return Intrinsic::umax;
+ case Intrinsic::vector_reduce_smin:
+ return Intrinsic::smin;
+ case Intrinsic::vector_reduce_smax:
+ return Intrinsic::smax;
+ case Intrinsic::vector_reduce_fmin:
+ return Intrinsic::minnum;
+ case Intrinsic::vector_reduce_fmax:
+ return Intrinsic::maxnum;
+ case Intrinsic::vector_reduce_fminimum:
+ return Intrinsic::minimum;
+ case Intrinsic::vector_reduce_fmaximum:
+ return Intrinsic::maximum;
+ }
+}
+
Intrinsic::ID llvm::getMinMaxReductionIntrinsicOp(RecurKind RK) {
switch (RK) {
default:
@@ -940,6 +992,25 @@ Intrinsic::ID llvm::getMinMaxReductionIntrinsicOp(RecurKind RK) {
}
}
+RecurKind llvm::getMinMaxReductionRecurKind(Intrinsic::ID RdxID) {
+ switch (RdxID) {
+ case Intrinsic::vector_reduce_smax:
+ return RecurKind::SMax;
+ case Intrinsic::vector_reduce_smin:
+ return RecurKind::SMin;
+ case Intrinsic::vector_reduce_umax:
+ return RecurKind::UMax;
+ case Intrinsic::vector_reduce_umin:
+ return RecurKind::UMin;
+ case Intrinsic::vector_reduce_fmax:
+ return RecurKind::FMax;
+ case Intrinsic::vector_reduce_fmin:
+ return RecurKind::FMin;
+ default:
+ return RecurKind::None;
+ }
+}
+
CmpInst::Predicate llvm::getMinMaxReductionPredicate(RecurKind RK) {
switch (RK) {
default: