Skip to content

Commit 04776bd

Browse files
author
MaheshRavishankar
committed
[mlir][Linalg] Add more utility functions to LinalgDependenceGraph.
Reviewed By: ThomasRaoux Differential Revision: https://reviews.llvm.org/D90582
1 parent 701456b commit 04776bd

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

mlir/include/mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,42 @@ class LinalgDependenceGraph {
104104
ArrayRef<DependenceType> depTypes = {
105105
DependenceType::RAW, DependenceType::WAW}) const;
106106

107+
/// Returns true if the `linalgOp` has dependences into it.
108+
bool hasDependentOperationsInto(LinalgOp linalgOp,
109+
ArrayRef<DependenceType> depTypes = {
110+
DependenceType::RAW,
111+
DependenceType::WAW}) const;
112+
113+
/// Returns true if the `linalgOp` has dependences from it.
114+
bool hasDependentOperationsFrom(LinalgOp linalgOp,
115+
ArrayRef<DependenceType> depTypes = {
116+
DependenceType::RAW,
117+
DependenceType::WAW}) const;
118+
107119
/// Returns true if the `linalgOp` has dependences into or from it.
108120
bool hasDependentOperations(LinalgOp linalgOp,
109121
ArrayRef<DependenceType> depTypes = {
110122
DependenceType::RAW,
111123
DependenceType::WAW}) const;
112124

125+
/// Returns all operations that have a dependence into `linalgOp` of types
126+
/// listed in `depTypes`.
127+
SmallVector<LinalgDependenceGraphElem, 2> getDependentOperationsInto(
128+
LinalgOp linalgOp, ArrayRef<DependenceType> depTypes = {
129+
DependenceType::RAW, DependenceType::WAW}) const;
130+
131+
/// Returns all operations that have a dependence from `linalgOp` of types
132+
/// listed in `depTypes`.
133+
SmallVector<LinalgDependenceGraphElem, 2> getDependentOperationsFrom(
134+
LinalgOp linalgOp, ArrayRef<DependenceType> depTypes = {
135+
DependenceType::RAW, DependenceType::WAW}) const;
136+
137+
/// Returns all dependent operations (into and from) given `operation`.
138+
SmallVector<LinalgDependenceGraphElem, 2>
139+
getDependentOperations(LinalgOp linalgOp,
140+
ArrayRef<DependenceType> depTypes = {
141+
DependenceType::RAW, DependenceType::WAW}) const;
142+
113143
private:
114144
// Keep dependences in both directions, this is not just a performance gain
115145
// but it also reduces usage errors.

mlir/lib/Dialect/Linalg/Analysis/DependenceAnalysis.cpp

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,64 @@ bool LinalgDependenceGraph::hasDependenceFrom(
251251
return false;
252252
}
253253

254-
bool LinalgDependenceGraph::hasDependentOperations(
254+
bool LinalgDependenceGraph::hasDependentOperationsFrom(
255+
LinalgOp linalgOp,
256+
ArrayRef<LinalgDependenceGraph::DependenceType> depTypes) const {
257+
for (auto dep : depTypes) {
258+
if (!getDependencesFrom(linalgOp, dep).empty())
259+
return true;
260+
}
261+
return false;
262+
}
263+
264+
bool LinalgDependenceGraph::hasDependentOperationsInto(
255265
LinalgOp linalgOp,
256266
ArrayRef<LinalgDependenceGraph::DependenceType> depTypes) const {
257267
for (auto dep : depTypes) {
258-
if (!getDependencesFrom(linalgOp, dep).empty() ||
259-
!getDependencesInto(linalgOp, dep).empty())
268+
if (!getDependencesInto(linalgOp, dep).empty())
260269
return true;
261270
}
262271
return false;
263272
}
273+
274+
bool LinalgDependenceGraph::hasDependentOperations(
275+
LinalgOp linalgOp, ArrayRef<DependenceType> depTypes) const {
276+
return hasDependentOperationsInto(linalgOp, depTypes) ||
277+
hasDependentOperationsFrom(linalgOp, depTypes);
278+
}
279+
280+
SmallVector<LinalgDependenceGraph::LinalgDependenceGraphElem, 2>
281+
LinalgDependenceGraph::getDependentOperationsInto(
282+
LinalgOp linalgOp, ArrayRef<DependenceType> depTypes) const {
283+
SmallVector<LinalgDependenceGraph::LinalgDependenceGraphElem, 2>
284+
dependentOperations;
285+
for (auto dependenceType : depTypes) {
286+
auto dependencies = getDependencesInto(linalgOp, dependenceType);
287+
dependentOperations.append(dependencies.begin(), dependencies.end());
288+
}
289+
return dependentOperations;
290+
}
291+
292+
SmallVector<LinalgDependenceGraph::LinalgDependenceGraphElem, 2>
293+
LinalgDependenceGraph::getDependentOperationsFrom(
294+
LinalgOp linalgOp, ArrayRef<DependenceType> depTypes) const {
295+
SmallVector<LinalgDependenceGraph::LinalgDependenceGraphElem, 2>
296+
dependentOperations;
297+
for (auto dependenceType : depTypes) {
298+
auto dependencies = getDependencesFrom(linalgOp, dependenceType);
299+
dependentOperations.append(dependencies.begin(), dependencies.end());
300+
}
301+
return dependentOperations;
302+
}
303+
304+
/// Returns all dependent operations (into and from) given `operation`.
305+
SmallVector<LinalgDependenceGraph::LinalgDependenceGraphElem, 2>
306+
LinalgDependenceGraph::getDependentOperations(
307+
LinalgOp linalgOp, ArrayRef<DependenceType> depTypes) const {
308+
SmallVector<LinalgDependenceGraphElem, 2> dependentOperations =
309+
getDependentOperationsInto(linalgOp, depTypes);
310+
SmallVector<LinalgDependenceGraphElem, 2> t =
311+
getDependentOperationsFrom(linalgOp, depTypes);
312+
dependentOperations.append(t.begin(), t.end());
313+
return dependentOperations;
314+
}

0 commit comments

Comments
 (0)