[llvm] [SLP] Improve cost model for i1 select-as-or/and patterns (PR #188572)
Ryan Buchner via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 16 12:51:37 PDT 2026
================
@@ -16435,26 +16459,52 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
: VL0->getType(),
VL.size());
- InstructionCost VecCost = TTI->getCmpSelInstrCost(
- E->getOpcode(), VecTy, MaskTy, VecPred, CostKind,
- getOperandInfo(
- E->getOperand(ShuffleOrOp == Instruction::Select ? 1 : 0)),
- getOperandInfo(
- E->getOperand(ShuffleOrOp == Instruction::Select ? 2 : 1)),
- VL0);
- if (isa<SelectInst>(VL0)) {
- unsigned CondNumElements = getNumElements(MaskTy);
- unsigned VecTyNumElements = getNumElements(VecTy);
- assert(VecTyNumElements >= CondNumElements &&
- VecTyNumElements % CondNumElements == 0 &&
- "Cannot vectorize Instruction::Select");
- if (CondNumElements != VecTyNumElements) {
- // When the return type is i1 but the source is fixed vector type, we
- // need to duplicate the condition value.
- VecCost += ::getShuffleCost(
- *TTI, TTI::SK_PermuteSingleSrc, MaskTy,
- createReplicatedMask(VecTyNumElements / CondNumElements,
- CondNumElements));
+ InstructionCost VecCost = InstructionCost::getInvalid();
+ if (ShuffleOrOp == Instruction::Select) {
+ ArrayRef<Value *> Cond = E->getOperand(0);
+ ArrayRef<Value *> LHS = E->getOperand(1);
+ ArrayRef<Value *> RHS = E->getOperand(2);
+ // select <VF x i1>, <VF x i1>, <VF x i1>?
+ // TODO: consider implemetning this in TTI.
----------------
bababuck wrote:
```suggestion
// TODO: consider implementing this in TTI.
```
https://github.com/llvm/llvm-project/pull/188572
More information about the llvm-commits
mailing list