16
16
#include " mlir/Transforms/DialectConversion.h"
17
17
#include " llvm/Support/CommandLine.h"
18
18
19
- // / disable FIR to scf dialect conversion
20
- static llvm::cl::opt<bool >
21
- disableCfgConversion (" disable-cfg-conversion" ,
22
- llvm::cl::desc (" disable FIR to CFG pass" ),
23
- llvm::cl::init(false ));
24
-
25
- // / minimum trip count is 1, not 0
26
- static llvm::cl::opt<bool > forceLoopToExecuteOnce (
27
- " always-execute-loop-body" ,
28
- llvm::cl::desc (" force the body of a loop to execute at least once" ),
29
- llvm::cl::init(false ));
30
-
31
19
using namespace fir ;
32
20
33
21
namespace {
@@ -40,7 +28,11 @@ namespace {
40
28
// / Convert `fir.do_loop` to CFG
41
29
class CfgLoopConv : public mlir ::OpRewritePattern<fir::DoLoopOp> {
42
30
public:
43
- using OpRewritePattern::OpRewritePattern;
31
+ using OpRewritePattern::OpRewritePattern;
32
+
33
+ CfgLoopConv (mlir::MLIRContext *ctx, bool forceLoopToExecuteOnce)
34
+ : mlir::OpRewritePattern<fir::DoLoopOp>(ctx),
35
+ forceLoopToExecuteOnce (forceLoopToExecuteOnce) {}
44
36
45
37
mlir::LogicalResult
46
38
matchAndRewrite (DoLoopOp loop,
@@ -133,13 +125,19 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
133
125
rewriter.replaceOp (loop, args.drop_back ());
134
126
return success ();
135
127
}
128
+
129
+ private:
130
+ bool forceLoopToExecuteOnce;
136
131
};
137
132
138
133
// / Convert `fir.if` to control-flow
139
134
class CfgIfConv : public mlir ::OpRewritePattern<fir::IfOp> {
140
135
public:
141
136
using OpRewritePattern::OpRewritePattern;
142
137
138
+ CfgIfConv (mlir::MLIRContext *ctx, bool forceLoopToExecuteOnce)
139
+ : mlir::OpRewritePattern<fir::IfOp>(ctx) {}
140
+
143
141
mlir::LogicalResult
144
142
matchAndRewrite (IfOp ifOp, mlir::PatternRewriter &rewriter) const override {
145
143
auto loc = ifOp.getLoc ();
@@ -200,6 +198,9 @@ class CfgIterWhileConv : public mlir::OpRewritePattern<fir::IterWhileOp> {
200
198
public:
201
199
using OpRewritePattern::OpRewritePattern;
202
200
201
+ CfgIterWhileConv (mlir::MLIRContext *ctx, bool forceLoopToExecuteOnce)
202
+ : mlir::OpRewritePattern<fir::IterWhileOp>(ctx) {}
203
+
203
204
mlir::LogicalResult
204
205
matchAndRewrite (fir::IterWhileOp whileOp,
205
206
mlir::PatternRewriter &rewriter) const override {
@@ -292,12 +293,10 @@ class CfgIterWhileConv : public mlir::OpRewritePattern<fir::IterWhileOp> {
292
293
class CfgConversion : public CFGConversionBase <CfgConversion> {
293
294
public:
294
295
void runOnFunction () override {
295
- if (disableCfgConversion)
296
- return ;
297
-
298
296
auto *context = &getContext ();
299
297
mlir::OwningRewritePatternList patterns (context);
300
- patterns.insert <CfgLoopConv, CfgIfConv, CfgIterWhileConv>(context);
298
+ patterns.insert <CfgLoopConv, CfgIfConv, CfgIterWhileConv>(
299
+ context, forceLoopToExecuteOnce);
301
300
mlir::ConversionTarget target (*context);
302
301
target.addLegalDialect <mlir::AffineDialect, FIROpsDialect,
303
302
mlir::StandardOpsDialect>();
@@ -315,7 +314,6 @@ class CfgConversion : public CFGConversionBase<CfgConversion> {
315
314
};
316
315
} // namespace
317
316
318
- bool fir::isAlwaysExecuteLoopBody () { return forceLoopToExecuteOnce; }
319
317
// / Convert FIR's structured control flow ops to CFG ops. This
320
318
// / conversion enables the `createLowerToCFGPass` to transform these to CFG
321
319
// / form.
0 commit comments