@@ -3720,39 +3720,27 @@ static Value *foldSelectIntoAddConstant(SelectInst &SI,
3720
3720
3721
3721
// Note: OneUse check for `Cmp` is necessary because it makes sure that other
3722
3722
// InstCombine folds don't undo this transformation and cause an infinite
3723
- // loop.
3723
+ // loop. Furthermore, it could also increase the operation count.
3724
3724
if (match (&SI, m_Select (m_OneUse (m_FCmp (Pred, m_Value (X), m_Value (Z))),
3725
3725
m_OneUse (m_Instruction (FAdd)), m_Constant (C))) ||
3726
3726
match (&SI, m_Select (m_OneUse (m_FCmp (Pred, m_Value (X), m_Value (Z))),
3727
3727
m_Constant (C), m_OneUse (m_Instruction (FAdd))))) {
3728
3728
if (!match (Z, m_AnyZeroFP ()))
3729
3729
return nullptr ;
3730
3730
3731
- // Only these Predicates can be transformed into fmaxnum/fminnum intrinsic.
3732
- switch (Pred) {
3733
- default :
3731
+ // Only these relational predicates can be transformed into maxnum/minnum
3732
+ // intrinsic.
3733
+ if (! CmpInst::isRelational (Pred))
3734
3734
return nullptr ;
3735
- case FCmpInst::FCMP_OGT:
3736
- case FCmpInst::FCMP_OGE:
3737
- case FCmpInst::FCMP_OLT:
3738
- case FCmpInst::FCMP_OLE:
3739
- case FCmpInst::FCMP_UGT:
3740
- case FCmpInst::FCMP_UGE:
3741
- case FCmpInst::FCMP_ULT:
3742
- case FCmpInst::FCMP_ULE:
3743
- break ;
3744
- }
3745
3735
3746
3736
if (!match (FAdd, m_FAdd (m_Specific (X), m_Specific (C))))
3747
3737
return nullptr ;
3748
3738
3749
- Value *NewSelect = Builder. CreateSelect (SI. getCondition (), X, Z,
3750
- SI.getName () + " .new " , &SI);
3739
+ Value *NewSelect =
3740
+ Builder. CreateSelect (SI. getCondition (), X, Z, SI.getName (), &SI);
3751
3741
cast<Instruction>(NewSelect)->setFastMathFlags (SI.getFastMathFlags ());
3752
3742
3753
- Value *NewFAdd =
3754
- Builder.CreateFAddFMF (NewSelect, C, FAdd, FAdd->getName () + " .new" );
3755
- return NewFAdd;
3743
+ return Builder.CreateFAddFMF (NewSelect, C, FAdd, FAdd->getName ());
3756
3744
}
3757
3745
3758
3746
return nullptr ;
0 commit comments