[llvm] [LoopInterchange] Make the entries of the Dependency Matrix unique (PR #116195)
Sjoerd Meijer via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 15 01:18:11 PST 2024
https://github.com/sjoerdmeijer updated https://github.com/llvm/llvm-project/pull/116195
>From 2e0decbc10e3110edbea6ff59f17ee26f7bd07e8 Mon Sep 17 00:00:00 2001
From: Sjoerd Meijer <smeijer at nvidia.com>
Date: Thu, 14 Nov 2024 01:53:44 -0800
Subject: [PATCH] [LoopInterchange] Make the entries of the Dependency Matrix
unique
The entries in the dependency matrix can contain a lot of duplicates,
which is unnecessary and results in more checks that we can avoid, and
this patch does that.
I haven't added tests because the printing of the dependency matrix is
guarded by and #ifdef DUMP_DEP_MATRICES so cannot be printed in normal
builds. But all existing regression tests are passing, so is tested in
that way.
---
.../lib/Transforms/Scalar/LoopInterchange.cpp | 27 ++++++++++++-------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
index db63bda1e6b926..ebecb19203f341 100644
--- a/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopInterchange.cpp
@@ -71,7 +71,7 @@ static const unsigned MaxMemInstrCount = 100;
// Maximum loop depth supported.
static const unsigned MaxLoopNestDepth = 10;
-#ifdef DUMP_DEP_MATRICIES
+#ifndef NDEBUG
static void printDepMatrix(CharMatrix &DepMatrix) {
for (auto &Row : DepMatrix) {
for (auto D : Row)
@@ -110,6 +110,7 @@ static bool populateDependencyMatrix(CharMatrix &DepMatrix, unsigned Level,
<< " Loads and Stores to analyze\n");
ValueVector::iterator I, IE, J, JE;
+ SmallDenseSet<size_t> Seen;
for (I = MemInstr.begin(), IE = MemInstr.end(); I != IE; ++I) {
for (J = I, JE = MemInstr.end(); J != JE; ++J) {
@@ -156,7 +157,14 @@ static bool populateDependencyMatrix(CharMatrix &DepMatrix, unsigned Level,
Dep.push_back('I');
}
- DepMatrix.push_back(Dep);
+ // Make sure we only add unique entries to the dependency matrix.
+ size_t Hash =
+ std::hash<std::string>{}(std::string(Dep.begin(), Dep.end()));
+ if (!Seen.count(Hash)) {
+ Seen.insert(Hash);
+ DepMatrix.push_back(Dep);
+ }
+
if (DepMatrix.size() > MaxMemInstrCount) {
LLVM_DEBUG(dbgs() << "Cannot handle more than " << MaxMemInstrCount
<< " dependencies inside loop\n");
@@ -441,10 +449,9 @@ struct LoopInterchange {
LLVM_DEBUG(dbgs() << "Populating dependency matrix failed\n");
return false;
}
-#ifdef DUMP_DEP_MATRICIES
- LLVM_DEBUG(dbgs() << "Dependence before interchange\n");
- printDepMatrix(DependencyMatrix);
-#endif
+
+ LLVM_DEBUG(dbgs() << "Dependency matrix before interchange:\n";
+ printDepMatrix(DependencyMatrix));
// Get the Outermost loop exit.
BasicBlock *LoopNestExit = OuterMostLoop->getExitBlock();
@@ -484,10 +491,10 @@ struct LoopInterchange {
std::swap(LoopList[i - 1], LoopList[i]);
// Update the DependencyMatrix
interChangeDependencies(DependencyMatrix, i, i - 1);
-#ifdef DUMP_DEP_MATRICIES
- LLVM_DEBUG(dbgs() << "Dependence after interchange\n");
- printDepMatrix(DependencyMatrix);
-#endif
+
+ LLVM_DEBUG(dbgs() << "Dependency matrix after interchange:\n";
+ printDepMatrix(DependencyMatrix));
+
ChangedPerIter |= Interchanged;
Changed |= Interchanged;
}
More information about the llvm-commits
mailing list