[flang-commits] [flang] [flang][openacc] Support variable in equivalence in declare directive (PR #71242)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Mon Nov 6 09:28:34 PST 2023
https://github.com/clementval updated https://github.com/llvm/llvm-project/pull/71242
>From 849183e094741f645cf16b4bc3a33673c4864d71 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Fri, 3 Nov 2023 15:21:52 -0700
Subject: [PATCH 1/2] [flang][openacc] Support variable in equivalence in
declare directive
---
flang/lib/Lower/OpenACC.cpp | 86 ++++++++++++++-----
.../test/Lower/OpenACC/HLFIR/acc-declare.f90 | 58 +++++++++++++
2 files changed, 122 insertions(+), 22 deletions(-)
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 809fd3b3be7cfdf..7808e94ed7c7346 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -27,6 +27,7 @@
#include "flang/Optimizer/Builder/Todo.h"
#include "flang/Parser/parse-tree.h"
#include "flang/Semantics/expression.h"
+#include "flang/Semantics/scope.h"
#include "flang/Semantics/tools.h"
#include "llvm/Frontend/OpenACC/ACC.h.inc"
@@ -2740,33 +2741,40 @@ static void genACC(Fortran::lower::AbstractConverter &converter,
template <typename GlobalOp, typename EntryOp, typename DeclareOp,
typename ExitOp>
-static void createDeclareGlobalOp(mlir::OpBuilder &modBuilder,
- fir::FirOpBuilder &builder,
- mlir::Location loc, fir::GlobalOp &globalOp,
- mlir::acc::DataClause clause, bool implicit) {
- std::stringstream declareGlobalName;
-
- if constexpr (std::is_same_v<GlobalOp, mlir::acc::GlobalConstructorOp>)
- declareGlobalName << globalOp.getSymName().str() << "_acc_ctor";
- else if constexpr (std::is_same_v<GlobalOp, mlir::acc::GlobalDestructorOp>)
- declareGlobalName << globalOp.getSymName().str() << "_acc_dtor";
-
+static void
+createDeclareGlobalOp(mlir::OpBuilder &modBuilder, fir::FirOpBuilder &builder,
+ mlir::Location loc, fir::GlobalOp globalOp,
+ mlir::acc::DataClause clause,
+ const std::string declareGlobalName, bool implicit,
+ std::optional<std::size_t> &offset, mlir::Type aliasType,
+ std::stringstream &asFortran) {
GlobalOp declareGlobalOp =
- modBuilder.create<GlobalOp>(loc, declareGlobalName.str());
+ modBuilder.create<GlobalOp>(loc, declareGlobalName);
builder.createBlock(&declareGlobalOp.getRegion(),
declareGlobalOp.getRegion().end(), {}, {});
builder.setInsertionPointToEnd(&declareGlobalOp.getRegion().back());
+ mlir::Value entryAddr;
fir::AddrOfOp addrOp = builder.create<fir::AddrOfOp>(
loc, fir::ReferenceType::get(globalOp.getType()), globalOp.getSymbol());
- addDeclareAttr(builder, addrOp.getOperation(), clause);
+ entryAddr = addrOp.getResTy();
+ // If the variable in the declare clause is part of an equivalence it has an
+ // offset.
+ if (offset) {
+ mlir::Type i8Ptr = builder.getRefType(builder.getI8Type());
+ mlir::Value off =
+ builder.createIntegerConstant(loc, builder.getIndexType(), *offset);
+ mlir::Value aliasAddr = builder.create<fir::CoordinateOp>(
+ loc, i8Ptr, addrOp.getResTy(), mlir::ValueRange{off});
+ entryAddr =
+ builder.createConvert(loc, fir::PointerType::get(aliasType), aliasAddr);
+ }
+ addDeclareAttr(builder, entryAddr.getDefiningOp(), clause);
- std::stringstream asFortran;
- asFortran << Fortran::lower::mangle::demangleName(globalOp.getSymName());
llvm::SmallVector<mlir::Value> bounds;
EntryOp entryOp = createDataEntryOp<EntryOp>(
- builder, loc, addrOp.getResTy(), asFortran, bounds,
- /*structured=*/false, implicit, clause, addrOp.getResTy().getType());
+ builder, loc, entryAddr, asFortran, bounds,
+ /*structured=*/false, implicit, clause, entryAddr.getType());
builder.create<DeclareOp>(loc, mlir::ValueRange(entryOp.getAccPtr()));
mlir::Value varPtr;
if constexpr (std::is_same_v<GlobalOp, mlir::acc::GlobalDestructorOp>) {
@@ -2904,8 +2912,39 @@ static void genGlobalCtors(Fortran::lower::AbstractConverter &converter,
designator)) {
std::string globalName = converter.mangleName(*name->symbol);
fir::GlobalOp globalOp = builder.getNamedGlobal(globalName);
- if (!globalOp)
- llvm::report_fatal_error("could not retrieve global symbol");
+ std::stringstream declareGlobalCtorName;
+ declareGlobalCtorName << globalName << "_acc_ctor";
+ std::stringstream declareGlobalDtorName;
+ declareGlobalDtorName << globalName << "_acc_dtor";
+ std::optional<std::size_t> offset = std::nullopt;
+ mlir::Type aliasType;
+
+ std::stringstream asFortran;
+ asFortran << name->symbol->name().ToString();
+
+ if (!globalOp) {
+ if (Fortran::semantics::FindEquivalenceSet(*name->symbol)) {
+ for (Fortran::semantics::EquivalenceObject eqObj :
+ *Fortran::semantics::FindEquivalenceSet(
+ *name->symbol)) {
+ std::string eqName = converter.mangleName(eqObj.symbol);
+ globalOp = builder.getNamedGlobal(eqName);
+ if (globalOp)
+ break;
+ }
+
+ if (!globalOp)
+ llvm::report_fatal_error(
+ "could not retrieve global symbol");
+
+ offset = name->symbol->GetUltimate().offset();
+ aliasType = converter.genType(name->symbol->GetUltimate());
+ } else {
+ llvm::report_fatal_error(
+ "could not retrieve global symbol");
+ }
+ }
+
addDeclareAttr(builder, globalOp.getOperation(), clause);
auto crtPos = builder.saveInsertionPoint();
modBuilder.setInsertionPointAfter(globalOp);
@@ -2915,7 +2954,8 @@ static void genGlobalCtors(Fortran::lower::AbstractConverter &converter,
mlir::acc::CopyinOp,
mlir::acc::DeclareEnterOp, ExitOp>(
modBuilder, builder, operandLocation, globalOp, clause,
- /*implicit=*/true);
+ declareGlobalCtorName.str(), /*implicit=*/true, offset,
+ aliasType, asFortran);
createDeclareAllocFunc<EntryOp>(
modBuilder, builder, operandLocation, globalOp, clause);
if constexpr (!std::is_same_v<EntryOp, ExitOp>)
@@ -2925,14 +2965,16 @@ static void genGlobalCtors(Fortran::lower::AbstractConverter &converter,
createDeclareGlobalOp<mlir::acc::GlobalConstructorOp, EntryOp,
mlir::acc::DeclareEnterOp, ExitOp>(
modBuilder, builder, operandLocation, globalOp, clause,
- /*implicit=*/false);
+ declareGlobalCtorName.str(), /*implicit=*/false, offset,
+ aliasType, asFortran);
}
if constexpr (!std::is_same_v<EntryOp, ExitOp>) {
createDeclareGlobalOp<mlir::acc::GlobalDestructorOp,
mlir::acc::GetDevicePtrOp,
mlir::acc::DeclareExitOp, ExitOp>(
modBuilder, builder, operandLocation, globalOp, clause,
- /*implicit=*/false);
+ declareGlobalDtorName.str(), /*implicit=*/false, offset,
+ aliasType, asFortran);
}
builder.restoreInsertionPoint(crtPos);
}
diff --git a/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90 b/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90
index 0a45967ce82ef3e..6cca57a2504e2b9 100644
--- a/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90
+++ b/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90
@@ -258,3 +258,61 @@ module acc_declare_allocatable_test
! ALL: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) {dataClause = #acc<data_clause acc_create>, name = "data1", structured = false}
! ALL: acc.terminator
! ALL: }
+
+
+module acc_declare_equivalent
+ integer, parameter :: n = 10
+ real :: v1(n)
+ real :: v2(n)
+ equivalence(v1(1), v2(1))
+ !$acc declare create(v2)
+end module
+
+! ALL-LABEL: acc.global_ctor @_QMacc_declare_equivalentEv2_acc_ctor {
+! ALL-DAG: %[[C0:.*]] = arith.constant 0 : index
+! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalentEv1) : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C0]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
+! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<10xf32>>
+! ALL: %[[CREATE:.*]] = acc.create varPtr(%[[CONV]] : !fir.ptr<!fir.array<10xf32>>) -> !fir.ptr<!fir.array<10xf32>> {name = "v2", structured = false}
+! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ptr<!fir.array<10xf32>>)
+! ALL: acc.terminator
+! ALL: }
+
+! ALL-LABEL: acc.global_dtor @_QMacc_declare_equivalentEv2_acc_dtor {
+! ALL-DAG: %[[C0:.*]] = arith.constant 0 : index
+! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalentEv1) : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C0]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
+! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<10xf32>>
+! ALL: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[CONV]] : !fir.ptr<!fir.array<10xf32>>) -> !fir.ptr<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ptr<!fir.array<10xf32>>)
+! ALL: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ptr<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: acc.terminator
+! ALL: }
+
+module acc_declare_equivalent2
+ real :: v1(10)
+ real :: v2(5)
+ equivalence(v1(6), v2(1))
+ !$acc declare create(v2)
+end module
+
+! ALL-LABEL: acc.global_ctor @_QMacc_declare_equivalent2Ev2_acc_ctor {
+! ALL-DAG: %[[C20:.*]] = arith.constant 20 : index
+! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalent2Ev1) : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C20]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
+! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<5xf32>>
+! ALL: %[[CREATE:.*]] = acc.create varPtr(%[[CONV]] : !fir.ptr<!fir.array<5xf32>>) -> !fir.ptr<!fir.array<5xf32>> {name = "v2", structured = false}
+! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ptr<!fir.array<5xf32>>)
+! ALL: acc.terminator
+! ALL: }
+
+! ALL-LABEL: acc.global_dtor @_QMacc_declare_equivalent2Ev2_acc_dtor {
+! ALL-DAG: %[[C20:.*]] = arith.constant 20 : index
+! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalent2Ev1) : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C20]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
+! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<5xf32>>
+! ALL: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[CONV]] : !fir.ptr<!fir.array<5xf32>>) -> !fir.ptr<!fir.array<5xf32>> {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ptr<!fir.array<5xf32>>)
+! ALL: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ptr<!fir.array<5xf32>>) {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: acc.terminator
+! ALL: }
>From 575fa003fd8563a7e49319e953ab87e67f8c55bc Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Mon, 6 Nov 2023 09:28:16 -0800
Subject: [PATCH 2/2] Use the equivalence address
---
flang/lib/Lower/OpenACC.cpp | 37 ++++-----------
.../test/Lower/OpenACC/HLFIR/acc-declare.f90 | 46 +++++++------------
2 files changed, 26 insertions(+), 57 deletions(-)
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 7808e94ed7c7346..080db63976eb977 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -2746,7 +2746,6 @@ createDeclareGlobalOp(mlir::OpBuilder &modBuilder, fir::FirOpBuilder &builder,
mlir::Location loc, fir::GlobalOp globalOp,
mlir::acc::DataClause clause,
const std::string declareGlobalName, bool implicit,
- std::optional<std::size_t> &offset, mlir::Type aliasType,
std::stringstream &asFortran) {
GlobalOp declareGlobalOp =
modBuilder.create<GlobalOp>(loc, declareGlobalName);
@@ -2757,24 +2756,12 @@ createDeclareGlobalOp(mlir::OpBuilder &modBuilder, fir::FirOpBuilder &builder,
fir::AddrOfOp addrOp = builder.create<fir::AddrOfOp>(
loc, fir::ReferenceType::get(globalOp.getType()), globalOp.getSymbol());
- entryAddr = addrOp.getResTy();
- // If the variable in the declare clause is part of an equivalence it has an
- // offset.
- if (offset) {
- mlir::Type i8Ptr = builder.getRefType(builder.getI8Type());
- mlir::Value off =
- builder.createIntegerConstant(loc, builder.getIndexType(), *offset);
- mlir::Value aliasAddr = builder.create<fir::CoordinateOp>(
- loc, i8Ptr, addrOp.getResTy(), mlir::ValueRange{off});
- entryAddr =
- builder.createConvert(loc, fir::PointerType::get(aliasType), aliasAddr);
- }
- addDeclareAttr(builder, entryAddr.getDefiningOp(), clause);
+ addDeclareAttr(builder, addrOp, clause);
llvm::SmallVector<mlir::Value> bounds;
EntryOp entryOp = createDataEntryOp<EntryOp>(
- builder, loc, entryAddr, asFortran, bounds,
- /*structured=*/false, implicit, clause, entryAddr.getType());
+ builder, loc, addrOp.getResTy(), asFortran, bounds,
+ /*structured=*/false, implicit, clause, addrOp.getResTy().getType());
builder.create<DeclareOp>(loc, mlir::ValueRange(entryOp.getAccPtr()));
mlir::Value varPtr;
if constexpr (std::is_same_v<GlobalOp, mlir::acc::GlobalDestructorOp>) {
@@ -2916,9 +2903,6 @@ static void genGlobalCtors(Fortran::lower::AbstractConverter &converter,
declareGlobalCtorName << globalName << "_acc_ctor";
std::stringstream declareGlobalDtorName;
declareGlobalDtorName << globalName << "_acc_dtor";
- std::optional<std::size_t> offset = std::nullopt;
- mlir::Type aliasType;
-
std::stringstream asFortran;
asFortran << name->symbol->name().ToString();
@@ -2936,9 +2920,6 @@ static void genGlobalCtors(Fortran::lower::AbstractConverter &converter,
if (!globalOp)
llvm::report_fatal_error(
"could not retrieve global symbol");
-
- offset = name->symbol->GetUltimate().offset();
- aliasType = converter.genType(name->symbol->GetUltimate());
} else {
llvm::report_fatal_error(
"could not retrieve global symbol");
@@ -2954,8 +2935,8 @@ static void genGlobalCtors(Fortran::lower::AbstractConverter &converter,
mlir::acc::CopyinOp,
mlir::acc::DeclareEnterOp, ExitOp>(
modBuilder, builder, operandLocation, globalOp, clause,
- declareGlobalCtorName.str(), /*implicit=*/true, offset,
- aliasType, asFortran);
+ declareGlobalCtorName.str(), /*implicit=*/true,
+ asFortran);
createDeclareAllocFunc<EntryOp>(
modBuilder, builder, operandLocation, globalOp, clause);
if constexpr (!std::is_same_v<EntryOp, ExitOp>)
@@ -2965,16 +2946,16 @@ static void genGlobalCtors(Fortran::lower::AbstractConverter &converter,
createDeclareGlobalOp<mlir::acc::GlobalConstructorOp, EntryOp,
mlir::acc::DeclareEnterOp, ExitOp>(
modBuilder, builder, operandLocation, globalOp, clause,
- declareGlobalCtorName.str(), /*implicit=*/false, offset,
- aliasType, asFortran);
+ declareGlobalCtorName.str(), /*implicit=*/false,
+ asFortran);
}
if constexpr (!std::is_same_v<EntryOp, ExitOp>) {
createDeclareGlobalOp<mlir::acc::GlobalDestructorOp,
mlir::acc::GetDevicePtrOp,
mlir::acc::DeclareExitOp, ExitOp>(
modBuilder, builder, operandLocation, globalOp, clause,
- declareGlobalDtorName.str(), /*implicit=*/false, offset,
- aliasType, asFortran);
+ declareGlobalDtorName.str(), /*implicit=*/false,
+ asFortran);
}
builder.restoreInsertionPoint(crtPos);
}
diff --git a/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90 b/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90
index 6cca57a2504e2b9..6ebdd39802fef0f 100644
--- a/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90
+++ b/flang/test/Lower/OpenACC/HLFIR/acc-declare.f90
@@ -269,25 +269,19 @@ module acc_declare_equivalent
end module
! ALL-LABEL: acc.global_ctor @_QMacc_declare_equivalentEv2_acc_ctor {
-! ALL-DAG: %[[C0:.*]] = arith.constant 0 : index
-! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalentEv1) : !fir.ref<!fir.array<40xi8>>
-! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C0]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
-! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<10xf32>>
-! ALL: %[[CREATE:.*]] = acc.create varPtr(%[[CONV]] : !fir.ptr<!fir.array<10xf32>>) -> !fir.ptr<!fir.array<10xf32>> {name = "v2", structured = false}
-! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ptr<!fir.array<10xf32>>)
+! ALL: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalentEv1) {acc.declare = #acc.declare<dataClause = acc_create>} : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[CREATE:.*]] = acc.create varPtr(%[[ADDR]] : !fir.ref<!fir.array<40xi8>>) -> !fir.ref<!fir.array<40xi8>> {name = "v2", structured = false}
+! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<40xi8>>)
! ALL: acc.terminator
! ALL: }
-! ALL-LABEL: acc.global_dtor @_QMacc_declare_equivalentEv2_acc_dtor {
-! ALL-DAG: %[[C0:.*]] = arith.constant 0 : index
-! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalentEv1) : !fir.ref<!fir.array<40xi8>>
-! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C0]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
-! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<10xf32>>
-! ALL: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[CONV]] : !fir.ptr<!fir.array<10xf32>>) -> !fir.ptr<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
-! ALL: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ptr<!fir.array<10xf32>>)
-! ALL: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ptr<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
-! ALL: acc.terminator
-! ALL: }
+! ALL-LABEL: acc.global_dtor @_QMacc_declare_equivalentEv2_acc_dtor {
+! ALL: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalentEv1) {acc.declare = #acc.declare<dataClause = acc_create>} : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[ADDR]] : !fir.ref<!fir.array<40xi8>>) -> !fir.ref<!fir.array<40xi8>> {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ref<!fir.array<40xi8>>)
+! ALL: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ref<!fir.array<40xi8>>) {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: acc.terminator
+! ALL: }
module acc_declare_equivalent2
real :: v1(10)
@@ -297,22 +291,16 @@ module acc_declare_equivalent2
end module
! ALL-LABEL: acc.global_ctor @_QMacc_declare_equivalent2Ev2_acc_ctor {
-! ALL-DAG: %[[C20:.*]] = arith.constant 20 : index
-! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalent2Ev1) : !fir.ref<!fir.array<40xi8>>
-! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C20]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
-! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<5xf32>>
-! ALL: %[[CREATE:.*]] = acc.create varPtr(%[[CONV]] : !fir.ptr<!fir.array<5xf32>>) -> !fir.ptr<!fir.array<5xf32>> {name = "v2", structured = false}
-! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ptr<!fir.array<5xf32>>)
+! ALL: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalent2Ev1) {acc.declare = #acc.declare<dataClause = acc_create>} : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[CREATE:.*]] = acc.create varPtr(%[[ADDR]] : !fir.ref<!fir.array<40xi8>>) -> !fir.ref<!fir.array<40xi8>> {name = "v2", structured = false}
+! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<40xi8>>)
! ALL: acc.terminator
! ALL: }
! ALL-LABEL: acc.global_dtor @_QMacc_declare_equivalent2Ev2_acc_dtor {
-! ALL-DAG: %[[C20:.*]] = arith.constant 20 : index
-! ALL-DAG: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalent2Ev1) : !fir.ref<!fir.array<40xi8>>
-! ALL: %[[COORD:.*]] = fir.coordinate_of %[[ADDR]], %[[C20]] : (!fir.ref<!fir.array<40xi8>>, index) -> !fir.ref<i8>
-! ALL: %[[CONV:.*]] = fir.convert %[[COORD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.ref<i8>) -> !fir.ptr<!fir.array<5xf32>>
-! ALL: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[CONV]] : !fir.ptr<!fir.array<5xf32>>) -> !fir.ptr<!fir.array<5xf32>> {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
-! ALL: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ptr<!fir.array<5xf32>>)
-! ALL: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ptr<!fir.array<5xf32>>) {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: %[[ADDR:.*]] = fir.address_of(@_QMacc_declare_equivalent2Ev1) {acc.declare = #acc.declare<dataClause = acc_create>} : !fir.ref<!fir.array<40xi8>>
+! ALL: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[ADDR]] : !fir.ref<!fir.array<40xi8>>) -> !fir.ref<!fir.array<40xi8>> {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
+! ALL: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ref<!fir.array<40xi8>>)
+! ALL: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ref<!fir.array<40xi8>>) {dataClause = #acc<data_clause acc_create>, name = "v2", structured = false}
! ALL: acc.terminator
! ALL: }
More information about the flang-commits
mailing list