[flang] add fir.declare codegen support
authorJean Perier <jperier@nvidia.com>
Thu, 20 Oct 2022 08:15:14 +0000 (10:15 +0200)
committerJean Perier <jperier@nvidia.com>
Thu, 20 Oct 2022 08:17:14 +0000 (10:17 +0200)
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

flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp
flang/test/Fir/declare-codegen.fir [new file with mode: 0644]

index c134ff9..8862a32 100644 (file)
@@ -266,6 +266,18 @@ public:
   }
 };
 
+class DeclareOpConversion : public mlir::OpRewritePattern<fir::DeclareOp> {
+public:
+  using OpRewritePattern::OpRewritePattern;
+
+  mlir::LogicalResult
+  matchAndRewrite(fir::DeclareOp declareOp,
+                  mlir::PatternRewriter &rewriter) const override {
+    rewriter.replaceOp(declareOp, declareOp.getMemref());
+    return mlir::success();
+  }
+};
+
 class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
 public:
   void runOn(mlir::Operation *op, mlir::Region &region) {
@@ -276,6 +288,7 @@ public:
                            fir::FIRCodeGenDialect, mlir::func::FuncDialect>();
     target.addIllegalOp<fir::ArrayCoorOp>();
     target.addIllegalOp<fir::ReboxOp>();
+    target.addIllegalOp<fir::DeclareOp>();
     target.addDynamicallyLegalOp<fir::EmboxOp>([](fir::EmboxOp embox) {
       return !(embox.getShape() || embox.getType()
                                        .cast<fir::BaseBoxType>()
@@ -283,8 +296,8 @@ public:
                                        .isa<fir::SequenceType>());
     });
     mlir::RewritePatternSet patterns(&context);
-    patterns.insert<EmboxConversion, ArrayCoorConversion, ReboxConversion>(
-        &context);
+    patterns.insert<EmboxConversion, ArrayCoorConversion, ReboxConversion,
+                    DeclareOpConversion>(&context);
     if (mlir::failed(
             mlir::applyPartialConversion(op, target, std::move(patterns)))) {
       mlir::emitError(mlir::UnknownLoc::get(&context),
diff --git a/flang/test/Fir/declare-codegen.fir b/flang/test/Fir/declare-codegen.fir
new file mode 100644 (file)
index 0000000..1b0bea8
--- /dev/null
@@ -0,0 +1,20 @@
+// Test rewrite of fir.declare. The result is replaced by the memref operand.
+// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s
+
+
+func.func @test(%arg0: !fir.ref<!fir.array<12x23xi32>>) {
+  %c-1 = arith.constant -1 : index
+  %c12 = arith.constant 12 : index
+  %c-2 = arith.constant -2 : index
+  %c23 = arith.constant 23 : index
+  %0 = fir.shape_shift %c12, %c-1, %c23, %c-2 : (index, index, index, index) -> !fir.shapeshift<2>
+  %1 = fir.declare %arg0(%0) {uniq_name = "_QFarray_numeric_lboundsEx"} : (!fir.ref<!fir.array<12x23xi32>>, !fir.shapeshift<2>) -> !fir.ref<!fir.array<12x23xi32>>
+  fir.call @bar(%1) : (!fir.ref<!fir.array<12x23xi32>>) -> ()
+  return
+}
+func.func private @bar(%arg0: !fir.ref<!fir.array<12x23xi32>>)
+
+
+// CHECK-LABEL: func.func @test(
+// CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<12x23xi32>>) {
+// CHECK-NEXT: fir.call @bar(%[[arg0]]) : (!fir.ref<!fir.array<12x23xi32>>) -> ()