[llvm] [SLP] Improve cost model for i1 select-as-or/and patterns (PR #188572)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 1 10:00:46 PDT 2026
================
@@ -15999,23 +15999,46 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
CmpPredicate CurrentPred = ScalarTy->isFloatingPointTy()
? CmpInst::BAD_FCMP_PREDICATE
: CmpInst::BAD_ICMP_PREDICATE;
+ Value *LHS = nullptr, *RHS = nullptr;
auto MatchCmp = m_Cmp(CurrentPred, m_Value(), m_Value());
- if ((!match(VI, m_Select(MatchCmp, m_Value(), m_Value())) &&
- !match(VI, MatchCmp)) ||
+ bool IsSelect =
+ ShuffleOrOp == Instruction::Select &&
+ (match(VI, m_Select(MatchCmp, m_Value(LHS), m_Value(RHS))) ||
+ match(VI, m_Select(m_Value(), m_Value(LHS), m_Value(RHS))));
+ if ((!IsSelect && !match(VI, MatchCmp)) ||
(CurrentPred != static_cast<CmpInst::Predicate>(VecPred) &&
CurrentPred != static_cast<CmpInst::Predicate>(SwappedVecPred)))
VecPred = SwappedVecPred = ScalarTy->isFloatingPointTy()
? CmpInst::BAD_FCMP_PREDICATE
: CmpInst::BAD_ICMP_PREDICATE;
- InstructionCost ScalarCost = TTI->getCmpSelInstrCost(
- E->getOpcode(), OrigScalarTy, Builder.getInt1Ty(), CurrentPred,
- CostKind,
- getOperandInfo(
- VI->getOperand(ShuffleOrOp == Instruction::Select ? 1 : 0)),
- getOperandInfo(
- VI->getOperand(ShuffleOrOp == Instruction::Select ? 2 : 1)),
- VI);
+ // Check if operands are of i1 types, like a condition expression.
+ InstructionCost ScalarCost = InstructionCost::getInvalid();
+ if (IsSelect && LHS->getType() == VI->getOperand(0)->getType()) {
+ assert(LHS->getType() == RHS->getType() &&
+ "Expected same type for LHS/RHS");
+ // select i1 v, i1 true, i1 b -> or i1 v, i1 b
----------------
RKSimon wrote:
this isn't undef safe - https://alive2.llvm.org/ce/z/hHLNL4
https://github.com/llvm/llvm-project/pull/188572
More information about the llvm-commits
mailing list