xref: /llvm-project/flang/lib/Common/OpenMP-utils.cpp (revision 8fe11a26ae8f12622ddec83a7b80637080843a8b)
1 //===-- include/flang/Common/OpenMP-utils.cpp ------------------*- C++ -*-====//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "flang/Common/OpenMP-utils.h"
10 
11 #include "mlir/IR/OpDefinition.h"
12 
13 namespace Fortran::common::openmp {
14 mlir::Block *genEntryBlock(mlir::OpBuilder &builder, const EntryBlockArgs &args,
15     mlir::Region &region) {
16   assert(args.isValid() && "invalid args");
17   assert(region.empty() && "non-empty region");
18 
19   llvm::SmallVector<mlir::Type> types;
20   llvm::SmallVector<mlir::Location> locs;
21   unsigned numVars = args.hostEvalVars.size() + args.inReduction.vars.size() +
22       args.map.vars.size() + args.priv.vars.size() +
23       args.reduction.vars.size() + args.taskReduction.vars.size() +
24       args.useDeviceAddr.vars.size() + args.useDevicePtr.vars.size();
25   types.reserve(numVars);
26   locs.reserve(numVars);
27 
28   auto extractTypeLoc = [&types, &locs](llvm::ArrayRef<mlir::Value> vals) {
29     llvm::transform(vals, std::back_inserter(types),
30         [](mlir::Value v) { return v.getType(); });
31     llvm::transform(vals, std::back_inserter(locs),
32         [](mlir::Value v) { return v.getLoc(); });
33   };
34 
35   // Populate block arguments in clause name alphabetical order to match
36   // expected order by the BlockArgOpenMPOpInterface.
37   extractTypeLoc(args.hostEvalVars);
38   extractTypeLoc(args.inReduction.vars);
39   extractTypeLoc(args.map.vars);
40   extractTypeLoc(args.priv.vars);
41   extractTypeLoc(args.reduction.vars);
42   extractTypeLoc(args.taskReduction.vars);
43   extractTypeLoc(args.useDeviceAddr.vars);
44   extractTypeLoc(args.useDevicePtr.vars);
45 
46   return builder.createBlock(&region, {}, types, locs);
47 }
48 } // namespace Fortran::common::openmp
49