Skip to content

Commit 7726c48

Browse files
authored
[circt-reduce] Prevent canonicalize looping for extremely long time (#9030)
A hanging bug can manifest with very large inputs to minimize at canonicalize pass. This is because if the maxNumRewrites is not set, it defaults to kNoLimit, which could be an arbitrary large number. This optional command line argument makes it possible to set the max number of rewrites for large input files to minimize. Signed-off-by: Tianrui Wei <[email protected]>
1 parent 3c2bd66 commit 7726c48

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

include/circt/Reduce/GenericReductions.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,19 @@
1010
#define CIRCT_REDUCE_GENERICREDUCTIONS_H
1111

1212
#include "circt/Reduce/Reduction.h"
13+
#include <optional>
1314

1415
namespace circt {
1516

1617
/// Populate reduction patterns that are not specific to certain operations or
17-
/// dialects
18-
void populateGenericReducePatterns(MLIRContext *context,
19-
ReducePatternSet &patterns);
18+
/// dialects.
19+
///
20+
/// The optional `maxNumRewrites` parameter allows callers to override the
21+
/// greedy rewrite budget used by reductions that rely on the canonicalizer
22+
/// pass.
23+
void populateGenericReducePatterns(
24+
MLIRContext *context, ReducePatternSet &patterns,
25+
std::optional<int64_t> maxNumRewrites = std::nullopt);
2026

2127
} // namespace circt
2228

lib/Reduce/GenericReductions.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,23 @@ struct MakeSymbolsPrivate : public Reduction {
9696
// Reduction Registration
9797
//===----------------------------------------------------------------------===//
9898

99-
static std::unique_ptr<Pass> createSimpleCanonicalizerPass() {
99+
static std::unique_ptr<Pass>
100+
createSimpleCanonicalizerPass(std::optional<int64_t> maxNumRewrites) {
100101
GreedyRewriteConfig config;
101102
config.setUseTopDownTraversal(true);
102103
config.setRegionSimplificationLevel(
103104
mlir::GreedySimplifyRegionLevel::Disabled);
105+
if (maxNumRewrites)
106+
config.setMaxNumRewrites(*maxNumRewrites);
104107
return createCanonicalizerPass(config);
105108
}
106109

107-
void circt::populateGenericReducePatterns(MLIRContext *context,
108-
ReducePatternSet &patterns) {
110+
void circt::populateGenericReducePatterns(
111+
MLIRContext *context, ReducePatternSet &patterns,
112+
std::optional<int64_t> maxNumRewrites) {
109113
patterns.add<PassReduction, 103>(context, createSymbolDCEPass());
110-
patterns.add<PassReduction, 102>(context, createSimpleCanonicalizerPass());
114+
patterns.add<PassReduction, 102>(
115+
context, createSimpleCanonicalizerPass(maxNumRewrites));
111116
patterns.add<PassReduction, 101>(context, createCSEPass());
112117
patterns.add<MakeSymbolsPrivate, 100>();
113118
patterns.add<UnusedSymbolPruner, 99>();

tools/circt-reduce/circt-reduce.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ static cl::opt<bool> verbose("v", cl::init(true),
104104
cl::desc("Print reduction progress to stderr"),
105105
cl::cat(mainCategory));
106106

107+
cl::opt<int64_t> maxNumRewrites(
108+
"max-num-rewrites", cl::init(-1),
109+
cl::desc("Maximum number of rewrites GreedyPatternRewriteDriver may "
110+
"apply (negative value keeps the default)"),
111+
cl::cat(mainCategory));
112+
107113
static cl::opt<unsigned>
108114
maxChunks("max-chunks", cl::init(0),
109115
cl::desc("Stop increasing granularity beyond this number of "
@@ -193,7 +199,10 @@ static LogicalResult execute(MLIRContext &context) {
193199

194200
// Gather a list of reduction patterns that we should try.
195201
ReducePatternSet patterns;
196-
populateGenericReducePatterns(&context, patterns);
202+
std::optional<int64_t> maxNumRewritesOpt;
203+
if (maxNumRewrites >= 0)
204+
maxNumRewritesOpt = maxNumRewrites;
205+
populateGenericReducePatterns(&context, patterns, maxNumRewritesOpt);
197206
ReducePatternInterfaceCollection reducePatternCollection(&context);
198207
reducePatternCollection.populateReducePatterns(patterns);
199208
auto reductionFilter = [&](const Reduction &reduction) {

0 commit comments

Comments
 (0)