diff --git a/flang/include/flang/Lower/OpenACC.h b/flang/include/flang/Lower/OpenACC.h --- a/flang/include/flang/Lower/OpenACC.h +++ b/flang/include/flang/Lower/OpenACC.h @@ -51,6 +51,8 @@ struct Evaluation; } // namespace pft +static constexpr llvm::StringRef declarePostAllocSuffix = + "_acc_declare_update_desc_post_alloc"; static constexpr llvm::StringRef declarePreDeallocSuffix = "_acc_declare_update_desc_pre_dealloc"; static constexpr llvm::StringRef declarePostDeallocSuffix = 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 @@ -2346,22 +2346,30 @@ modBuilder.setInsertionPointAfter(declareGlobalOp); } +static mlir::func::FuncOp createDeclareFunc(mlir::OpBuilder &modBuilder, + fir::FirOpBuilder &builder, + mlir::Location loc, + llvm::StringRef funcName) { + auto funcTy = mlir::FunctionType::get(modBuilder.getContext(), {}, {}); + auto funcOp = modBuilder.create(loc, funcName, funcTy); + funcOp.setVisibility(mlir::SymbolTable::Visibility::Private); + builder.createBlock(&funcOp.getRegion(), funcOp.getRegion().end(), {}, {}); + builder.setInsertionPointToEnd(&funcOp.getRegion().back()); + builder.create(loc); + builder.setInsertionPointToStart(&funcOp.getRegion().back()); + return funcOp; +} + template -static void createRegisterFunc(mlir::OpBuilder &modBuilder, - fir::FirOpBuilder &builder, mlir::Location loc, - fir::GlobalOp &globalOp, - mlir::acc::DataClause clause) { +static void createDeclareAllocFunc(mlir::OpBuilder &modBuilder, + fir::FirOpBuilder &builder, + mlir::Location loc, fir::GlobalOp &globalOp, + mlir::acc::DataClause clause) { std::stringstream registerFuncName; registerFuncName << globalOp.getSymName().str() - << "_acc_declare_update_desc_post_alloc"; - auto funcTy = mlir::FunctionType::get(modBuilder.getContext(), {}, {}); - mlir::func::FuncOp registerFuncOp = modBuilder.create( - loc, registerFuncName.str(), funcTy); - registerFuncOp.setVisibility(mlir::SymbolTable::Visibility::Private); - - builder.createBlock(®isterFuncOp.getRegion(), - registerFuncOp.getRegion().end(), {}, {}); - builder.setInsertionPointToEnd(®isterFuncOp.getRegion().back()); + << Fortran::lower::declarePostAllocSuffix.str(); + auto registerFuncOp = + createDeclareFunc(modBuilder, builder, loc, registerFuncName.str()); fir::AddrOfOp addrOp = builder.create( loc, fir::ReferenceType::get(globalOp.getType()), globalOp.getSymbol()); @@ -2387,25 +2395,9 @@ llvm::SmallVector operandSegments{0, 0, 0, 0, 0, 1}; llvm::SmallVector operands{updateDeviceOp.getResult()}; createSimpleOp(builder, loc, operands, operandSegments); - - builder.create(loc); modBuilder.setInsertionPointAfter(registerFuncOp); } -static mlir::func::FuncOp createDeclareFunc(mlir::OpBuilder &modBuilder, - fir::FirOpBuilder &builder, - mlir::Location loc, - llvm::StringRef funcName) { - auto funcTy = mlir::FunctionType::get(modBuilder.getContext(), {}, {}); - auto funcOp = modBuilder.create(loc, funcName, funcTy); - funcOp.setVisibility(mlir::SymbolTable::Visibility::Private); - builder.createBlock(&funcOp.getRegion(), funcOp.getRegion().end(), {}, {}); - builder.setInsertionPointToEnd(&funcOp.getRegion().back()); - builder.create(loc); - builder.setInsertionPointToStart(&funcOp.getRegion().back()); - return funcOp; -} - /// Action to be performed on deallocation are split in two distinct functions. /// - Pre deallocation function includes all the action to be performed before /// the actual deallocation is done on the host side. @@ -2500,7 +2492,7 @@ mlir::acc::DeclareEnterOp, ExitOp>( modBuilder, builder, operandLocation, globalOp, clause, /*implicit=*/true); - createRegisterFunc( + createDeclareAllocFunc( modBuilder, builder, operandLocation, globalOp, clause); if constexpr (!std::is_same_v) createDeclareDeallocFunc(