diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -1482,6 +1482,16 @@ dataClauseOperands, mlir::acc::DataClause::acc_update_device, false); } else if (std::get_if(&clause.u)) { addIfPresentAttr = true; + } else if (const auto *selfClause = + std::get_if(&clause.u)) { + const std::optional &accSelfClause = + selfClause->v; + const auto *accObjectList = + std::get_if(&(*accSelfClause).u); + assert(accObjectList && "expect AccObjectList"); + genDataOperandOperations( + *accObjectList, converter, semanticsContext, stmtCtx, + updateHostOperands, mlir::acc::DataClause::acc_update_self, false); } } diff --git a/flang/test/Lower/OpenACC/acc-update.f90 b/flang/test/Lower/OpenACC/acc-update.f90 --- a/flang/test/Lower/OpenACC/acc-update.f90 +++ b/flang/test/Lower/OpenACC/acc-update.f90 @@ -21,6 +21,11 @@ ! CHECK: acc.update dataOperands(%[[DEVPTR_A]] : !fir.ref>) attributes {ifPresent}{{$}} ! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) to varPtr(%[[A]] : !fir.ref>) {name = "a", structured = false} + !$acc update self(a) +! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {dataClause = 18 : i64, name = "a", structured = false} +! CHECK: acc.update dataOperands(%[[DEVPTR_A]] : !fir.ref>){{$}} +! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) to varPtr(%[[A]] : !fir.ref>) {dataClause = 18 : i64, name = "a", structured = false} + !$acc update host(a) if(.true.) ! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {dataClause = 17 : i64, name = "a", structured = false} ! CHECK: %[[IF1:.*]] = arith.constant true diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp --- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp +++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp @@ -151,7 +151,8 @@ getDataClause() != acc::DataClause::acc_copyout && getDataClause() != acc::DataClause::acc_delete && getDataClause() != acc::DataClause::acc_detach && - getDataClause() != acc::DataClause::acc_update_host) + getDataClause() != acc::DataClause::acc_update_host && + getDataClause() != acc::DataClause::acc_update_self) return emitError("getDevicePtr mismatch"); return success(); }