diff --git a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp index d09d7d397e8b7..c1e127260be82 100644 --- a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp +++ b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp @@ -299,11 +299,17 @@ class DeclareOpConversion : public mlir::OpRewritePattern { else return mlir::failure(); } - // FIXME: Add FortranAttrs and CudaAttrs + auto xDeclOp = rewriter.create( loc, declareOp.getType(), declareOp.getMemref(), shapeOpers, shiftOpers, declareOp.getTypeparams(), declareOp.getDummyScope(), declareOp.getUniqName()); + + // Propagate all attributes to fircg.ext_declare to avoid losing metadata + // including CUDA and OpenACC attributes. + for (const mlir::NamedAttribute &attr : declareOp->getAttrs()) + xDeclOp->setAttr(attr.getName(), attr.getValue()); + LLVM_DEBUG(llvm::dbgs() << "rewriting " << declareOp << " to " << xDeclOp << '\n'); rewriter.replaceOp(declareOp, xDeclOp.getOperation()->getResults()); diff --git a/flang/test/Fir/declare-codegen.fir b/flang/test/Fir/declare-codegen.fir index fe8d84ef2d19f..cf4f28eda1cb4 100644 --- a/flang/test/Fir/declare-codegen.fir +++ b/flang/test/Fir/declare-codegen.fir @@ -23,7 +23,7 @@ func.func private @bar(%arg0: !fir.ref>) // DECL-LABEL: func.func @test( // DECL-SAME: %[[arg0:.*]]: !fir.ref>) { -// DECL: fircg.ext_declare +// DECL: fircg.ext_declare{{.*}}{uniq_name = "_QFarray_numeric_lboundsEx"} func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref>) { @@ -37,7 +37,7 @@ func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref>) { @@ -51,4 +51,15 @@ func.func @unreachable_code(%arg0: !fir.ref>) { // NODECL-LABEL: func.func @unreachable_code( // NODECL-NOT: uniq_name = "live_code" // DECL-LABEL: func.func @unreachable_code( -// DECL: uniq_name = "live_code" +// DECL: fircg.ext_declare{{.*}}{uniq_name = "live_code"} +// DECL: fir.declare{{.*}}{uniq_name = "dead_code"} + + +// Test that attributes get attached to the memref operation when fir.declare is not preserved +func.func @test_local_memref() { + %0 = fir.alloca !fir.array<10xi32> {uniq_name = "local_array"} + %1 = fir.declare %0 {uniq_name = "local_array_declare", acc.declare = #acc.declare} : (!fir.ref>) -> !fir.ref> + return +} +// DECL-LABEL: func.func @test_local_memref() { +// DECL: fircg.ext_declare{{.*}}{acc.declare = #acc.declare, uniq_name = "local_array_declare"}