Skip to content

Commit c4acf26

Browse files
authored
[fir] Sync cfg-conversion pass after upstreaming change
1 parent 39ce31c commit c4acf26

File tree

9 files changed

+314
-22
lines changed

9 files changed

+314
-22
lines changed

flang/include/flang/Lower/Bridge.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "flang/Lower/AbstractConverter.h"
1818
#include "flang/Optimizer/Support/KindMapping.h"
1919
#include "mlir/IR/BuiltinOps.h"
20+
#include "llvm/Support/CommandLine.h"
2021

2122
namespace Fortran {
2223
namespace common {

flang/include/flang/Optimizer/Transforms/Passes.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ def CFGConversion : FunctionPass<"cfg-conversion"> {
120120
let dependentDialects = [
121121
"fir::FIROpsDialect", "mlir::StandardOpsDialect"
122122
];
123+
let options = [
124+
Option<"forceLoopToExecuteOnce", "always-execute-loop-body", "bool",
125+
/*default=*/"false",
126+
"force the body of a loop to execute at least once">
127+
];
123128
}
124129

125130
def ArrayValueCopy : FunctionPass<"array-value-copy"> {

flang/include/flang/Tools/CLOptions.inc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
namespace {
1818
// Optimizer Passes
1919
DisableOption(FirCse, "fir-cse", "CSE for FIR dialect");
20+
DisableOption(CfgConversion, "cfg-conversion", "disable FIR to CFG pass");
2021

2122
// CodeGen Passes
2223
#if !defined(FLANG_EXCLUDE_CODEGEN)
@@ -45,6 +46,11 @@ void addNestedPassConditionally(
4546

4647
namespace fir {
4748

49+
inline void addCfgConversionPass(mlir::PassManager &pm) {
50+
addNestedPassConditionally<mlir::FuncOp>(
51+
pm, disableCfgConversion, fir::createFirToCfgPass);
52+
}
53+
4854
inline void addCSE(mlir::PassManager &pm) {
4955
addNestedPassConditionally<mlir::FuncOp>(
5056
pm, disableFirCse, fir::createCSEPass);

flang/lib/Lower/Bridge.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ static llvm::cl::opt<bool> dumpBeforeFir(
5858
"fdebug-dump-pre-fir", llvm::cl::init(false),
5959
llvm::cl::desc("dump the Pre-FIR tree prior to FIR generation"));
6060

61+
static llvm::cl::opt<bool> forceLoopToExecuteOnce(
62+
"always-execute-loop-body", llvm::cl::init(false),
63+
llvm::cl::desc("force the body of a loop to execute at least once"));
64+
6165
namespace {
6266
/// Information for generating a structured or unstructured increment loop.
6367
struct IncrementLoopInfo {
@@ -1012,7 +1016,7 @@ class FirConverter : public Fortran::lower::AbstractConverter {
10121016
tripCount =
10131017
builder->create<mlir::SignedDivIOp>(loc, diff2, info.stepValue);
10141018
}
1015-
if (fir::isAlwaysExecuteLoopBody()) { // minimum tripCount is 1
1019+
if (forceLoopToExecuteOnce) { // minimum tripCount is 1
10161020
auto one = builder->createIntegerConstant(loc, controlType, 1);
10171021
auto cond = builder->create<mlir::CmpIOp>(loc, CmpIPredicate::slt,
10181022
tripCount, one);

flang/lib/Optimizer/Transforms/RewriteLoop.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,6 @@
1616
#include "mlir/Transforms/DialectConversion.h"
1717
#include "llvm/Support/CommandLine.h"
1818

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-
3119
using namespace fir;
3220

3321
namespace {
@@ -40,7 +28,11 @@ namespace {
4028
/// Convert `fir.do_loop` to CFG
4129
class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
4230
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) {}
4436

4537
mlir::LogicalResult
4638
matchAndRewrite(DoLoopOp loop,
@@ -133,13 +125,19 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
133125
rewriter.replaceOp(loop, args.drop_back());
134126
return success();
135127
}
128+
129+
private:
130+
bool forceLoopToExecuteOnce;
136131
};
137132

138133
/// Convert `fir.if` to control-flow
139134
class CfgIfConv : public mlir::OpRewritePattern<fir::IfOp> {
140135
public:
141136
using OpRewritePattern::OpRewritePattern;
142137

138+
CfgIfConv(mlir::MLIRContext *ctx, bool forceLoopToExecuteOnce)
139+
: mlir::OpRewritePattern<fir::IfOp>(ctx) {}
140+
143141
mlir::LogicalResult
144142
matchAndRewrite(IfOp ifOp, mlir::PatternRewriter &rewriter) const override {
145143
auto loc = ifOp.getLoc();
@@ -200,6 +198,9 @@ class CfgIterWhileConv : public mlir::OpRewritePattern<fir::IterWhileOp> {
200198
public:
201199
using OpRewritePattern::OpRewritePattern;
202200

201+
CfgIterWhileConv(mlir::MLIRContext *ctx, bool forceLoopToExecuteOnce)
202+
: mlir::OpRewritePattern<fir::IterWhileOp>(ctx) {}
203+
203204
mlir::LogicalResult
204205
matchAndRewrite(fir::IterWhileOp whileOp,
205206
mlir::PatternRewriter &rewriter) const override {
@@ -292,12 +293,10 @@ class CfgIterWhileConv : public mlir::OpRewritePattern<fir::IterWhileOp> {
292293
class CfgConversion : public CFGConversionBase<CfgConversion> {
293294
public:
294295
void runOnFunction() override {
295-
if (disableCfgConversion)
296-
return;
297-
298296
auto *context = &getContext();
299297
mlir::OwningRewritePatternList patterns(context);
300-
patterns.insert<CfgLoopConv, CfgIfConv, CfgIterWhileConv>(context);
298+
patterns.insert<CfgLoopConv, CfgIfConv, CfgIterWhileConv>(
299+
context, forceLoopToExecuteOnce);
301300
mlir::ConversionTarget target(*context);
302301
target.addLegalDialect<mlir::AffineDialect, FIROpsDialect,
303302
mlir::StandardOpsDialect>();
@@ -315,7 +314,6 @@ class CfgConversion : public CFGConversionBase<CfgConversion> {
315314
};
316315
} // namespace
317316

318-
bool fir::isAlwaysExecuteLoopBody() { return forceLoopToExecuteOnce; }
319317
/// Convert FIR's structured control flow ops to CFG ops. This
320318
/// conversion enables the `createLowerToCFGPass` to transform these to CFG
321319
/// form.

0 commit comments

Comments
 (0)