@@ -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