diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2023-04-13 16:40:37 +0100 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2023-04-13 16:40:43 +0100 |
commit | aa754f7e0fddcc6c4d6737c71baf357825b09a3e (patch) | |
tree | d67b7f145f4047d306d52fce0f8adbd261032116 /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | be58b42a7510e3fe204e015bcf5faa9ed35d1766 (diff) | |
download | llvm-aa754f7e0fddcc6c4d6737c71baf357825b09a3e.zip llvm-aa754f7e0fddcc6c4d6737c71baf357825b09a3e.tar.gz llvm-aa754f7e0fddcc6c4d6737c71baf357825b09a3e.tar.bz2 |
[IR] llvm::createMinMaxOp - create integer min/max intrinsics instead of icmp/sel
Based off D148215, when expanding a min/max reduction we should be creating min/max intrinsics directly instead of relying on instcombine to fold them back together.
This patch handles integer min/max cases. Hopefully we can add floating point support soon (at least for fastmath/nnan cases) - but we're missing some of the plumbing to pass the correct FMF to the intrinsic at the moment.
Differential Revision: https://reviews.llvm.org/D148221
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 31872c1..90c9396 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -893,6 +893,25 @@ bool llvm::hasIterationCountInvariantInParent(Loop *InnerLoop, return true; } +Intrinsic::ID llvm::getMinMaxReductionIntrinsicOp(RecurKind RK) { + switch (RK) { + default: + llvm_unreachable("Unknown min/max recurrence kind"); + case RecurKind::UMin: + return Intrinsic::umin; + case RecurKind::UMax: + return Intrinsic::umax; + case RecurKind::SMin: + return Intrinsic::smin; + case RecurKind::SMax: + return Intrinsic::smax; + case RecurKind::FMin: + return Intrinsic::minnum; + case RecurKind::FMax: + return Intrinsic::maxnum; + } +} + CmpInst::Predicate llvm::getMinMaxReductionPredicate(RecurKind RK) { switch (RK) { default: @@ -923,6 +942,13 @@ Value *llvm::createSelectCmpOp(IRBuilderBase &Builder, Value *StartVal, Value *llvm::createMinMaxOp(IRBuilderBase &Builder, RecurKind RK, Value *Left, Value *Right) { + Type *Ty = Left->getType(); + if (Ty->isIntOrIntVectorTy()) { + // TODO: Add float minnum/maxnum support when FMF nnan is set. + Intrinsic::ID Id = getMinMaxReductionIntrinsicOp(RK); + return Builder.CreateIntrinsic(Ty, Id, {Left, Right}, nullptr, + "rdx.minmax"); + } CmpInst::Predicate Pred = getMinMaxReductionPredicate(RK); Value *Cmp = Builder.CreateCmp(Pred, Left, Right, "rdx.minmax.cmp"); Value *Select = Builder.CreateSelect(Cmp, Left, Right, "rdx.minmax.select"); |