diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2024-02-16 10:36:16 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2024-02-16 11:20:34 +0000 |
commit | 2ed2a3ad90934efac12cbeb01cf73afebc01d963 (patch) | |
tree | 46d7c9bc663c7bafbaa73bd2562163afb2f7c6e8 /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | 0ea64ad88abcbb939547a92000d98efb2b00d95f (diff) | |
download | llvm-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.cpp | 71 |
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: |