[llvm] [LoopInterchange] Consider forward/backward dependency in vectorize heuristic (PR #133672)
Ryotaro Kasuga via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 31 04:20:45 PDT 2025
================
@@ -1334,21 +1405,34 @@ LoopInterchangeProfitability::isProfitablePerInstrOrderCost() {
static bool canVectorize(const CharMatrix &DepMatrix, unsigned LoopId) {
for (const auto &Dep : DepMatrix) {
char Dir = Dep[LoopId];
- if (Dir != 'I' && Dir != '=')
- return false;
+ char DepType = Dep.back();
+ assert((DepType == '<' || DepType == '*') &&
+ "Unexpected element in dependency vector");
+
+ // There are no loop-carried dependencies.
+ if (Dir == '=' || Dir == 'I')
+ continue;
+
+ // DepType being '<' means that this direction vector represents a forward
+ // dependency. In principle, a loop with '<' direction can be vectorized in
+ // this case.
+ if (Dir == '<' && DepType == '<')
+ continue;
+
+ // We cannot prove that the loop is vectorizable.
+ return false;
}
return true;
}
std::optional<bool> LoopInterchangeProfitability::isProfitableForVectorization(
unsigned InnerLoopId, unsigned OuterLoopId, CharMatrix &DepMatrix) {
- // If the outer loop is not loop independent it is not profitable to move
- // this to inner position, since doing so would not enable inner loop
- // parallelism.
+ // If the outer loop cannot be vectorized, it is not profitable to move this
+ // to inner position.
if (!canVectorize(DepMatrix, OuterLoopId))
return false;
- // If inner loop has dependence and outer loop is loop independent then it is
+ // If inner loop cannot be vectorized and outer loop can be then it is
----------------
kasuga-fj wrote:
Ah, sorry, the issue already exists: https://github.com/llvm/llvm-project/issues/148435#issuecomment-3084019154
I think this is a kind of wrapping problem. IIRC, the `%and` is represented as `{false,+,true}<%loop>`, which would wrap. But DA casts it to i64 and ultimately overlooks the wrapping.
(While I'm at it, I'll share the other issues I found: https://github.com/llvm/llvm-project/issues/149977, https://github.com/llvm/llvm-project/issues/149501, https://github.com/llvm/llvm-project/issues/149991).
> Would be looking forward to cleanup PRs on DA.
👍
https://github.com/llvm/llvm-project/pull/133672
More information about the llvm-commits
mailing list