@@ -12235,6 +12235,7 @@ class HorizontalReduction {
12235
12235
static Value *createOp(IRBuilder<> &Builder, RecurKind Kind, Value *LHS,
12236
12236
Value *RHS, const Twine &Name, bool UseSelect) {
12237
12237
unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
12238
+ bool IsConstant = isConstant(LHS) && isConstant(RHS);
12238
12239
switch (Kind) {
12239
12240
case RecurKind::Or:
12240
12241
if (UseSelect &&
@@ -12256,29 +12257,37 @@ class HorizontalReduction {
12256
12257
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
12257
12258
Name);
12258
12259
case RecurKind::FMax:
12260
+ if (IsConstant)
12261
+ return ConstantFP::get(LHS->getType(),
12262
+ maxnum(cast<ConstantFP>(LHS)->getValueAPF(),
12263
+ cast<ConstantFP>(RHS)->getValueAPF()));
12259
12264
return Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS);
12260
12265
case RecurKind::FMin:
12266
+ if (IsConstant)
12267
+ return ConstantFP::get(LHS->getType(),
12268
+ minnum(cast<ConstantFP>(LHS)->getValueAPF(),
12269
+ cast<ConstantFP>(RHS)->getValueAPF()));
12261
12270
return Builder.CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS);
12262
12271
case RecurKind::SMax:
12263
- if (UseSelect) {
12272
+ if (IsConstant || UseSelect) {
12264
12273
Value *Cmp = Builder.CreateICmpSGT(LHS, RHS, Name);
12265
12274
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
12266
12275
}
12267
12276
return Builder.CreateBinaryIntrinsic(Intrinsic::smax, LHS, RHS);
12268
12277
case RecurKind::SMin:
12269
- if (UseSelect) {
12278
+ if (IsConstant || UseSelect) {
12270
12279
Value *Cmp = Builder.CreateICmpSLT(LHS, RHS, Name);
12271
12280
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
12272
12281
}
12273
12282
return Builder.CreateBinaryIntrinsic(Intrinsic::smin, LHS, RHS);
12274
12283
case RecurKind::UMax:
12275
- if (UseSelect) {
12284
+ if (IsConstant || UseSelect) {
12276
12285
Value *Cmp = Builder.CreateICmpUGT(LHS, RHS, Name);
12277
12286
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
12278
12287
}
12279
12288
return Builder.CreateBinaryIntrinsic(Intrinsic::umax, LHS, RHS);
12280
12289
case RecurKind::UMin:
12281
- if (UseSelect) {
12290
+ if (IsConstant || UseSelect) {
12282
12291
Value *Cmp = Builder.CreateICmpULT(LHS, RHS, Name);
12283
12292
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
12284
12293
}
0 commit comments