From 4a1682e931c1b4bfed77194fa43d18435f88d092 Mon Sep 17 00:00:00 2001 From: MaheshRavishankar Date: Thu, 8 Oct 2020 10:01:33 -0700 Subject: [PATCH] [mlir][Linalg] Add some depedence query methods to LinalgDependenceGraph. The methods allow to check - if an operation has dependencies, - if there is a dependence from one operation to another. Differential Revision: https://reviews.llvm.org/D88993 --- .../Dialect/Linalg/Analysis/DependenceAnalysis.h | 12 ++++++++++ .../Dialect/Linalg/Analysis/DependenceAnalysis.cpp | 27 ++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/mlir/include/mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h b/mlir/include/mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h index e40d636..057b1bc 100644 --- a/mlir/include/mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h +++ b/mlir/include/mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h @@ -98,6 +98,18 @@ public: LinalgOp dstLinalgOp, Value view) const; + /// Returns true if the two operations have the specified dependence from + /// `srcLinalgOp` to `dstLinalgOp`. + bool hasDependenceFrom(LinalgOp srcLinalgOp, LinalgOp dstLinalgOp, + ArrayRef depTypes = { + DependenceType::RAW, DependenceType::WAW}) const; + + /// Returns true if the `linalgOp` has dependences into or from it. + bool hasDependentOperations(LinalgOp linalgOp, + ArrayRef depTypes = { + DependenceType::RAW, + DependenceType::WAW}) const; + private: // Keep dependences in both directions, this is not just a performance gain // but it also reduces usage errors. diff --git a/mlir/lib/Dialect/Linalg/Analysis/DependenceAnalysis.cpp b/mlir/lib/Dialect/Linalg/Analysis/DependenceAnalysis.cpp index 292a326..bffd9bd 100644 --- a/mlir/lib/Dialect/Linalg/Analysis/DependenceAnalysis.cpp +++ b/mlir/lib/Dialect/Linalg/Analysis/DependenceAnalysis.cpp @@ -162,7 +162,7 @@ void LinalgDependenceGraph::addDependencesBetween(LinalgOp src, LinalgOp dst) { } // WAW graph for (auto dstView : dst.getOutputBuffers()) { // W - if (aliases.alias(srcView, dstView)) { // if alias, fill WAW + if (aliases.alias(srcView, dstView)) { // if alias, fill WAW addDependenceElem(DependenceType::WAW, LinalgOpView{src.getOperation(), srcView}, LinalgOpView{dst.getOperation(), dstView}); @@ -180,7 +180,7 @@ void LinalgDependenceGraph::addDependencesBetween(LinalgOp src, LinalgOp dst) { } // WAR graph for (auto dstView : dst.getOutputBuffers()) { // W - if (aliases.alias(srcView, dstView)) { // if alias, fill WAR + if (aliases.alias(srcView, dstView)) { // if alias, fill WAR addDependenceElem(DependenceType::WAR, LinalgOpView{src.getOperation(), srcView}, LinalgOpView{dst.getOperation(), dstView}); @@ -242,3 +242,26 @@ LinalgDependenceGraph::findOperationsWithCoveringDependences( } return res; } + +bool LinalgDependenceGraph::hasDependenceFrom( + LinalgOp srcLinalgOp, LinalgOp dstLinalgOp, + ArrayRef depTypes) const { + for (auto dep : depTypes) { + for (auto dependence : getDependencesInto(dstLinalgOp, dep)) { + if (dependence.dependentOpView.op == srcLinalgOp) + return true; + } + } + return false; +} + +bool LinalgDependenceGraph::hasDependentOperations( + LinalgOp linalgOp, + ArrayRef depTypes) const { + for (auto dep : depTypes) { + if (!getDependencesFrom(linalgOp, dep).empty() || + !getDependencesInto(linalgOp, dep).empty()) + return true; + } + return false; +} -- 2.7.4