[llvm] [SLPVectorizer] Refactor HorizontalReduction::createOp (NFC) (PR #121549)
Mel Chen via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 2 23:52:00 PST 2025
https://github.com/Mel-Chen created https://github.com/llvm/llvm-project/pull/121549
This patch refactors the `HorizontalReduction::createOp` function to simplify the logic for creating reduction operations. The changes include:
1. Moving the `RdxOpcode` initialization into specific cases where it is used, avoiding to call `getOpcode` when non-arithmetical reduction.
2. Consolidating logic for generating intrinsic-based min/max reductions by utilizing `llvm::getMinMaxReductionIntrinsicOp`.
3. Simplifying select-based integer min/max reductions by utilizing `llvm::getMinMaxReductionPredicate`.
This patch is mainly to achieve the first item. The main reason is to unify IAnyOf and FAnyOf reduction. #118393
The related patch is #118777.
>From 1e5ed86ded06ad07982c909feb3b10b52f4d0ca3 Mon Sep 17 00:00:00 2001
From: Mel Chen <mel.chen at sifive.com>
Date: Thu, 2 Jan 2025 23:31:28 -0800
Subject: [PATCH] [SLPVectorizer] Refactor createOp
---
.../Transforms/Vectorize/SLPVectorizer.cpp | 58 +++++++------------
1 file changed, 21 insertions(+), 37 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index f52ddfda5e64c7..5a6f952cc91db7 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -19357,59 +19357,43 @@ class HorizontalReduction {
/// Creates reduction operation with the current opcode.
static Value *createOp(IRBuilderBase &Builder, RecurKind Kind, Value *LHS,
Value *RHS, const Twine &Name, bool UseSelect) {
- unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
+ if (UseSelect) {
+ if (RecurrenceDescriptor::isIntMinMaxRecurrenceKind(Kind)) {
+ CmpInst::Predicate Pred = llvm::getMinMaxReductionPredicate(Kind);
+ Value *Cmp = Builder.CreateCmp(Pred, LHS, RHS, Name);
+ return Builder.CreateSelect(Cmp, LHS, RHS, Name);
+ }
+ if ((Kind == RecurKind::Or || Kind == RecurKind::And) &&
+ LHS->getType() == CmpInst::makeCmpResultType(LHS->getType())) {
+ Value *TrueVal = Kind == RecurKind::Or ? Builder.getTrue() : RHS;
+ Value *FalseVal = Kind == RecurKind::Or ? RHS : Builder.getFalse();
+ return Builder.CreateSelect(LHS, TrueVal, FalseVal, Name);
+ }
+ }
+
switch (Kind) {
case RecurKind::Or:
- if (UseSelect &&
- LHS->getType() == CmpInst::makeCmpResultType(LHS->getType()))
- return Builder.CreateSelect(LHS, Builder.getTrue(), RHS, Name);
- return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
- Name);
case RecurKind::And:
- if (UseSelect &&
- LHS->getType() == CmpInst::makeCmpResultType(LHS->getType()))
- return Builder.CreateSelect(LHS, RHS, Builder.getFalse(), Name);
- return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
- Name);
case RecurKind::Add:
case RecurKind::Mul:
case RecurKind::Xor:
case RecurKind::FAdd:
- case RecurKind::FMul:
+ case RecurKind::FMul: {
+ unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
Name);
+ }
case RecurKind::FMax:
- return Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS);
case RecurKind::FMin:
- return Builder.CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS);
case RecurKind::FMaximum:
- return Builder.CreateBinaryIntrinsic(Intrinsic::maximum, LHS, RHS);
case RecurKind::FMinimum:
- return Builder.CreateBinaryIntrinsic(Intrinsic::minimum, LHS, RHS);
case RecurKind::SMax:
- if (UseSelect) {
- Value *Cmp = Builder.CreateICmpSGT(LHS, RHS, Name);
- return Builder.CreateSelect(Cmp, LHS, RHS, Name);
- }
- return Builder.CreateBinaryIntrinsic(Intrinsic::smax, LHS, RHS);
case RecurKind::SMin:
- if (UseSelect) {
- Value *Cmp = Builder.CreateICmpSLT(LHS, RHS, Name);
- return Builder.CreateSelect(Cmp, LHS, RHS, Name);
- }
- return Builder.CreateBinaryIntrinsic(Intrinsic::smin, LHS, RHS);
case RecurKind::UMax:
- if (UseSelect) {
- Value *Cmp = Builder.CreateICmpUGT(LHS, RHS, Name);
- return Builder.CreateSelect(Cmp, LHS, RHS, Name);
- }
- return Builder.CreateBinaryIntrinsic(Intrinsic::umax, LHS, RHS);
- case RecurKind::UMin:
- if (UseSelect) {
- Value *Cmp = Builder.CreateICmpULT(LHS, RHS, Name);
- return Builder.CreateSelect(Cmp, LHS, RHS, Name);
- }
- return Builder.CreateBinaryIntrinsic(Intrinsic::umin, LHS, RHS);
+ case RecurKind::UMin: {
+ Intrinsic::ID Id = llvm::getMinMaxReductionIntrinsicOp(Kind);
+ return Builder.CreateBinaryIntrinsic(Id, LHS, RHS);
+ }
default:
llvm_unreachable("Unknown reduction operation.");
}
More information about the llvm-commits
mailing list