[OpenACC][CIR] Implement copyin/copyout/create lowering for compute/c… (#145976)
…ombined
This patch does the lowering of copyin (represented as a
acc.copyin/acc.delete), copyout (acc.create/acc.copyin), and create
(acc.create/acc.delete).
Additionally, it found a few problems with #144806, so it fixes those as
well.
This commit is contained in:
@@ -844,7 +844,7 @@ public:
|
||||
void VisitCopyClause(const OpenACCCopyClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (auto var : clause.getVarList())
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::CopyinOp, mlir::acc::CopyoutOp>(
|
||||
var, mlir::acc::DataClause::acc_copy, clause.getModifierList(),
|
||||
/*structured=*/true,
|
||||
@@ -858,9 +858,60 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void VisitCopyInClause(const OpenACCCopyInClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::CopyinOp, mlir::acc::DeleteOp>(
|
||||
var, mlir::acc::DataClause::acc_copyin, clause.getModifierList(),
|
||||
/*structured=*/true,
|
||||
/*implicit=*/false);
|
||||
} else if constexpr (isCombinedType<OpTy>) {
|
||||
applyToComputeOp(clause);
|
||||
} else {
|
||||
// TODO: When we've implemented this for everything, switch this to an
|
||||
// unreachable. data, declare, combined constructs remain.
|
||||
return clauseNotImplemented(clause);
|
||||
}
|
||||
}
|
||||
|
||||
void VisitCopyOutClause(const OpenACCCopyOutClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::CreateOp, mlir::acc::CopyoutOp>(
|
||||
var, mlir::acc::DataClause::acc_copyout, clause.getModifierList(),
|
||||
/*structured=*/true,
|
||||
/*implicit=*/false);
|
||||
} else if constexpr (isCombinedType<OpTy>) {
|
||||
applyToComputeOp(clause);
|
||||
} else {
|
||||
// TODO: When we've implemented this for everything, switch this to an
|
||||
// unreachable. data, declare, combined constructs remain.
|
||||
return clauseNotImplemented(clause);
|
||||
}
|
||||
}
|
||||
|
||||
void VisitCreateClause(const OpenACCCreateClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::CreateOp, mlir::acc::DeleteOp>(
|
||||
var, mlir::acc::DataClause::acc_create, clause.getModifierList(),
|
||||
/*structured=*/true,
|
||||
/*implicit=*/false);
|
||||
} else if constexpr (isCombinedType<OpTy>) {
|
||||
applyToComputeOp(clause);
|
||||
} else {
|
||||
// TODO: When we've implemented this for everything, switch this to an
|
||||
// unreachable. data, declare, combined constructs remain.
|
||||
return clauseNotImplemented(clause);
|
||||
}
|
||||
}
|
||||
|
||||
void VisitUseDeviceClause(const OpenACCUseDeviceClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::HostDataOp>) {
|
||||
for (auto var : clause.getVarList())
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::UseDeviceOp>(
|
||||
var, mlir::acc::DataClause::acc_use_device, {}, /*structured=*/true,
|
||||
/*implicit=*/false);
|
||||
@@ -872,7 +923,7 @@ public:
|
||||
void VisitDevicePtrClause(const OpenACCDevicePtrClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (auto var : clause.getVarList())
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::DevicePtrOp>(
|
||||
var, mlir::acc::DataClause::acc_deviceptr, {},
|
||||
/*structured=*/true,
|
||||
@@ -889,7 +940,7 @@ public:
|
||||
void VisitNoCreateClause(const OpenACCNoCreateClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (auto var : clause.getVarList())
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::NoCreateOp, mlir::acc::DeleteOp>(
|
||||
var, mlir::acc::DataClause::acc_no_create, {}, /*structured=*/true,
|
||||
/*implicit=*/false);
|
||||
@@ -905,7 +956,7 @@ public:
|
||||
void VisitPresentClause(const OpenACCPresentClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (auto var : clause.getVarList())
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::PresentOp, mlir::acc::DeleteOp>(
|
||||
var, mlir::acc::DataClause::acc_present, {}, /*structured=*/true,
|
||||
/*implicit=*/false);
|
||||
@@ -921,7 +972,7 @@ public:
|
||||
void VisitAttachClause(const OpenACCAttachClause &clause) {
|
||||
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
|
||||
mlir::acc::KernelsOp>) {
|
||||
for (auto var : clause.getVarList())
|
||||
for (const Expr *var : clause.getVarList())
|
||||
addDataOperand<mlir::acc::AttachOp, mlir::acc::DetachOp>(
|
||||
var, mlir::acc::DataClause::acc_attach, {}, /*structured=*/true,
|
||||
/*implicit=*/false);
|
||||
|
||||
160
clang/test/CIR/CodeGenOpenACC/combined-copyin-copyout-create.c
Normal file
160
clang/test/CIR/CodeGenOpenACC/combined-copyin-copyout-create.c
Normal file
@@ -0,0 +1,160 @@
|
||||
// RUN: %clang_cc1 -fopenacc -Wno-openacc-self-if-potential-conflict -emit-cir -fclangir %s -o - | FileCheck %s
|
||||
|
||||
void acc_combined(int parmVar) {
|
||||
// CHECK: cir.func{{.*}} @acc_combined(%[[ARG:.*]]: !s32i{{.*}}) {
|
||||
// CHECK-NEXT: %[[PARM:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["parmVar", init]
|
||||
|
||||
int localVar1;
|
||||
// CHECK-NEXT: %[[LV1:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["localVar1"]
|
||||
float localVar2;
|
||||
// CHECK-NEXT: %[[LV2:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["localVar2"]
|
||||
// CHECK-NEXT: cir.store %[[ARG]], %[[PARM]]
|
||||
#pragma acc parallel loop copyin(parmVar) copyout(localVar1) create(localVar2)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {name = "localVar2"}
|
||||
// CHECK-NEXT: acc.parallel combined(loop) dataOperands(%[[COPYIN1]], %[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.loop combined(parallel) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE2]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_create>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial loop copyin(parmVar, localVar1)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "localVar1"}
|
||||
// CHECK-NEXT: acc.serial combined(loop) dataOperands(%[[COPYIN1]], %[[COPYIN2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.loop combined(serial) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, name = "parmVar"}
|
||||
|
||||
#pragma acc kernels loop copyout(parmVar, localVar1)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.kernels combined(loop) dataOperands(%[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.loop combined(kernels) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.terminator
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {name = "localVar1"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[PARM]] : !cir.ptr<!s32i>) {name = "parmVar"}
|
||||
|
||||
#pragma acc parallel loop create (parmVar, localVar2)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {name = "localVar2"}
|
||||
// CHECK-NEXT: acc.parallel combined(loop) dataOperands(%[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.loop combined(parallel) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE2]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_create>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial loop copyin(capture: parmVar) copyin(always: localVar1)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.serial combined(loop) dataOperands(%[[COPYIN1]], %[[COPYIN2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.loop combined(serial) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc kernels loop copyout(capture: parmVar) copyout(always: localVar1)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.kernels combined(loop) dataOperands(%[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.loop combined(kernels) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.terminator
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[PARM]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc parallel loop create(capture: parmVar)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: acc.parallel combined(loop) dataOperands(%[[CREATE1]] : !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.loop combined(parallel) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial loop copyin(capture, always: parmVar, localVar1)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.serial combined(loop) dataOperands(%[[COPYIN1]], %[[COPYIN2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.loop combined(serial) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc kernels loop copyin(readonly, always, alwaysin, capture: parmVar, localVar1, localVar2)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[COPYIN3:.*]] = acc.copyin varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.kernels combined(loop) dataOperands(%[[COPYIN1]], %[[COPYIN2]], %[[COPYIN3]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.loop combined(kernels) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.terminator
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN3]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc parallel loop copyout(zero, always, alwaysout, capture: parmVar, localVar1, localVar2)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always,zero,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[CREATE3:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.parallel combined(loop) dataOperands(%[[CREATE1]], %[[CREATE2]], %[[CREATE3]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.loop combined(parallel) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE3]] : !cir.ptr<!cir.float>) to varPtr(%[[LV2]] : !cir.ptr<!cir.float>) {modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[PARM]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier always,zero,capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial loop create(zero, capture: parmVar, localVar1, localVar2)
|
||||
for(int i = 0; i < 5; ++i);
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier zero,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[CREATE3:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.serial combined(loop) dataOperands(%[[CREATE1]], %[[CREATE2]], %[[CREATE3]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.loop combined(serial) {
|
||||
// CHECK: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE3]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier zero,capture>, name = "parmVar"}
|
||||
}
|
||||
128
clang/test/CIR/CodeGenOpenACC/compute-copyin-copyout-create.c
Normal file
128
clang/test/CIR/CodeGenOpenACC/compute-copyin-copyout-create.c
Normal file
@@ -0,0 +1,128 @@
|
||||
// RUN: %clang_cc1 -fopenacc -Wno-openacc-self-if-potential-conflict -emit-cir -fclangir %s -o - | FileCheck %s
|
||||
|
||||
void acc_compute(int parmVar) {
|
||||
// CHECK: cir.func{{.*}} @acc_compute(%[[ARG:.*]]: !s32i{{.*}}) {
|
||||
// CHECK-NEXT: %[[PARM:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["parmVar", init]
|
||||
|
||||
int localVar1;
|
||||
// CHECK-NEXT: %[[LV1:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["localVar1"]
|
||||
float localVar2;
|
||||
// CHECK-NEXT: %[[LV2:.*]] = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["localVar2"]
|
||||
// CHECK-NEXT: cir.store %[[ARG]], %[[PARM]]
|
||||
|
||||
#pragma acc parallel copyin(parmVar) copyout(localVar1) create(localVar2)
|
||||
;
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {name = "localVar2"}
|
||||
// CHECK-NEXT: acc.parallel dataOperands(%[[COPYIN1]], %[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE2]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_create>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial copyin(parmVar, localVar1)
|
||||
;
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "localVar1"}
|
||||
// CHECK-NEXT: acc.serial dataOperands(%[[COPYIN1]], %[[COPYIN2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, name = "parmVar"}
|
||||
|
||||
#pragma acc kernels copyout(parmVar, localVar1)
|
||||
;
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.kernels dataOperands(%[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.terminator
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {name = "localVar1"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[PARM]] : !cir.ptr<!s32i>) {name = "parmVar"}
|
||||
|
||||
#pragma acc parallel create (parmVar, localVar2)
|
||||
;
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {name = "localVar2"}
|
||||
// CHECK-NEXT: acc.parallel dataOperands(%[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE2]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_create>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial copyin(capture: parmVar) copyin(always: localVar1)
|
||||
;
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.serial dataOperands(%[[COPYIN1]], %[[COPYIN2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc kernels copyout(capture: parmVar) copyout(always: localVar1)
|
||||
;
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.kernels dataOperands(%[[CREATE1]], %[[CREATE2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.terminator
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier always>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[PARM]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc parallel create(capture: parmVar)
|
||||
;
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: acc.parallel dataOperands(%[[CREATE1]] : !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial copyin(capture, always: parmVar, localVar1)
|
||||
;
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.serial dataOperands(%[[COPYIN1]], %[[COPYIN2]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc kernels copyin(readonly, always, alwaysin, capture: parmVar, localVar1, localVar2)
|
||||
;
|
||||
// CHECK-NEXT: %[[COPYIN1:.*]] = acc.copyin varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[COPYIN2:.*]] = acc.copyin varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[COPYIN3:.*]] = acc.copyin varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.kernels dataOperands(%[[COPYIN1]], %[[COPYIN2]], %[[COPYIN3]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.terminator
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN3]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[COPYIN1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_copyin>, modifiers = #acc<data_clause_modifier always,readonly,capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc parallel copyout(zero, always, alwaysout, capture: parmVar, localVar1, localVar2)
|
||||
;
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always,zero,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[CREATE3:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {dataClause = #acc<data_clause acc_copyout>, modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.parallel dataOperands(%[[CREATE1]], %[[CREATE2]], %[[CREATE3]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE3]] : !cir.ptr<!cir.float>) to varPtr(%[[LV2]] : !cir.ptr<!cir.float>) {modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) to varPtr(%[[LV1]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier always,zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.copyout accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) to varPtr(%[[PARM]] : !cir.ptr<!s32i>) {modifiers = #acc<data_clause_modifier always,zero,capture>, name = "parmVar"}
|
||||
|
||||
#pragma acc serial create(zero, capture: parmVar, localVar1, localVar2)
|
||||
;
|
||||
// CHECK-NEXT: %[[CREATE1:.*]] = acc.create varPtr(%[[PARM]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier zero,capture>, name = "parmVar"}
|
||||
// CHECK-NEXT: %[[CREATE2:.*]] = acc.create varPtr(%[[LV1]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: %[[CREATE3:.*]] = acc.create varPtr(%[[LV2]] : !cir.ptr<!cir.float>) -> !cir.ptr<!cir.float> {modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.serial dataOperands(%[[CREATE1]], %[[CREATE2]], %[[CREATE3]] : !cir.ptr<!s32i>, !cir.ptr<!s32i>, !cir.ptr<!cir.float>) {
|
||||
// CHECK-NEXT: acc.yield
|
||||
// CHECK-NEXT: } loc
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE3]] : !cir.ptr<!cir.float>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar2"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE2]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier zero,capture>, name = "localVar1"}
|
||||
// CHECK-NEXT: acc.delete accPtr(%[[CREATE1]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_create>, modifiers = #acc<data_clause_modifier zero,capture>, name = "parmVar"}
|
||||
}
|
||||
@@ -575,8 +575,10 @@ LogicalResult acc::CreateOp::verify() {
|
||||
return failure();
|
||||
if (failed(checkVarAndAccVar(*this)))
|
||||
return failure();
|
||||
// this op is the entry part of copyout, so it also needs to allow all
|
||||
// modifiers allowed on copyout.
|
||||
if (failed(checkValidModifier(*this, acc::DataClauseModifier::zero |
|
||||
acc::DataClauseModifier::alwaysout |
|
||||
acc::DataClauseModifier::always |
|
||||
acc::DataClauseModifier::capture)))
|
||||
return failure();
|
||||
return success();
|
||||
@@ -708,7 +710,7 @@ LogicalResult acc::DeleteOp::verify() {
|
||||
// allowed on either case.
|
||||
if (failed(checkValidModifier(*this, acc::DataClauseModifier::zero |
|
||||
acc::DataClauseModifier::readonly |
|
||||
acc::DataClauseModifier::alwaysin |
|
||||
acc::DataClauseModifier::always |
|
||||
acc::DataClauseModifier::capture)))
|
||||
return failure();
|
||||
return success();
|
||||
|
||||
@@ -829,5 +829,5 @@ func.func @acc_loop_container() {
|
||||
// -----
|
||||
|
||||
%value = memref.alloc() : memref<f32>
|
||||
// expected-error @below {{invalid data clause modifiers: alwaysin}}
|
||||
%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier zero,capture,always>}
|
||||
// expected-error @below {{invalid data clause modifiers: readonly}}
|
||||
%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier readonly,zero,capture,always>}
|
||||
|
||||
@@ -924,15 +924,25 @@ func.func @testdataop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
|
||||
func.func @testdataopmodifiers(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
|
||||
%0 = acc.create varPtr(%a : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier capture,zero>}
|
||||
%1 = acc.copyin varPtr(%b : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier readonly,capture,always>}
|
||||
acc.data dataOperands(%0, %1 : memref<f32>, memref<f32>) {
|
||||
%2 = acc.copyin varPtr(%c : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier always>}
|
||||
%3 = acc.create varPtr(%c : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier always>}
|
||||
acc.data dataOperands(%0, %1, %2, %3 : memref<f32>, memref<f32>, memref<f32>, memref<f32>) {
|
||||
}
|
||||
acc.copyout accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>) {modifiers = #acc<data_clause_modifier zero,capture,always>}
|
||||
acc.delete accPtr(%2 : memref<f32>) {modifiers = #acc<data_clause_modifier always>}
|
||||
acc.copyout accPtr(%3 : memref<f32>) to varPtr(%c : memref<f32>) {modifiers = #acc<data_clause_modifier always>}
|
||||
|
||||
func.return
|
||||
}
|
||||
|
||||
// CHECK: func @testdataopmodifiers(%[[ARGA:.*]]: memref<f32>, %[[ARGB:.*]]: memref<f32>, %[[ARGC:.*]]: memref<f32>) {
|
||||
// CHECK: %[[CREATEA:.*]] = acc.create varPtr(%[[ARGA]] : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier zero,capture>}
|
||||
// CHECK: %[[COPYINB:.*]] = acc.copyin varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier always,readonly,capture>}
|
||||
// CHECK: %[[COPYINC:.*]] = acc.copyin varPtr(%[[ARGC]] : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier always>}
|
||||
// CHECK: %[[CREATEC:.*]] = acc.create varPtr(%[[ARGC]] : memref<f32>) -> memref<f32> {modifiers = #acc<data_clause_modifier always>}
|
||||
// CHECK: acc.copyout accPtr(%[[CREATEA]] : memref<f32>) to varPtr(%[[ARGA]] : memref<f32>) {modifiers = #acc<data_clause_modifier always,zero,capture>}
|
||||
// CHECK: acc.delete accPtr(%[[COPYINC]] : memref<f32>) {modifiers = #acc<data_clause_modifier always>}
|
||||
// CHECK: acc.copyout accPtr(%[[CREATEC]] : memref<f32>) to varPtr(%[[ARGC]] : memref<f32>) {modifiers = #acc<data_clause_modifier always>}
|
||||
|
||||
// -----
|
||||
|
||||
|
||||
Reference in New Issue
Block a user