aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/LoopUtils.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2023-04-13 16:40:37 +0100
committerSimon Pilgrim <llvm-dev@redking.me.uk>2023-04-13 16:40:43 +0100
commitaa754f7e0fddcc6c4d6737c71baf357825b09a3e (patch)
treed67b7f145f4047d306d52fce0f8adbd261032116 /llvm/lib/Transforms/Utils/LoopUtils.cpp
parentbe58b42a7510e3fe204e015bcf5faa9ed35d1766 (diff)
downloadllvm-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.cpp26
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");