[flang-commits] [flang] c852174 - [flang] add fir.declare codegen support

Jean Perier via flang-commits flang-commits at lists.llvm.org
Thu Oct 20 01:18:05 PDT 2022


Author: Jean Perier
Date: 2022-10-20T10:17:14+02:00
New Revision: c852174a4935debc6d724dd057c4955678e12117

URL: https://github.com/llvm/llvm-project/commit/c852174a4935debc6d724dd057c4955678e12117
DIFF: https://github.com/llvm/llvm-project/commit/c852174a4935debc6d724dd057c4955678e12117.diff

LOG: [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

Added: 
    flang/test/Fir/declare-codegen.fir

Modified: 
    flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp
index c134ff911ce81..8862a328722a8 100644
--- a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp
+++ b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp
@@ -266,6 +266,18 @@ class ArrayCoorConversion : public mlir::OpRewritePattern<fir::ArrayCoorOp> {
   }
 };
 
+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 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
                            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 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase<CodeGenRewrite> {
                                        .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
index 0000000000000..1b0bea88e9cff
--- /dev/null
+++ b/flang/test/Fir/declare-codegen.fir
@@ -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>>) -> ()


        


More information about the flang-commits mailing list