xref: /llvm-project/flang/lib/Common/OpenMP-utils.cpp (revision 8fe11a26ae8f12622ddec83a7b80637080843a8b)
181f544d4SKareem Ergawy //===-- include/flang/Common/OpenMP-utils.cpp ------------------*- C++ -*-====//
281f544d4SKareem Ergawy //
381f544d4SKareem Ergawy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481f544d4SKareem Ergawy // See https://llvm.org/LICENSE.txt for license information.
581f544d4SKareem Ergawy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681f544d4SKareem Ergawy //
781f544d4SKareem Ergawy //===----------------------------------------------------------------------===//
881f544d4SKareem Ergawy 
981f544d4SKareem Ergawy #include "flang/Common/OpenMP-utils.h"
1081f544d4SKareem Ergawy 
1181f544d4SKareem Ergawy #include "mlir/IR/OpDefinition.h"
1281f544d4SKareem Ergawy 
1381f544d4SKareem Ergawy namespace Fortran::common::openmp {
1481f544d4SKareem Ergawy mlir::Block *genEntryBlock(mlir::OpBuilder &builder, const EntryBlockArgs &args,
1581f544d4SKareem Ergawy     mlir::Region &region) {
1681f544d4SKareem Ergawy   assert(args.isValid() && "invalid args");
1781f544d4SKareem Ergawy   assert(region.empty() && "non-empty region");
1881f544d4SKareem Ergawy 
1981f544d4SKareem Ergawy   llvm::SmallVector<mlir::Type> types;
2081f544d4SKareem Ergawy   llvm::SmallVector<mlir::Location> locs;
21*8fe11a26SSergio Afonso   unsigned numVars = args.hostEvalVars.size() + args.inReduction.vars.size() +
22*8fe11a26SSergio Afonso       args.map.vars.size() + args.priv.vars.size() +
23*8fe11a26SSergio Afonso       args.reduction.vars.size() + args.taskReduction.vars.size() +
24*8fe11a26SSergio Afonso       args.useDeviceAddr.vars.size() + args.useDevicePtr.vars.size();
2581f544d4SKareem Ergawy   types.reserve(numVars);
2681f544d4SKareem Ergawy   locs.reserve(numVars);
2781f544d4SKareem Ergawy 
2881f544d4SKareem Ergawy   auto extractTypeLoc = [&types, &locs](llvm::ArrayRef<mlir::Value> vals) {
2981f544d4SKareem Ergawy     llvm::transform(vals, std::back_inserter(types),
3081f544d4SKareem Ergawy         [](mlir::Value v) { return v.getType(); });
3181f544d4SKareem Ergawy     llvm::transform(vals, std::back_inserter(locs),
3281f544d4SKareem Ergawy         [](mlir::Value v) { return v.getLoc(); });
3381f544d4SKareem Ergawy   };
3481f544d4SKareem Ergawy 
3581f544d4SKareem Ergawy   // Populate block arguments in clause name alphabetical order to match
3681f544d4SKareem Ergawy   // expected order by the BlockArgOpenMPOpInterface.
37*8fe11a26SSergio Afonso   extractTypeLoc(args.hostEvalVars);
3881f544d4SKareem Ergawy   extractTypeLoc(args.inReduction.vars);
3981f544d4SKareem Ergawy   extractTypeLoc(args.map.vars);
4081f544d4SKareem Ergawy   extractTypeLoc(args.priv.vars);
4181f544d4SKareem Ergawy   extractTypeLoc(args.reduction.vars);
4281f544d4SKareem Ergawy   extractTypeLoc(args.taskReduction.vars);
4381f544d4SKareem Ergawy   extractTypeLoc(args.useDeviceAddr.vars);
4481f544d4SKareem Ergawy   extractTypeLoc(args.useDevicePtr.vars);
4581f544d4SKareem Ergawy 
4681f544d4SKareem Ergawy   return builder.createBlock(&region, {}, types, locs);
4781f544d4SKareem Ergawy }
4881f544d4SKareem Ergawy } // namespace Fortran::common::openmp
49