Skip to content

Commit 2c566dd

Browse files
committed
[flang] Add preserveDeclare option to cg-rewrite pass.
When this option is true, DeclareOp is converted to XDeclareOp and this OP is used later for debug info generation. When it is false, DeclareOp is removed.
1 parent 0fb133d commit 2c566dd

File tree

7 files changed

+56
-22
lines changed

7 files changed

+56
-22
lines changed

flang/include/flang/Optimizer/CodeGen/CGPasses.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ def CodeGenRewrite : Pass<"cg-rewrite", "mlir::ModuleOp"> {
4747
let dependentDialects = [
4848
"fir::FIROpsDialect", "fir::FIRCodeGenDialect"
4949
];
50+
let options = [
51+
Option<"preserveDeclare", "preserve-declare", "bool", /*default=*/"false",
52+
"Preserve DeclareOp during pre codegen re-write.">
53+
];
5054
let statistics = [
5155
Statistic<"numDCE", "num-dce'd", "Number of operations eliminated">
5256
];

flang/include/flang/Optimizer/CodeGen/CodeGen.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ struct NameUniquer;
3030

3131
/// Prerequiste pass for code gen. Perform intermediate rewrites to perform
3232
/// the code gen (to LLVM-IR dialect) conversion.
33-
std::unique_ptr<mlir::Pass> createFirCodeGenRewritePass();
33+
std::unique_ptr<mlir::Pass> createFirCodeGenRewritePass(
34+
CodeGenRewriteOptions Options = CodeGenRewriteOptions{});
3435

3536
/// FirTargetRewritePass options.
3637
struct TargetRewriteOptions {
@@ -88,7 +89,8 @@ void populateFIRToLLVMConversionPatterns(fir::LLVMTypeConverter &converter,
8889
fir::FIRToLLVMPassOptions &options);
8990

9091
/// Populate the pattern set with the PreCGRewrite patterns.
91-
void populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns);
92+
void populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns,
93+
bool preserveDeclare);
9294

9395
// declarative passes
9496
#define GEN_PASS_REGISTRATION

flang/include/flang/Tools/CLOptions.inc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,11 @@ inline void addMemoryAllocationOpt(mlir::PassManager &pm) {
169169
}
170170

171171
#if !defined(FLANG_EXCLUDE_CODEGEN)
172-
inline void addCodeGenRewritePass(mlir::PassManager &pm) {
173-
addPassConditionally(
174-
pm, disableCodeGenRewrite, fir::createFirCodeGenRewritePass);
172+
inline void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare) {
173+
fir::CodeGenRewriteOptions options;
174+
options.preserveDeclare = preserveDeclare;
175+
addPassConditionally(pm, disableCodeGenRewrite,
176+
[&]() { return fir::createFirCodeGenRewritePass(options); });
175177
}
176178

177179
inline void addTargetRewritePass(mlir::PassManager &pm) {
@@ -337,7 +339,8 @@ inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
337339
MLIRToLLVMPassPipelineConfig config, llvm::StringRef inputFilename = {}) {
338340
fir::addBoxedProcedurePass(pm);
339341
addNestedPassToAllTopLevelOperations(pm, fir::createAbstractResultOpt);
340-
fir::addCodeGenRewritePass(pm);
342+
fir::addCodeGenRewritePass(
343+
pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo));
341344
fir::addTargetRewritePass(pm);
342345
fir::addExternalNameConversionPass(pm, config.Underscoring);
343346
fir::createDebugPasses(pm, config.DebugInfo, config.OptLevel, inputFilename);

flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,12 +270,20 @@ class ArrayCoorConversion : public mlir::OpRewritePattern<fir::ArrayCoorOp> {
270270
};
271271

