[llvm] [LoadStoreVectorizer] Propagate alignment through contiguous chain (PR #145733)
Drew Kersnar via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 10 12:50:27 PDT 2025
================
@@ -1634,3 +1638,32 @@ std::optional<APInt> Vectorizer::getConstantOffset(Value *PtrA, Value *PtrB,
.sextOrTrunc(OrigBitWidth);
return std::nullopt;
}
+
+void Vectorizer::propagateBestAlignmentsInChain(ArrayRef<ChainElem> C) const {
+ auto PropagateAlignments = [](auto ChainIt) {
+ ChainElem BestAlignedElem = *ChainIt.begin();
+ Align BestAlignSoFar = getLoadStoreAlignment(BestAlignedElem.Inst);
+
+ for (const ChainElem &E : ChainIt) {
+ Align OrigAlign = getLoadStoreAlignment(E.Inst);
+ if (OrigAlign > BestAlignSoFar) {
+ BestAlignedElem = E;
+ BestAlignSoFar = OrigAlign;
+ continue;
+ }
+
+ APInt DeltaFromBestAlignedElem =
+ APIntOps::abdu(E.OffsetFromLeader, BestAlignedElem.OffsetFromLeader);
+ // commonAlignment is equivalent to a greatest common power-of-two
+ // divisor; it returns the largest power of 2 that divides both A and B.
+ Align NewAlign = commonAlignment(
+ BestAlignSoFar, DeltaFromBestAlignedElem.getLimitedValue());
+ if (NewAlign > OrigAlign)
+ setLoadStoreAlignment(E.Inst, NewAlign);
+ }
+ };
+
+ // Propagate forwards and backwards.
+ PropagateAlignments(C);
+ PropagateAlignments(reverse(C));
----------------
dakersnar wrote:
> as we don't need alignments larger than the size of the largest aligned load
Actually, I think we would want to search for alignments up to the memory size of the chain, and at that point it's probably not worth including an early exit case, as I don't think we have enough context at this point to build an easy heuristic.
However, I agree that the algorithm you are suggesting is more intuitive/readable and saves some calls to setMaxAlignment with the same number of iterations, even without the early exit. I just updated it and I think it's improved.
https://github.com/llvm/llvm-project/pull/145733
More information about the llvm-commits
mailing list