Skip to content

Commit c852174

Browse files
committed
[flang] add fir.declare codegen support
For now, nothing is done about debug info and the fir.declare is simply replaced by the memref argument. This is done in the PreCGRewrite in order to avoid requiring adding support for fir.shape codegen, which would still be useless and undesired at that point. Differential Revision: https://reviews.llvm.org/D136254
1 parent ab2b84d commit c852174

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,18 @@ class ArrayCoorConversion : public mlir::OpRewritePattern<fir::ArrayCoorOp> {
266266
}
267267
};
268268

269+
class DeclareOpConversion : public mlir::OpRewritePattern<fir::DeclareOp> {
270+
public:
271+
using OpRewritePattern::OpRewritePattern;
272+
273+
mlir::LogicalResult
274+
matchAndRewrite(fir::DeclareOp declareOp,
275+
mlir::PatternRewriter &rewriter) const override {
276+
rewriter.replaceOp(declareOp, declareOp.getMemref());
277+
return mlir::success();
278+
}
279+
};
280+
269281
class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
270282
public:
271283
void runOn(mlir::Operation *op, mlir::Region &region) {
@@ -276,15 +288,16 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
276288
fir::FIRCodeGenDialect, mlir::func::FuncDialect>();
277289
target.addIllegalOp<fir::ArrayCoorOp>();
278290
target.addIllegalOp<fir::ReboxOp>();
291+
target.addIllegalOp<fir::DeclareOp>();
279292
target.addDynamicallyLegalOp<fir::EmboxOp>([](fir::EmboxOp embox) {
280293
return !(embox.getShape() || embox.getType()
281294
.cast<fir::BaseBoxType>()
282295
.getEleTy()
283296
.isa<fir::SequenceType>());
284297
});
285298
mlir::RewritePatternSet patterns(&context);
286-
patterns.insert<EmboxConversion, ArrayCoorConversion, ReboxConversion>(
287-
&context);
299+
patterns.insert<EmboxConversion, ArrayCoorConversion, ReboxConversion,
300+
DeclareOpConversion>(&context);
288301
if (mlir::failed(
289302
mlir::applyPartialConversion(op, target, std::move(patterns)))) {
290303
mlir::emitError(mlir::UnknownLoc::get(&context),

flang/test/Fir/declare-codegen.fir

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Test rewrite of fir.declare. The result is replaced by the memref operand.
2+
// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s
3+
4+
5+
func.func @test(%arg0: !fir.ref<!fir.array<12x23xi32>>) {
6+
%c-1 = arith.constant -1 : index
7+
%c12 = arith.constant 12 : index
8+
%c-2 = arith.constant -2 : index
9+
%c23 = arith.constant 23 : index
10+
%0 = fir.shape_shift %c12, %c-1, %c23, %c-2 : (index, index, index, index) -> !fir.shapeshift<2>
11+
%1 = fir.declare %arg0(%0) {uniq_name = "_QFarray_numeric_lboundsEx"} : (!fir.ref<!fir.array<12x23xi32>>, !fir.shapeshift<2>) -> !fir.ref<!fir.array<12x23xi32>>
12+
fir.call @bar(%1) : (!fir.ref<!fir.array<12x23xi32>>) -> ()
13+
return
14+
}
15+
func.func private @bar(%arg0: !fir.ref<!fir.array<12x23xi32>>)
16+
17+
18+
// CHECK-LABEL: func.func @test(
19+
// CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<12x23xi32>>) {
20+
// CHECK-NEXT: fir.call @bar(%[[arg0]]) : (!fir.ref<!fir.array<12x23xi32>>) -> ()

0 commit comments

Comments
 (0)