@@ -19357,59 +19357,43 @@ class HorizontalReduction {
19357
19357
/// Creates reduction operation with the current opcode.
19358
19358
static Value *createOp(IRBuilderBase &Builder, RecurKind Kind, Value *LHS,
19359
19359
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
+
19361
19374
switch (Kind) {
19362
19375
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);
19368
19376
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);
19374
19377
case RecurKind::Add:
19375
19378
case RecurKind::Mul:
19376
19379
case RecurKind::Xor:
19377
19380
case RecurKind::FAdd:
19378
- case RecurKind::FMul:
19381
+ case RecurKind::FMul: {
19382
+ unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
19379
19383
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
19380
19384
Name);
19385
+ }
19381
19386
case RecurKind::FMax:
19382
- return Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS);
19383
19387
case RecurKind::FMin:
19384
- return Builder.CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS);
19385
19388
case RecurKind::FMaximum:
19386
- return Builder.CreateBinaryIntrinsic(Intrinsic::maximum, LHS, RHS);
19387
19389
case RecurKind::FMinimum:
19388
- return Builder.CreateBinaryIntrinsic(Intrinsic::minimum, LHS, RHS);
19389
19390
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);
19395
19391
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);
19401
19392
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
+ }
19413
19397
default:
19414
19398
llvm_unreachable("Unknown reduction operation.");
19415
19399
}
0 commit comments