Skip to content

Commit 1e5ed86

Browse files
committed
[SLPVectorizer] Refactor createOp
1 parent 460e7d5 commit 1e5ed86

File tree

1 file changed

+21
-37
lines changed

1 file changed

+21
-37
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19357,59 +19357,43 @@ class HorizontalReduction {
1935719357
/// Creates reduction operation with the current opcode.
1935819358
static Value *createOp(IRBuilderBase &Builder, RecurKind Kind, Value *LHS,
1935919359
Value *RHS, const Twine &Name, bool UseSelect) {
19360-
unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
19360+
if (UseSelect) {
19361+
if (RecurrenceDescriptor::isIntMinMaxRecurrenceKind(Kind)) {
19362+
CmpInst::Predicate Pred = llvm::getMinMaxReductionPredicate(Kind);
19363+
Value *Cmp = Builder.CreateCmp(Pred, LHS, RHS, Name);
19364+
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
19365+
}
19366+
if ((Kind == RecurKind::Or || Kind == RecurKind::And) &&
19367+
LHS->getType() == CmpInst::makeCmpResultType(LHS->getType())) {
19368+
Value *TrueVal = Kind == RecurKind::Or ? Builder.getTrue() : RHS;
19369+
Value *FalseVal = Kind == RecurKind::Or ? RHS : Builder.getFalse();
19370+
return Builder.CreateSelect(LHS, TrueVal, FalseVal, Name);
19371+
}
19372+
}
19373+
1936119374
switch (Kind) {
1936219375
case RecurKind::Or:
19363-
if (UseSelect &&
19364-
LHS->getType() == CmpInst::makeCmpResultType(LHS->getType()))
19365-
return Builder.CreateSelect(LHS, Builder.getTrue(), RHS, Name);
19366-
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
19367-
Name);
1936819376
case RecurKind::And:
19369-
if (UseSelect &&
19370-
LHS->getType() == CmpInst::makeCmpResultType(LHS->getType()))
19371-
return Builder.CreateSelect(LHS, RHS, Builder.getFalse(), Name);
19372-
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
19373-
Name);
1937419377
case RecurKind::Add:
1937519378
case RecurKind::Mul:
1937619379
case RecurKind::Xor:
1937719380
case RecurKind::FAdd:
19378-
case RecurKind::FMul:
19381+
case RecurKind::FMul: {
19382+
unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
1937919383
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
1938019384
Name);
19385+
}
1938119386
case RecurKind::FMax:
19382-
return Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS);
1938319387
case RecurKind::FMin:
19384-
return Builder.CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS);
1938519388
case RecurKind::FMaximum:
19386-
return Builder.CreateBinaryIntrinsic(Intrinsic::maximum, LHS, RHS);
1938719389
case RecurKind::FMinimum:
19388-
return Builder.CreateBinaryIntrinsic(Intrinsic::minimum, LHS, RHS);
1938919390
case RecurKind::SMax:
19390-
if (UseSelect) {
19391-
Value *Cmp = Builder.CreateICmpSGT(LHS, RHS, Name);
19392-
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
19393-
}
19394-
return Builder.CreateBinaryIntrinsic(Intrinsic::smax, LHS, RHS);
1939519391
case RecurKind::SMin:
19396-
if (UseSelect) {
19397-
Value *Cmp = Builder.CreateICmpSLT(LHS, RHS, Name);
19398-
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
19399-
}
19400-
return Builder.CreateBinaryIntrinsic(Intrinsic::smin, LHS, RHS);
1940119392
case RecurKind::UMax:
19402-
if (UseSelect) {
19403-
Value *Cmp = Builder.CreateICmpUGT(LHS, RHS, Name);
19404-
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
19405-
}
19406-
return Builder.CreateBinaryIntrinsic(Intrinsic::umax, LHS, RHS);
19407-
case RecurKind::UMin:
19408-
if (UseSelect) {
19409-
Value *Cmp = Builder.CreateICmpULT(LHS, RHS, Name);
19410-
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
19411-
}
19412-
return Builder.CreateBinaryIntrinsic(Intrinsic::umin, LHS, RHS);
19393+
case RecurKind::UMin: {
19394+
Intrinsic::ID Id = llvm::getMinMaxReductionIntrinsicOp(Kind);
19395+
return Builder.CreateBinaryIntrinsic(Id, LHS, RHS);
19396+
}
1941319397
default:
1941419398
llvm_unreachable("Unknown reduction operation.");
1941519399
}

0 commit comments

Comments
 (0)