[llvm] [LV] Vectorize uncountable early exit store loops with combined conditions (PR #205109)
Graham Hunter via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 13 07:54:08 PDT 2026
================
@@ -2943,6 +2943,102 @@ void VPlanTransforms::createInterleaveGroups(
}
}
+/// Matches an exit condition formed by comparing a value loaded from memory
+/// with a loop-invariant term. Binds the comparison for the condition.
+template <typename CmpTy> static auto m_Uncountable(CmpTy &&Cond) {
+ return m_VPValue(
+ Cond,
+ m_c_Cmp(m_VPInstruction<Instruction::Load>(m_VPValue()), m_LiveIn()));
+}
+
+template <typename CmpTy> struct CountableConditionMatch {
+ CmpTy Cmp;
+ PredicatedScalarEvolution &PSE;
+ Loop *L;
+
+ CountableConditionMatch(const CmpTy &Cmp, PredicatedScalarEvolution &PSE,
+ Loop *L)
+ : Cmp(Cmp), PSE(PSE), L(L) {}
+
+ template <typename ITy> bool match(ITy *V) const {
+ VPValue *Update;
+ if (!VPlanPatternMatch::match(
+ V, m_VPValue(Cmp, m_c_ICmp(m_VPValue(Update, m_Add(m_VPValue(),
+ m_VPValue())),
+ m_LiveIn()))))
+ return false;
+
+ const SCEV *S = vputils::getSCEVExprForVPValue(Update, PSE, L);
+ return SCEVPatternMatch::match(
+ S, m_scev_AffineAddRec(m_SCEV(), m_scev_One(), m_SpecificLoop(L)));
+ }
+};
+
+/// Matches an exit condition formed by comparing the current value of a
+/// affine add recurrence in the given loop with a stride of 1 against a
+/// loop-invariant term. Binds the comparison for the condition.
+template <typename CmpTy>
+static auto m_Countable(CmpTy &&Cmp, PredicatedScalarEvolution &PSE, Loop *L) {
+ return CountableConditionMatch<CmpTy>(Cmp, PSE, L);
+}
+
+bool VPlanTransforms::splitCombinedExits(VPlan &Plan,
+ PredicatedScalarEvolution &PSE,
+ Loop *L) {
+ // Check for a single combined exit in the latch block.
+ // TODO: Generalize to other blocks besides the latch.
+ // If we don't find a combined condition in the latch, just return true
+ // to proceed with vectorization.
+ auto [_, LatchVPBB] = VPBlockUtils::getPlainCFGHeaderAndLatch(Plan);
+ VPValue *Uncountable = nullptr;
+ VPValue *Countable = nullptr;
+ // We're looking for a conditional branch...
+ auto *Term = dyn_cast<VPInstruction>(LatchVPBB->getTerminator());
+ if (!Term || Term->getOpcode() != VPInstruction::BranchOnCond)
+ return true;
+
+ // ...where the condition is a combination of both a countable and an
+ // uncountable comparison.
+ VPValue *Cond = Term->getOperand(0);
+ if (!match(Cond, m_OneUse(m_CombineOr(
+ m_c_LogicalOr(m_Uncountable(Uncountable),
+ m_Countable(Countable, PSE, L)),
----------------
huntergr-arm wrote:
Done.
https://github.com/llvm/llvm-project/pull/205109
More information about the llvm-commits
mailing list