Skip to content

Commit e4d8e06

Browse files
committed
[OpenACC][CIR] Implement present/deviceptr/attach lowering for data
These three are once again are IR clones of what the compute IR looks like, so this patch is just adding the implementation and writing sufficient tests.
1 parent 778b6a2 commit e4d8e06

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ class OpenACCClauseCIREmitter final
922922

923923
void VisitDevicePtrClause(const OpenACCDevicePtrClause &clause) {
924924
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
925-
mlir::acc::KernelsOp>) {
925+
mlir::acc::KernelsOp, mlir::acc::DataOp>) {
926926
for (const Expr *var : clause.getVarList())
927927
addDataOperand<mlir::acc::DevicePtrOp>(
928928
var, mlir::acc::DataClause::acc_deviceptr, {},
@@ -932,7 +932,7 @@ class OpenACCClauseCIREmitter final
932932
applyToComputeOp(clause);
933933
} else {
934934
// TODO: When we've implemented this for everything, switch this to an
935-
// unreachable. data, declare remain.
935+
// unreachable. declare remains.
936936
return clauseNotImplemented(clause);
937937
}
938938
}
@@ -953,7 +953,7 @@ class OpenACCClauseCIREmitter final
953953

954954
void VisitPresentClause(const OpenACCPresentClause &clause) {
955955
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
956-
mlir::acc::KernelsOp>) {
956+
mlir::acc::KernelsOp, mlir::acc::DataOp>) {
957957
for (const Expr *var : clause.getVarList())
958958
addDataOperand<mlir::acc::PresentOp, mlir::acc::DeleteOp>(
959959
var, mlir::acc::DataClause::acc_present, {}, /*structured=*/true,
@@ -962,14 +962,14 @@ class OpenACCClauseCIREmitter final
962962
applyToComputeOp(clause);
963963
} else {
964964
// TODO: When we've implemented this for everything, switch this to an
965-
// unreachable. data & declare remain.
965+
// unreachable. declare remains.
966966
return clauseNotImplemented(clause);
967967
}
968968
}
969969

970970
void VisitAttachClause(const OpenACCAttachClause &clause) {
971971
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
972-
mlir::acc::KernelsOp>) {
972+
mlir::acc::KernelsOp, mlir::acc::DataOp>) {
973973
for (const Expr *var : clause.getVarList())
974974
addDataOperand<mlir::acc::AttachOp, mlir::acc::DetachOp>(
975975
var, mlir::acc::DataClause::acc_attach, {}, /*structured=*/true,
@@ -978,7 +978,7 @@ class OpenACCClauseCIREmitter final
978978
applyToComputeOp(clause);
979979
} else {
980980
// TODO: When we've implemented this for everything, switch this to an
981-
// unreachable. data, enter data remain.
981+
// unreachable. enter data remains.
982982
return clauseNotImplemented(clause);
983983
}
984984
}

