Skip to content

Commit b533b0e

Browse files
j2kunftynse
andauthored
Define a DataFlowSolver helper that loads sensible default analyses (llvm#143415)
Cf. https://discourse.llvm.org/t/mlir-dead-code-analysis/67568/10 Custom analysis passes will not work properly unless both DeadCodeAnalysis and SparseConstantPropagation are loaded to the DataFlowSolver. This is intended behavior, but surprising to many users as shown in the thread. In lieu of a longer-term fix (which I am not knowledgeable enough to implement myself, yet), this commit adds a helper function that loads these two analyses, as well as providing breadcrumbs for an explanation of the problem. The existing places in the codebase where these two analyses are loaded for the purpose of running other unrelated analyses are replaced by the use of the helper. --------- Co-authored-by: Jeremy Kun <[email protected]> Co-authored-by: Oleksandr "Alex" Zinenko <[email protected]>
1 parent 71e20c6 commit b533b0e

File tree

6 files changed

+47
-20
lines changed

6 files changed

+47
-20
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//===-Utils.h - DataFlow utility functions ----------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file defines utility functions for dataflow analyses.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef MLIR_ANALYSIS_DATAFLOW_UTILS_H
14+
#define MLIR_ANALYSIS_DATAFLOW_UTILS_H
15+
16+
#include "mlir/Analysis/DataFlow/ConstantPropagationAnalysis.h"
17+
#include "mlir/Analysis/DataFlow/DeadCodeAnalysis.h"
18+
#include "mlir/Analysis/DataFlowFramework.h"
19+
20+
namespace mlir {
21+
namespace dataflow {
22+
23+
/// Populates a DataFlowSolver with analyses that are required to ensure
24+
/// user-defined analyses are run properly.
25+
///
26+
/// This helper is intended to be an interim fix until a more robust solution
27+
/// can be implemented in the DataFlow framework directly. Cf.
28+
/// https://discourse.llvm.org/t/mlir-dead-code-analysis/67568
29+
inline void loadBaselineAnalyses(DataFlowSolver &solver) {
30+
solver.load<dataflow::DeadCodeAnalysis>();
31+
solver.load<dataflow::SparseConstantPropagation>();
32+
}
33+
34+
} // end namespace dataflow
35+
} // end namespace mlir
36+
37+
#endif // MLIR_ANALYSIS_DATAFLOW_INTEGERANGEANALYSIS_H

mlir/lib/Analysis/DataFlow/LivenessAnalysis.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
#include <cassert>
1111
#include <mlir/Analysis/DataFlow/LivenessAnalysis.h>
1212

13-
#include <mlir/Analysis/DataFlow/ConstantPropagationAnalysis.h>
14-
#include <mlir/Analysis/DataFlow/DeadCodeAnalysis.h>
1513
#include <mlir/Analysis/DataFlow/SparseAnalysis.h>
14+
#include <mlir/Analysis/DataFlow/Utils.h>
1615
#include <mlir/Analysis/DataFlowFramework.h>
1716
#include <mlir/IR/Operation.h>
1817
#include <mlir/IR/Value.h>
@@ -249,8 +248,7 @@ void LivenessAnalysis::setToExitState(Liveness *lattice) {
249248
RunLivenessAnalysis::RunLivenessAnalysis(Operation *op) {
250249
SymbolTableCollection symbolTable;
251250

252-
solver.load<DeadCodeAnalysis>();
253-
solver.load<SparseConstantPropagation>();
251+
loadBaselineAnalyses(solver);
254252
solver.load<LivenessAnalysis>(symbolTable);
255253
(void)solver.initializeAndRun(op);
256254
}

mlir/lib/Dialect/XeGPU/Transforms/XeGPUSubgroupDistribute.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
77
//===----------------------------------------------------------------------===//
8-
#include "mlir/Analysis/DataFlow/ConstantPropagationAnalysis.h"
9-
#include "mlir/Analysis/DataFlow/DeadCodeAnalysis.h"
108
#include "mlir/Analysis/DataFlow/SparseAnalysis.h"
9+
#include "mlir/Analysis/DataFlow/Utils.h"
1110
#include "mlir/Analysis/DataFlowFramework.h"
1211
#include "mlir/Dialect/GPU/IR/GPUDialect.h"
1312
#include "mlir/Dialect/GPU/Utils/DistributionUtils.h"
@@ -620,8 +619,7 @@ class RunLayoutInfoPropagation {
620619

621620
RunLayoutInfoPropagation(Operation *op) : target(op) {
622621
SymbolTableCollection symbolTable;
623-
solver.load<DeadCodeAnalysis>();
624-
solver.load<SparseConstantPropagation>();
622+
loadBaselineAnalyses(solver);
625623
solver.load<LayoutInfoPropagation>(symbolTable);
626624
(void)solver.initializeAndRun(op);
627625
}

mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
#include "TestDenseDataFlowAnalysis.h"
1414
#include "TestDialect.h"
1515
#include "TestOps.h"
16-
#include "mlir/Analysis/DataFlow/ConstantPropagationAnalysis.h"
17-
#include "mlir/Analysis/DataFlow/DeadCodeAnalysis.h"
1816
#include "mlir/Analysis/DataFlow/DenseAnalysis.h"
17+
#include "mlir/Analysis/DataFlow/Utils.h"
1918
#include "mlir/Analysis/DataFlowFramework.h"
2019
#include "mlir/IR/Builders.h"
2120
#include "mlir/IR/SymbolTable.h"
@@ -283,9 +282,8 @@ struct TestNextAccessPass
283282

284283
auto config = DataFlowConfig().setInterprocedural(interprocedural);
285284
DataFlowSolver solver(config);
286-
solver.load<DeadCodeAnalysis>();
285+
loadBaselineAnalyses(solver);
287286
solver.load<NextAccessAnalysis>(symbolTable, assumeFuncReads);
288-
solver.load<SparseConstantPropagation>();
289287
solver.load<UnderlyingValueAnalysis>();
290288
if (failed(solver.initializeAndRun(op))) {
291289
emitError(op->getLoc(), "dataflow solver failed");

mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
#include "TestDenseDataFlowAnalysis.h"
1414
#include "TestDialect.h"
1515
#include "TestOps.h"
16-
#include "mlir/Analysis/DataFlow/ConstantPropagationAnalysis.h"
17-
#include "mlir/Analysis/DataFlow/DeadCodeAnalysis.h"
1816
#include "mlir/Analysis/DataFlow/DenseAnalysis.h"
17+
#include "mlir/Analysis/DataFlow/Utils.h"
1918
#include "mlir/Interfaces/SideEffectInterfaces.h"
2019
#include "mlir/Pass/Pass.h"
2120
#include "mlir/Support/LLVM.h"
@@ -240,8 +239,7 @@ struct TestLastModifiedPass
240239
Operation *op = getOperation();
241240

242241
DataFlowSolver solver(DataFlowConfig().setInterprocedural(interprocedural));
243-
solver.load<DeadCodeAnalysis>();
244-
solver.load<SparseConstantPropagation>();
242+
loadBaselineAnalyses(solver);
245243
solver.load<LastModifiedAnalysis>(assumeFuncWrites);
246244
solver.load<UnderlyingValueAnalysis>();
247245
if (failed(solver.initializeAndRun(op)))

mlir/test/lib/Analysis/DataFlow/TestSparseBackwardDataFlowAnalysis.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
#include "mlir/Analysis/DataFlow/ConstantPropagationAnalysis.h"
10-
#include "mlir/Analysis/DataFlow/DeadCodeAnalysis.h"
119
#include "mlir/Analysis/DataFlow/SparseAnalysis.h"
10+
#include "mlir/Analysis/DataFlow/Utils.h"
1211
#include "mlir/Dialect/MemRef/IR/MemRef.h"
1312
#include "mlir/Interfaces/SideEffectInterfaces.h"
1413
#include "mlir/Pass/Pass.h"
@@ -182,8 +181,7 @@ struct TestWrittenToPass
182181
SymbolTableCollection symbolTable;
183182

184183
DataFlowSolver solver(DataFlowConfig().setInterprocedural(interprocedural));
185-
solver.load<DeadCodeAnalysis>();
186-
solver.load<SparseConstantPropagation>();
184+
loadBaselineAnalyses(solver);
187185
solver.load<WrittenToAnalysis>(symbolTable, assumeFuncWrites);
188186
if (failed(solver.initializeAndRun(op)))
189187
return signalPassFailure();

0 commit comments

Comments
 (0)