[llvm] [VPlan] First step towards VPlan cost modeling. (PR #92555)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 10 14:33:19 PDT 2024
================
@@ -747,6 +747,66 @@ void VPRegionBlock::execute(VPTransformState *State) {
State->Instance.reset();
}
+InstructionCost VPBasicBlock::cost(ElementCount VF, VPCostContext &Ctx) {
+ InstructionCost Cost = 0;
+ for (VPRecipeBase &R : Recipes)
+ Cost += R.cost(VF, Ctx);
+ return Cost;
+}
+
+InstructionCost VPRegionBlock::cost(ElementCount VF, VPCostContext &Ctx) {
+ InstructionCost Cost = 0;
+ if (!isReplicator()) {
+ for (VPBlockBase *Block : vp_depth_first_shallow(getEntry()))
+ Cost += Block->cost(VF, Ctx);
+
+ // Add the cost for the backedge.
+ Cost += 1;
+ return Cost;
+ }
+
+ // Compute the cost of a replicate region. Replicating isn't supported for
+ // scalable vectors, return an invalid cost for them.
+ // TODO: Discard scalable VPlans with replicate recipes earlier after
+ // construction.
+ if (VF.isScalable())
+ return InstructionCost::getInvalid();
+
+ // First compute the cost of the conditionally executed recipes, followed by
+ // account for the branching cost, except if the mask is a header mask or
+ // uniform condition.
+ using namespace llvm::VPlanPatternMatch;
+ VPBasicBlock *Then = cast<VPBasicBlock>(getEntry()->getSuccessors()[0]);
+ Cost += Then->cost(VF, Ctx);
+
+ // Note the cost estimates below closely match the current legacy cost model.
+ auto *BOM = cast<VPBranchOnMaskRecipe>(&getEntryBasicBlock()->front());
+ VPValue *Cond = BOM->getOperand(0);
+
+ // Check if Cond is a uniform compare or a header mask and don't account for
+ // branching costs. A uniform condition corresponding to a single branch per
+ // VF, and the header mask will always be true except in the last iteration.
+ if (vputils::isUniformBoolean(Cond) ||
+ vputils::isHeaderMask(Cond, *getPlan()))
+ return Cost;
+
+ // For the scalar case, we may not always execute the original predicated
+ // block, Thus, scale the block's cost by the probability of executing it.
+ if (VF.isScalar())
+ return Cost / getReciprocalPredBlockProb();
----------------
fhahn wrote:
Done, thanks!
https://github.com/llvm/llvm-project/pull/92555
More information about the llvm-commits
mailing list