From 2557f9946373148664ce90dc6da5a6677424ac2c Mon Sep 17 00:00:00 2001 From: erichkeane Date: Fri, 27 Jun 2025 09:26:29 -0700 Subject: [PATCH] [OpenACC][CIR] Implement 'no_create' lowering for data This lowering ends up being identical to 'create', except it is a acc.nocreate for the start operation, and it doesn't permit modifier list. This patch implements this by adding it to the list of permitted handlers (along with compute), plus adds tests. --- clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp | 6 ++-- .../data-copy-copyin-copyout-create.c | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp b/clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp index 1a078981a3a0..5652f03c92b1 100644 --- a/clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp @@ -939,7 +939,7 @@ public: void VisitNoCreateClause(const OpenACCNoCreateClause &clause) { if constexpr (isOneOfTypes) { + mlir::acc::KernelsOp, mlir::acc::DataOp>) { for (const Expr *var : clause.getVarList()) addDataOperand( var, mlir::acc::DataClause::acc_no_create, {}, /*structured=*/true, @@ -947,9 +947,7 @@ public: } else if constexpr (isCombinedType) { applyToComputeOp(clause); } else { - // TODO: When we've implemented this for everything, switch this to an - // unreachable. data remains. - return clauseNotImplemented(clause); + llvm_unreachable("Unknown construct kind in VisitNoCreateClause"); } } diff --git a/clang/test/CIR/CodeGenOpenACC/data-copy-copyin-copyout-create.c b/clang/test/CIR/CodeGenOpenACC/data-copy-copyin-copyout-create.c index 7a541a8c62ea..068ca4a63e33 100644 --- a/clang/test/CIR/CodeGenOpenACC/data-copy-copyin-copyout-create.c +++ b/clang/test/CIR/CodeGenOpenACC/data-copy-copyin-copyout-create.c @@ -187,4 +187,32 @@ void acc_data(int parmVar) { // CHECK-NEXT: } loc // CHECK-NEXT: acc.delete accPtr(%[[CREATE2]] : !cir.ptr) {dataClause = #acc, modifiers = #acc, name = "parmVar"} // CHECK-NEXT: acc.delete accPtr(%[[CREATE1]] : !cir.ptr) {dataClause = #acc, modifiers = #acc, name = "parmVar"} + +#pragma acc data no_create(parmVar) + ; + // CHECK-NEXT: %[[NOCREATE1:.*]] = acc.nocreate varPtr(%[[PARM]] : !cir.ptr) -> !cir.ptr {name = "parmVar"} + // CHECK-NEXT: acc.data dataOperands(%[[NOCREATE1]] : !cir.ptr) { + // CHECK-NEXT: acc.terminator + // CHECK-NEXT: } loc + // CHECK-NEXT: acc.delete accPtr(%[[NOCREATE1]] : !cir.ptr) {dataClause = #acc, name = "parmVar"} + +#pragma acc data no_create(parmVar) no_create(localVar1) + ; + // CHECK-NEXT: %[[NOCREATE1:.*]] = acc.nocreate varPtr(%[[PARM]] : !cir.ptr) -> !cir.ptr {name = "parmVar"} + // CHECK-NEXT: %[[NOCREATE2:.*]] = acc.nocreate varPtr(%[[LV1]] : !cir.ptr) -> !cir.ptr {name = "localVar1"} + // CHECK-NEXT: acc.data dataOperands(%[[NOCREATE1]], %[[NOCREATE2]] : !cir.ptr, !cir.ptr) { + // CHECK-NEXT: acc.terminator + // CHECK-NEXT: } loc + // CHECK-NEXT: acc.delete accPtr(%[[NOCREATE2]] : !cir.ptr) {dataClause = #acc, name = "localVar1"} + // CHECK-NEXT: acc.delete accPtr(%[[NOCREATE1]] : !cir.ptr) {dataClause = #acc, name = "parmVar"} + +#pragma acc data no_create(parmVar, localVar1) + ; + // CHECK-NEXT: %[[NOCREATE1:.*]] = acc.nocreate varPtr(%[[PARM]] : !cir.ptr) -> !cir.ptr {name = "parmVar"} + // CHECK-NEXT: %[[NOCREATE2:.*]] = acc.nocreate varPtr(%[[LV1]] : !cir.ptr) -> !cir.ptr {name = "localVar1"} + // CHECK-NEXT: acc.data dataOperands(%[[NOCREATE1]], %[[NOCREATE2]] : !cir.ptr, !cir.ptr) { + // CHECK-NEXT: acc.terminator + // CHECK-NEXT: } loc + // CHECK-NEXT: acc.delete accPtr(%[[NOCREATE2]] : !cir.ptr) {dataClause = #acc, name = "localVar1"} + // CHECK-NEXT: acc.delete accPtr(%[[NOCREATE1]] : !cir.ptr) {dataClause = #acc, name = "parmVar"} }