[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 ®ion) {
@@ -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