clang/test/CIR/CodeGenOpenACC/data.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
void acc_data(int cond) {
44
// CHECK: cir.func{{.*}} @acc_data(%[[ARG:.*]]: !s32i{{.*}}) {
55
// CHECK-NEXT: %[[COND:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["cond", init]
6+
7+
int *ptr;
8+
// CHECK-NEXT: %[[PTR:.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["ptr"]
69
// CHECK-NEXT: cir.store %[[ARG]], %[[COND]] : !s32i, !cir.ptr<!s32i>
710

811
#pragma acc data default(none)
@@ -221,5 +224,50 @@ void acc_data(int cond) {
221224
// CHECK-NEXT: acc.terminator
222225
// CHECK-NEXT: attributes {defaultAttr = #acc<defaultvalue none>}
223226

227+
#pragma acc data deviceptr(ptr)
228+
{}
229+
// CHECK-NEXT: %[[DEV_PTR:.*]] = acc.deviceptr varPtr(%[[PTR]] : !cir.ptr<!cir.ptr<!s32i>>) -> !cir.ptr<!cir.ptr<!s32i>> {name = "ptr"}
230+
// CHECK-NEXT: acc.data dataOperands(%[[DEV_PTR]] : !cir.ptr<!cir.ptr<!s32i>>) {
231+
// CHECK-NEXT: acc.terminator
232+
// CHECK-NEXT: } loc
233+
#pragma acc data deviceptr(ptr) device_type(radeon) async
234+
{}
235+
// CHECK-NEXT: %[[DEV_PTR:.*]] = acc.deviceptr varPtr(%[[PTR]] : !cir.ptr<!cir.ptr<!s32i>>) async([#acc.device_type<radeon>]) -> !cir.ptr<!cir.ptr<!s32i>> {name = "ptr"}
236+
// CHECK-NEXT: acc.data async([#acc.device_type<radeon>]) dataOperands(%[[DEV_PTR]] : !cir.ptr<!cir.ptr<!s32i>>) {
237+
// CHECK-NEXT: acc.terminator
238+
// CHECK-NEXT: } loc
239+
240+
#pragma acc data present(cond)
241+
{}
242+
// CHECK-NEXT: %[[PRESENT:.*]] = acc.present varPtr(%[[COND]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "cond"}
243+
// CHECK-NEXT: acc.data dataOperands(%[[PRESENT]] : !cir.ptr<!s32i>) {
244+
// CHECK-NEXT: acc.terminator
245+
// CHECK-NEXT: } loc
246+
// CHECK-NEXT: acc.delete accPtr(%[[PRESENT]] : !cir.ptr<!s32i>) {dataClause = #acc<data_clause acc_present>, name = "cond"}
247+
248+
#pragma acc data present(cond) device_type(radeon) async
249+
{}
250+
// CHECK-NEXT: %[[PRESENT:.*]] = acc.present varPtr(%[[COND]] : !cir.ptr<!s32i>) async([#acc.device_type<radeon>]) -> !cir.ptr<!s32i> {name = "cond"}
251+
// CHECK-NEXT: acc.data async([#acc.device_type<radeon>]) dataOperands(%[[PRESENT]] : !cir.ptr<!s32i>) {
252+
// CHECK-NEXT: acc.terminator
253+
// CHECK-NEXT: } loc
254+
// CHECK-NEXT: acc.delete accPtr(%[[PRESENT]] : !cir.ptr<!s32i>) async([#acc.device_type<radeon>]) {dataClause = #acc<data_clause acc_present>, name = "cond"}
255+
256+
#pragma acc data attach(ptr)
257+
{}
258+
// CHECK-NEXT: %[[ATTACH:.*]] = acc.attach varPtr(%[[PTR]] : !cir.ptr<!cir.ptr<!s32i>>) -> !cir.ptr<!cir.ptr<!s32i>> {name = "ptr"}
259+
// CHECK-NEXT: acc.data dataOperands(%[[ATTACH]] : !cir.ptr<!cir.ptr<!s32i>>) {
260+
// CHECK-NEXT: acc.terminator
261+
// CHECK-NEXT: } loc
262+
// CHECK-NEXT: acc.detach accPtr(%[[ATTACH]] : !cir.ptr<!cir.ptr<!s32i>>) {dataClause = #acc<data_clause acc_attach>, name = "ptr"}
263+
264+
#pragma acc data attach(ptr) device_type(radeon) async
265+
{}
266+
// CHECK-NEXT: %[[ATTACH:.*]] = acc.attach varPtr(%[[PTR]] : !cir.ptr<!cir.ptr<!s32i>>) async([#acc.device_type<radeon>]) -> !cir.ptr<!cir.ptr<!s32i>> {name = "ptr"}
267+
// CHECK-NEXT: acc.data async([#acc.device_type<radeon>]) dataOperands(%[[ATTACH]] : !cir.ptr<!cir.ptr<!s32i>>) {
268+
// CHECK-NEXT: acc.terminator
269+
// CHECK-NEXT: } loc
270+
// CHECK-NEXT: acc.detach accPtr(%[[ATTACH]] : !cir.ptr<!cir.ptr<!s32i>>) async([#acc.device_type<radeon>]) {dataClause = #acc<data_clause acc_attach>, name = "ptr"}
271+
224272
// CHECK-NEXT: cir.return
225273
}

0 commit comments

Comments
 (0)