272272
class DeclareOpConversion : public mlir::OpRewritePattern<fir::DeclareOp> {
273+
bool preserveDeclare;
274+
273275
public:
274276
using OpRewritePattern::OpRewritePattern;
277+
DeclareOpConversion(mlir::MLIRContext *ctx, bool preserveDecl)
278+
: OpRewritePattern(ctx), preserveDeclare(preserveDecl) {}
275279

276280
mlir::LogicalResult
277281
matchAndRewrite(fir::DeclareOp declareOp,
278282
mlir::PatternRewriter &rewriter) const override {
283+
if (!preserveDeclare) {
284+
rewriter.replaceOp(declareOp, declareOp.getMemref());
285+
return mlir::success();
286+
}
279287
auto loc = declareOp.getLoc();
280288
llvm::SmallVector<mlir::Value> shapeOpers;
281289
llvm::SmallVector<mlir::Value> shiftOpers;
@@ -319,6 +327,7 @@ class DummyScopeOpConversion
319327

320328
class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
321329
public:
330+
CodeGenRewrite(fir::CodeGenRewriteOptions opts) : Base(opts) {}
322331
void runOnOperation() override final {
323332
mlir::ModuleOp mod = getOperation();
324333

@@ -336,7 +345,7 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
336345
mlir::cast<fir::BaseBoxType>(embox.getType()).getEleTy()));
337346
});
338347
mlir::RewritePatternSet patterns(&context);
339-
fir::populatePreCGRewritePatterns(patterns);
348+
fir::populatePreCGRewritePatterns(patterns, preserveDeclare);
340349
if (mlir::failed(
341350
mlir::applyPartialConversion(mod, target, std::move(patterns)))) {
342351
mlir::emitError(mlir::UnknownLoc::get(&context),
@@ -352,12 +361,14 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
352361

353362
} // namespace
354363

355-
std::unique_ptr<mlir::Pass> fir::createFirCodeGenRewritePass() {
356-
return std::make_unique<CodeGenRewrite>();
364+
std::unique_ptr<mlir::Pass>
365+
fir::createFirCodeGenRewritePass(fir::CodeGenRewriteOptions Options) {
366+
return std::make_unique<CodeGenRewrite>(Options);
357367
}
358368

359-
void fir::populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns) {
369+
void fir::populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns,
370+
bool preserveDeclare) {
360371
patterns.insert<EmboxConversion, ArrayCoorConversion, ReboxConversion,
361-
DeclareOpConversion, DummyScopeOpConversion>(
362-
patterns.getContext());
372+
DummyScopeOpConversion>(patterns.getContext());
373+
patterns.add<DeclareOpConversion>(patterns.getContext(), preserveDeclare);
363374
}

flang/test/Fir/declare-codegen.fir

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// Test rewrite of fir.declare. The result is replaced by the memref operand.
2-
// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s
2+
// RUN: fir-opt --cg-rewrite="preserve-declare=true" %s -o - | FileCheck %s --check-prefixes DECL
3+
// RUN: fir-opt --cg-rewrite="preserve-declare=false" %s -o - | FileCheck %s --check-prefixes NODECL
4+
// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s --check-prefixes NODECL
35

46

57
func.func @test(%arg0: !fir.ref<!fir.array<12x23xi32>>) {
@@ -15,9 +17,13 @@ func.func @test(%arg0: !fir.ref<!fir.array<12x23xi32>>) {
1517
func.func private @bar(%arg0: !fir.ref<!fir.array<12x23xi32>>)
1618

1719

18-
// CHECK-LABEL: func.func @test(
19-
// CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<12x23xi32>>) {
20-
// CHECK: fircg.ext_declare
20+
// NODECL-LABEL: func.func @test(
21+
// NODECL-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<12x23xi32>>) {
22+
// NODECL-NEXT: fir.call @bar(%[[arg0]]) : (!fir.ref<!fir.array<12x23xi32>>) -> ()
23+
24+
// DECL-LABEL: func.func @test(
25+
// DECL-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<12x23xi32>>) {
26+
// DECL: fircg.ext_declare
2127

2228

2329
func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref<!fir.array<3x3xf32>>) {
@@ -27,5 +33,8 @@ func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref<!fir.arra
2733
return
2834
}
2935

30-
// CHECK-LABEL: func.func @useless_shape_with_duplicate_extent_operand(
31-
// CHECK: fircg.ext_declare
36+
// NODECL-LABEL: func.func @useless_shape_with_duplicate_extent_operand(
37+
// NODECL-NEXT: return
38+
39+
// DECL-LABEL: func.func @useless_shape_with_duplicate_extent_operand(
40+
// DECL: fircg.ext_declare
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s
1+
// RUN: fir-opt --cg-rewrite="preserve-declare=true" %s -o - | FileCheck %s --check-prefixes DECL
2+
// RUN: fir-opt --cg-rewrite="preserve-declare=false" %s -o - | FileCheck %s --check-prefixes NODECL
3+
// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s --check-prefixes NODECL
24

35
func.func @dummy_scope(%arg0: !fir.ref<f32>) {
46
%scope = fir.dummy_scope : !fir.dscope
57
%0 = fir.declare %arg0 dummy_scope %scope {uniq_name = "x"} : (!fir.ref<f32>, !fir.dscope) -> !fir.ref<f32>
68
return
79
}
8-
// CHECK-LABEL: func.func @dummy_scope(
9-
// CHECK: fircg.ext_declare
10+
// DECL-LABEL: func.func @dummy_scope(
11+
// DECL: fircg.ext_declare
12+
13+
// NODECL-LABEL: func.func @dummy_scope(
14+
// NODECL-NEXT: return

flang/test/Transforms/debug-local-var.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
! RUN: %flang_fc1 -emit-fir -debug-info-kind=standalone -mmlir --mlir-print-debuginfo %s -o - | \
2-
! RUN: fir-opt --cg-rewrite --mlir-print-debuginfo | fir-opt --add-debug-info --mlir-print-debuginfo | FileCheck %s
2+
! RUN: fir-opt --cg-rewrite="preserve-declare=true" --mlir-print-debuginfo | fir-opt --add-debug-info --mlir-print-debuginfo | FileCheck %s
33

44
! CHECK-DAG: #[[INT8:.*]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "integer", sizeInBits = 64, encoding = DW_ATE_signed>
55
! CHECK-DAG: #[[INT4:.*]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "integer", sizeInBits = 32, encoding = DW_ATE_signed>

0 commit comments

Comments
 (0)