[Mlir-commits] [mlir] [mlir] [dataflow] further optimize dataflow compile time (PR #149804)
donald chen
llvmlistbot at llvm.org
Wed Jul 23 01:56:32 PDT 2025
https://github.com/cxy-1993 updated https://github.com/llvm/llvm-project/pull/149804
>From dee817a671e2c1601e3deafdc1a9457aa0093835 Mon Sep 17 00:00:00 2001
From: donald chen <chenxunyu1993 at gmail.com>
Date: Mon, 21 Jul 2025 12:26:24 +0000
Subject: [PATCH 1/2] [mlir] [dataflow] further optimize dataflow compile time
Optimize dataflow compilation time by skipping initialization
of irrelevant operations
---
mlir/include/mlir/Analysis/DataFlowFramework.h | 9 +++++++++
mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp | 8 ++++++++
.../DataFlow/TestDenseBackwardDataFlowAnalysis.cpp | 1 +
.../DataFlow/TestDenseForwardDataFlowAnalysis.cpp | 1 +
4 files changed, 19 insertions(+)
diff --git a/mlir/include/mlir/Analysis/DataFlowFramework.h b/mlir/include/mlir/Analysis/DataFlowFramework.h
index 49862927caff2..67d593a7bfad4 100644
--- a/mlir/include/mlir/Analysis/DataFlowFramework.h
+++ b/mlir/include/mlir/Analysis/DataFlowFramework.h
@@ -658,6 +658,12 @@ class DataFlowAnalysis {
return solver.getOrCreateState<StateT>(anchor);
}
+ /// Add irrelevant program point.
+ template <typename PointT>
+ void addIrrelevantPoint(PointT point) {
+ irrelevantPoints.insert(ProgramPoint(point));
+ }
+
/// Get a read-only analysis state for the given point and create a dependency
/// on `dependent`. If the return state is updated elsewhere, this analysis is
/// re-invoked on the dependent.
@@ -695,6 +701,9 @@ class DataFlowAnalysis {
StringRef debugName;
#endif // LLVM_ENABLE_ABI_BREAKING_CHECKS
+ /// Program points shouldn't analyzed by this analysis.
+ DenseSet<ProgramPoint> irrelevantPoints;
+
private:
/// The parent data-flow solver.
DataFlowSolver &solver;
diff --git a/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp b/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp
index d05374f667a51..0d0d841b0bff8 100644
--- a/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp
+++ b/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp
@@ -104,6 +104,10 @@ void AbstractDenseForwardDataFlowAnalysis::visitCallOperation(
LogicalResult
AbstractDenseForwardDataFlowAnalysis::processOperation(Operation *op) {
+ // Skip irrelavant program points.
+ if (irrelevantPoints.contains(ProgramPoint(op)))
+ return;
+
ProgramPoint *point = getProgramPointAfter(op);
// If the containing block is not executable, bail out.
if (op->getBlock() != nullptr &&
@@ -333,6 +337,10 @@ void AbstractDenseBackwardDataFlowAnalysis::visitCallOperation(
LogicalResult
AbstractDenseBackwardDataFlowAnalysis::processOperation(Operation *op) {
+ // Skip irrelavant program points.
+ if (irrelevantPoints.contains(ProgramPoint(op)))
+ return;
+
ProgramPoint *point = getProgramPointBefore(op);
// If the containing block is not executable, bail out.
if (op->getBlock() != nullptr &&
diff --git a/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp b/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp
index d57b41c41de64..f73430fb78c58 100644
--- a/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp
+++ b/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp
@@ -147,6 +147,7 @@ LogicalResult NextAccessAnalysis::visitOperation(Operation *op,
void NextAccessAnalysis::buildOperationEquivalentLatticeAnchor(Operation *op) {
if (isMemoryEffectFree(op)) {
+ addIrrelevantPoint(op);
unionLatticeAnchors<NextAccess>(getProgramPointBefore(op),
getProgramPointAfter(op));
}
diff --git a/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp b/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp
index a88ed7f8dea8b..ea5614c24a6bf 100644
--- a/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp
+++ b/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp
@@ -154,6 +154,7 @@ LogicalResult LastModifiedAnalysis::visitOperation(
void LastModifiedAnalysis::buildOperationEquivalentLatticeAnchor(
Operation *op) {
if (isMemoryEffectFree(op)) {
+ addIrrelevantPoint(op);
unionLatticeAnchors<LastModification>(getProgramPointBefore(op),
getProgramPointAfter(op));
}
>From 9e09fe498f56c5e2f560ed0d711c7e85c8fcb4e1 Mon Sep 17 00:00:00 2001
From: donald chen <chenxunyu1993 at gmail.com>
Date: Wed, 23 Jul 2025 01:50:02 +0000
Subject: [PATCH 2/2] fix program point usage
---
mlir/include/mlir/Analysis/DataFlowFramework.h | 7 +++----
mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp | 12 ++++++------
.../DataFlow/TestDenseBackwardDataFlowAnalysis.cpp | 2 +-
.../DataFlow/TestDenseForwardDataFlowAnalysis.cpp | 2 +-
4 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/mlir/include/mlir/Analysis/DataFlowFramework.h b/mlir/include/mlir/Analysis/DataFlowFramework.h
index 67d593a7bfad4..654d888174089 100644
--- a/mlir/include/mlir/Analysis/DataFlowFramework.h
+++ b/mlir/include/mlir/Analysis/DataFlowFramework.h
@@ -659,9 +659,8 @@ class DataFlowAnalysis {
}
/// Add irrelevant program point.
- template <typename PointT>
- void addIrrelevantPoint(PointT point) {
- irrelevantPoints.insert(ProgramPoint(point));
+ void addIrrelevantPoint(ProgramPoint *point) {
+ irrelevantPoints.insert(point);
}
/// Get a read-only analysis state for the given point and create a dependency
@@ -702,7 +701,7 @@ class DataFlowAnalysis {
#endif // LLVM_ENABLE_ABI_BREAKING_CHECKS
/// Program points shouldn't analyzed by this analysis.
- DenseSet<ProgramPoint> irrelevantPoints;
+ DenseSet<ProgramPoint *> irrelevantPoints;
private:
/// The parent data-flow solver.
diff --git a/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp b/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp
index 0d0d841b0bff8..3bbd95982be75 100644
--- a/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp
+++ b/mlir/lib/Analysis/DataFlow/DenseAnalysis.cpp
@@ -105,10 +105,10 @@ void AbstractDenseForwardDataFlowAnalysis::visitCallOperation(
LogicalResult
AbstractDenseForwardDataFlowAnalysis::processOperation(Operation *op) {
// Skip irrelavant program points.
- if (irrelevantPoints.contains(ProgramPoint(op)))
- return;
-
ProgramPoint *point = getProgramPointAfter(op);
+ if (irrelevantPoints.contains(point))
+ return success();
+
// If the containing block is not executable, bail out.
if (op->getBlock() != nullptr &&
!getOrCreateFor<Executable>(point, getProgramPointBefore(op->getBlock()))
@@ -338,10 +338,10 @@ void AbstractDenseBackwardDataFlowAnalysis::visitCallOperation(
LogicalResult
AbstractDenseBackwardDataFlowAnalysis::processOperation(Operation *op) {
// Skip irrelavant program points.
- if (irrelevantPoints.contains(ProgramPoint(op)))
- return;
-
ProgramPoint *point = getProgramPointBefore(op);
+ if (irrelevantPoints.contains(point))
+ return success();
+
// If the containing block is not executable, bail out.
if (op->getBlock() != nullptr &&
!getOrCreateFor<Executable>(point, getProgramPointBefore(op->getBlock()))
diff --git a/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp b/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp
index f73430fb78c58..881deff0ef4a5 100644
--- a/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp
+++ b/mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp
@@ -147,7 +147,7 @@ LogicalResult NextAccessAnalysis::visitOperation(Operation *op,
void NextAccessAnalysis::buildOperationEquivalentLatticeAnchor(Operation *op) {
if (isMemoryEffectFree(op)) {
- addIrrelevantPoint(op);
+ addIrrelevantPoint(getProgramPointBefore(op));
unionLatticeAnchors<NextAccess>(getProgramPointBefore(op),
getProgramPointAfter(op));
}
diff --git a/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp b/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp
index ea5614c24a6bf..462bea0c6bcc9 100644
--- a/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp
+++ b/mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp
@@ -154,7 +154,7 @@ LogicalResult LastModifiedAnalysis::visitOperation(
void LastModifiedAnalysis::buildOperationEquivalentLatticeAnchor(
Operation *op) {
if (isMemoryEffectFree(op)) {
- addIrrelevantPoint(op);
+ addIrrelevantPoint(getProgramPointAfter(op));
unionLatticeAnchors<LastModification>(getProgramPointBefore(op),
getProgramPointAfter(op));
}
More information about the Mlir-commits
mailing list