[llvm] [VPlan] Don't use the legacy cost model for loop conditions (PR #156864)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 21 06:10:36 PDT 2025
================
@@ -1155,6 +1155,28 @@ InstructionCost VPInstruction::computeCost(ElementCount VF,
return Ctx.TTI.getIndexedVectorInstrCostFromEnd(Instruction::ExtractElement,
VecTy, Ctx.CostKind, 0);
}
+ case VPInstruction::BranchOnCount: {
+ // If TC <= VF then this is just a branch.
+ // FIXME: Removing the branch happens in simplifyBranchConditionForVFAndUF
+ // where it checks TC <= VF * UF, but we don't know UF yet. This means in
+ // some cases we get a cost that's too high due to counting a cmp that
+ // later gets removed.
+ // FIXME: The compare could also be removed if TC = M * vscale,
+ // VF = N * vscale, and M <= N. Detecting that would require having the
+ // trip count as a SCEV though.
+ Value *TC = getParent()->getPlan()->getTripCount()->getUnderlyingValue();
+ ConstantInt *TCConst = dyn_cast_if_present<ConstantInt>(TC);
+ if (TCConst && TCConst->getValue().ule(VF.getKnownMinValue()))
+ return 0;
+ // Otherwise BranchOnCount generates ICmpEQ followed by a branch.
+ Type *ValTy = Ctx.Types.inferScalarType(getOperand(0));
+ return Ctx.TTI.getCmpSelInstrCost(Instruction::ICmp, ValTy,
+ CmpInst::makeCmpResultType(ValTy),
+ CmpInst::ICMP_EQ, Ctx.CostKind);
+ }
+ case Instruction::FCmp:
+ case Instruction::ICmp:
+ return getCostForRecipeWithOpcode(getOpcode(), VF, Ctx);
----------------
david-arm wrote:
Sorry about this, but while I was trying to understand what's going on with the test changes to conditional-branches-cost.ll I discovered we're now treating the icmp for the exit condition as a vector comparison rather than a scalar comparison. This means we're actually reporting costs for fixed-width VFs that are too high.
I think this code needs changing to be:
```
return getCostForRecipeWithOpcode(getOpcode(),
vputils::onlyFirstLaneUsed(this) ? ElementCount::getFixed(1) : VF, Ctx);
```
https://github.com/llvm/llvm-project/pull/156864
More information about the llvm-commits
mailing list