================ @@ -1898,6 +1882,56 @@ static Instruction *foldSelectICmpEq(SelectInst &SI, ICmpInst *ICI, return nullptr; } +/// Fold `X Pred C2 ? X BOp C1 : C2 BOp C1` to `min/max(X, C2) BOp C1`. +/// This allows for better canonicalization. +static Value *foldSelectWithConstOpToBinOp(ICmpInst *Cmp, Value *TrueVal, + Value *FalseVal, + IRBuilderBase &Builder) { + BinaryOperator *BOp; + Constant *C1, *C2, *C3; + Value *X; + ICmpInst::Predicate Predicate; + + if (!match(Cmp, m_ICmp(Predicate, m_Value(X), m_Constant(C1)))) + return nullptr; + + if (!ICmpInst::isRelational(Predicate)) + return nullptr; + + if (match(TrueVal, m_Constant())) { + std::swap(FalseVal, TrueVal); + Predicate = ICmpInst::getInversePredicate(Predicate); + } + + if (!match(TrueVal, m_BinOp(BOp)) || !match(FalseVal, m_Constant(C3))) + return nullptr; + + if (!match(BOp, m_OneUse(m_BinOp(m_Specific(X), m_Constant(C2))))) + return nullptr; + + Value *RHS; + SelectPatternFlavor SPF; + unsigned Opcode = BOp->getOpcode(); ---------------- dtcxzyw wrote:
Is it always profitable to perform this transform for div/rem? https://github.com/llvm/llvm-project/pull/116888 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits