diff --git a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp --- a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp +++ b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp @@ -266,6 +266,18 @@ } }; +class DeclareOpConversion : public mlir::OpRewritePattern { +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 { public: void runOn(mlir::Operation *op, mlir::Region ®ion) { @@ -276,6 +288,7 @@ fir::FIRCodeGenDialect, mlir::func::FuncDialect>(); target.addIllegalOp(); target.addIllegalOp(); + target.addIllegalOp(); target.addDynamicallyLegalOp([](fir::EmboxOp embox) { return !(embox.getShape() || embox.getType() .cast() @@ -283,8 +296,8 @@ .isa()); }); mlir::RewritePatternSet patterns(&context); - patterns.insert( - &context); + patterns.insert(&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 --- /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>) { + %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.shapeshift<2>) -> !fir.ref> + fir.call @bar(%1) : (!fir.ref>) -> () + return +} +func.func private @bar(%arg0: !fir.ref>) + + +// CHECK-LABEL: func.func @test( +// CHECK-SAME: %[[arg0:.*]]: !fir.ref>) { +// CHECK-NEXT: fir.call @bar(%[[arg0]]) : (!fir.ref>) -> ()