2222#include " flang/Lower/PFTBuilder.h"
2323#include " flang/Lower/Runtime.h"
2424#include " flang/Lower/StatementContext.h"
25+ #include " flang/Optimizer/Builder/CUFCommon.h"
2526#include " flang/Optimizer/Builder/FIRBuilder.h"
2627#include " flang/Optimizer/Builder/Runtime/RTBuilder.h"
2728#include " flang/Optimizer/Builder/Todo.h"
2829#include " flang/Optimizer/Dialect/CUF/CUFOps.h"
2930#include " flang/Optimizer/Dialect/FIROps.h"
3031#include " flang/Optimizer/Dialect/FIROpsSupport.h"
32+ #include " flang/Optimizer/HLFIR/HLFIROps.h"
3133#include " flang/Optimizer/Support/FatalError.h"
3234#include " flang/Optimizer/Support/InternalNames.h"
3335#include " flang/Parser/parse-tree.h"
@@ -1086,6 +1088,22 @@ bool Fortran::lower::isArraySectionWithoutVectorSubscript(
10861088 !Fortran::evaluate::HasVectorSubscript (expr);
10871089}
10881090
1091+ static void genCUFPointerSync (const mlir::Value box,
1092+ fir::FirOpBuilder &builder) {
1093+ if (auto declareOp = box.getDefiningOp <hlfir::DeclareOp>()) {
1094+ if (auto addrOfOp = declareOp.getMemref ().getDefiningOp <fir::AddrOfOp>()) {
1095+ auto mod = addrOfOp->getParentOfType <mlir::ModuleOp>();
1096+ if (auto globalOp =
1097+ mod.lookupSymbol <fir::GlobalOp>(addrOfOp.getSymbol ())) {
1098+ if (cuf::isRegisteredDeviceGlobal (globalOp)) {
1099+ builder.create <cuf::SyncDescriptorOp>(box.getLoc (),
1100+ addrOfOp.getSymbol ());
1101+ }
1102+ }
1103+ }
1104+ }
1105+ }
1106+
10891107void Fortran::lower::associateMutableBox (
10901108 Fortran::lower::AbstractConverter &converter, mlir::Location loc,
10911109 const fir::MutableBoxValue &box, const Fortran::lower::SomeExpr &source,
@@ -1098,6 +1116,7 @@ void Fortran::lower::associateMutableBox(
10981116 if (converter.getLoweringOptions ().getLowerToHighLevelFIR ()) {
10991117 fir::ExtendedValue rhs = converter.genExprAddr (loc, source, stmtCtx);
11001118 fir::factory::associateMutableBox (builder, loc, box, rhs, lbounds);
1119+ genCUFPointerSync (box.getAddr (), builder);
11011120 return ;
11021121 }
11031122 // The right hand side is not be evaluated into a temp. Array sections can
0 commit comments