xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGOpenMPRuntime.h (revision a4e5e0106ac7145f56eb39a691e302cabb4635be)
1 //===----- CGOpenMPRuntime.h - Interface to OpenMP Runtimes -----*- 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 // This provides a class for OpenMP runtime code generation.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H
14 #define LLVM_CLANG_LIB_CODEGEN_CGOPENMPRUNTIME_H
15 
16 #include "CGValue.h"
17 #include "clang/AST/DeclOpenMP.h"
18 #include "clang/AST/GlobalDecl.h"
19 #include "clang/AST/Type.h"
20 #include "clang/Basic/OpenMPKinds.h"
21 #include "clang/Basic/SourceLocation.h"
22 #include "llvm/ADT/DenseMap.h"
23 #include "llvm/ADT/PointerIntPair.h"
24 #include "llvm/ADT/SmallPtrSet.h"
25 #include "llvm/ADT/StringMap.h"
26 #include "llvm/ADT/StringSet.h"
27 #include "llvm/Frontend/OpenMP/OMPConstants.h"
28 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
29 #include "llvm/IR/Function.h"
30 #include "llvm/IR/ValueHandle.h"
31 #include "llvm/Support/AtomicOrdering.h"
32 
33 namespace llvm {
34 class ArrayType;
35 class Constant;
36 class FunctionType;
37 class GlobalVariable;
38 class Type;
39 class Value;
40 class OpenMPIRBuilder;
41 } // namespace llvm
42 
43 namespace clang {
44 class Expr;
45 class OMPDependClause;
46 class OMPExecutableDirective;
47 class OMPLoopDirective;
48 class VarDecl;
49 class OMPDeclareReductionDecl;
50 
51 namespace CodeGen {
52 class Address;
53 class CodeGenFunction;
54 class CodeGenModule;
55 
56 /// A basic class for pre|post-action for advanced codegen sequence for OpenMP
57 /// region.
58 class PrePostActionTy {
59 public:
60   explicit PrePostActionTy() {}
61   virtual void Enter(CodeGenFunction &CGF) {}
62   virtual void Exit(CodeGenFunction &CGF) {}
63   virtual ~PrePostActionTy() {}
64 };
65 
66 /// Class provides a way to call simple version of codegen for OpenMP region, or
67 /// an advanced with possible pre|post-actions in codegen.
68 class RegionCodeGenTy final {
69   intptr_t CodeGen;
70   typedef void (*CodeGenTy)(intptr_t, CodeGenFunction &, PrePostActionTy &);
71   CodeGenTy Callback;
72   mutable PrePostActionTy *PrePostAction;
73   RegionCodeGenTy() = delete;
74   template <typename Callable>
75   static void CallbackFn(intptr_t CodeGen, CodeGenFunction &CGF,
76                          PrePostActionTy &Action) {
77     return (*reinterpret_cast<Callable *>(CodeGen))(CGF, Action);
78   }
79 
80 public:
81   template <typename Callable>
82   RegionCodeGenTy(
83       Callable &&CodeGen,
84       std::enable_if_t<!std::is_same<std::remove_reference_t<Callable>,
85                                      RegionCodeGenTy>::value> * = nullptr)
86       : CodeGen(reinterpret_cast<intptr_t>(&CodeGen)),
87         Callback(CallbackFn<std::remove_reference_t<Callable>>),
88         PrePostAction(nullptr) {}
89   void setAction(PrePostActionTy &Action) const { PrePostAction = &Action; }
90   void operator()(CodeGenFunction &CGF) const;
91 };
92 
93 struct OMPTaskDataTy final {
94   SmallVector<const Expr *, 4> PrivateVars;
95   SmallVector<const Expr *, 4> PrivateCopies;
96   SmallVector<const Expr *, 4> FirstprivateVars;
97   SmallVector<const Expr *, 4> FirstprivateCopies;
98   SmallVector<const Expr *, 4> FirstprivateInits;
99   SmallVector<const Expr *, 4> LastprivateVars;
100   SmallVector<const Expr *, 4> LastprivateCopies;
101   SmallVector<const Expr *, 4> ReductionVars;
102   SmallVector<const Expr *, 4> ReductionOrigs;
103   SmallVector<const Expr *, 4> ReductionCopies;
104   SmallVector<const Expr *, 4> ReductionOps;
105   SmallVector<CanonicalDeclPtr<const VarDecl>, 4> PrivateLocals;
106   struct DependData {
107     OpenMPDependClauseKind DepKind = OMPC_DEPEND_unknown;
108     const Expr *IteratorExpr = nullptr;
109     SmallVector<const Expr *, 4> DepExprs;
110     explicit DependData() = default;
111     DependData(OpenMPDependClauseKind DepKind, const Expr *IteratorExpr)
112         : DepKind(DepKind), IteratorExpr(IteratorExpr) {}
113   };
114   SmallVector<DependData, 4> Dependences;
115   llvm::PointerIntPair<llvm::Value *, 1, bool> Final;
116   llvm::PointerIntPair<llvm::Value *, 1, bool> Schedule;
117   llvm::PointerIntPair<llvm::Value *, 1, bool> Priority;
118   llvm::Value *Reductions = nullptr;
119   unsigned NumberOfParts = 0;
120   bool Tied = true;
121   bool Nogroup = false;
122   bool IsReductionWithTaskMod = false;
123   bool IsWorksharingReduction = false;
124   bool HasNowaitClause = false;
125 };
126 
127 /// Class intended to support codegen of all kind of the reduction clauses.
128 class ReductionCodeGen {
129 private:
130   /// Data required for codegen of reduction clauses.
131   struct ReductionData {
132     /// Reference to the item shared between tasks to reduce into.
133     const Expr *Shared = nullptr;
134     /// Reference to the original item.
135     const Expr *Ref = nullptr;
136     /// Helper expression for generation of private copy.
137     const Expr *Private = nullptr;
138     /// Helper expression for generation reduction operation.
139     const Expr *ReductionOp = nullptr;
140     ReductionData(const Expr *Shared, const Expr *Ref, const Expr *Private,
141                   const Expr *ReductionOp)
142         : Shared(Shared), Ref(Ref), Private(Private), ReductionOp(ReductionOp) {
143     }
144   };
145   /// List of reduction-based clauses.
146   SmallVector<ReductionData, 4> ClausesData;
147 
148   /// List of addresses of shared variables/expressions.
149   SmallVector<std::pair<LValue, LValue>, 4> SharedAddresses;
150   /// List of addresses of original variables/expressions.
151   SmallVector<std::pair<LValue, LValue>, 4> OrigAddresses;
152   /// Sizes of the reduction items in chars.
153   SmallVector<std::pair<llvm::Value *, llvm::Value *>, 4> Sizes;
154   /// Base declarations for the reduction items.
155   SmallVector<const VarDecl *, 4> BaseDecls;
156 
157   /// Emits lvalue for shared expression.
158   LValue emitSharedLValue(CodeGenFunction &CGF, const Expr *E);
159   /// Emits upper bound for shared expression (if array section).
160   LValue emitSharedLValueUB(CodeGenFunction &CGF, const Expr *E);
161   /// Performs aggregate initialization.
162   /// \param N Number of reduction item in the common list.
163   /// \param PrivateAddr Address of the corresponding private item.
164   /// \param SharedAddr Address of the original shared variable.
165   /// \param DRD Declare reduction construct used for reduction item.
166   void emitAggregateInitialization(CodeGenFunction &CGF, unsigned N,
167                                    Address PrivateAddr, Address SharedAddr,
168                                    const OMPDeclareReductionDecl *DRD);
169 
170 public:
171   ReductionCodeGen(ArrayRef<const Expr *> Shareds, ArrayRef<const Expr *> Origs,
172                    ArrayRef<const Expr *> Privates,
173                    ArrayRef<const Expr *> ReductionOps);
174   /// Emits lvalue for the shared and original reduction item.
175   /// \param N Number of the reduction item.
176   void emitSharedOrigLValue(CodeGenFunction &CGF, unsigned N);
177   /// Emits the code for the variable-modified type, if required.
178   /// \param N Number of the reduction item.
179   void emitAggregateType(CodeGenFunction &CGF, unsigned N);
180   /// Emits the code for the variable-modified type, if required.
181   /// \param N Number of the reduction item.
182   /// \param Size Size of the type in chars.
183   void emitAggregateType(CodeGenFunction &CGF, unsigned N, llvm::Value *Size);
184   /// Performs initialization of the private copy for the reduction item.
185   /// \param N Number of the reduction item.
186   /// \param PrivateAddr Address of the corresponding private item.
187   /// \param DefaultInit Default initialization sequence that should be
188   /// performed if no reduction specific initialization is found.
189   /// \param SharedAddr Address of the original shared variable.
190   void
191   emitInitialization(CodeGenFunction &CGF, unsigned N, Address PrivateAddr,
192                      Address SharedAddr,
193                      llvm::function_ref<bool(CodeGenFunction &)> DefaultInit);
194   /// Returns true if the private copy requires cleanups.
195   bool needCleanups(unsigned N);
196   /// Emits cleanup code for the reduction item.
197   /// \param N Number of the reduction item.
198   /// \param PrivateAddr Address of the corresponding private item.
199   void emitCleanups(CodeGenFunction &CGF, unsigned N, Address PrivateAddr);
200   /// Adjusts \p PrivatedAddr for using instead of the original variable
201   /// address in normal operations.
202   /// \param N Number of the reduction item.
203   /// \param PrivateAddr Address of the corresponding private item.
204   Address adjustPrivateAddress(CodeGenFunction &CGF, unsigned N,
205                                Address PrivateAddr);
206   /// Returns LValue for the reduction item.
207   LValue getSharedLValue(unsigned N) const { return SharedAddresses[N].first; }
208   /// Returns LValue for the original reduction item.
209   LValue getOrigLValue(unsigned N) const { return OrigAddresses[N].first; }
210   /// Returns the size of the reduction item (in chars and total number of
211   /// elements in the item), or nullptr, if the size is a constant.
212   std::pair<llvm::Value *, llvm::Value *> getSizes(unsigned N) const {
213     return Sizes[N];
214   }
215   /// Returns the base declaration of the reduction item.
216   const VarDecl *getBaseDecl(unsigned N) const { return BaseDecls[N]; }
217   /// Returns the base declaration of the reduction item.
218   const Expr *getRefExpr(unsigned N) const { return ClausesData[N].Ref; }
219   /// Returns true if the initialization of the reduction item uses initializer
220   /// from declare reduction construct.
221   bool usesReductionInitializer(unsigned N) const;
222   /// Return the type of the private item.
223   QualType getPrivateType(unsigned N) const {
224     return cast<VarDecl>(cast<DeclRefExpr>(ClausesData[N].Private)->getDecl())
225         ->getType();
226   }
227 };
228 
229 class CGOpenMPRuntime {
230 public:
231   /// Allows to disable automatic handling of functions used in target regions
232   /// as those marked as `omp declare target`.
233   class DisableAutoDeclareTargetRAII {
234     CodeGenModule &CGM;
235     bool SavedShouldMarkAsGlobal = false;
236 
237   public:
238     DisableAutoDeclareTargetRAII(CodeGenModule &CGM);
239     ~DisableAutoDeclareTargetRAII();
240   };
241 
242   /// Manages list of nontemporal decls for the specified directive.
243   class NontemporalDeclsRAII {
244     CodeGenModule &CGM;
245     const bool NeedToPush;
246 
247   public:
248     NontemporalDeclsRAII(CodeGenModule &CGM, const OMPLoopDirective &S);
249     ~NontemporalDeclsRAII();
250   };
251 
252   /// Manages list of nontemporal decls for the specified directive.
253   class UntiedTaskLocalDeclsRAII {
254     CodeGenModule &CGM;
255     const bool NeedToPush;
256 
257   public:
258     UntiedTaskLocalDeclsRAII(
259         CodeGenFunction &CGF,
260         const llvm::MapVector<CanonicalDeclPtr<const VarDecl>,
261                               std::pair<Address, Address>> &LocalVars);
262     ~UntiedTaskLocalDeclsRAII();
263   };
264 
265   /// Maps the expression for the lastprivate variable to the global copy used
266   /// to store new value because original variables are not mapped in inner
267   /// parallel regions. Only private copies are captured but we need also to
268   /// store private copy in shared address.
269   /// Also, stores the expression for the private loop counter and it
270   /// threaprivate name.
271   struct LastprivateConditionalData {
272     llvm::MapVector<CanonicalDeclPtr<const Decl>, SmallString<16>>
273         DeclToUniqueName;
274     LValue IVLVal;
275     llvm::Function *Fn = nullptr;
276     bool Disabled = false;
277   };
278   /// Manages list of lastprivate conditional decls for the specified directive.
279   class LastprivateConditionalRAII {
280     enum class ActionToDo {
281       DoNotPush,
282       PushAsLastprivateConditional,
283       DisableLastprivateConditional,
284     };
285     CodeGenModule &CGM;
286     ActionToDo Action = ActionToDo::DoNotPush;
287 
288     /// Check and try to disable analysis of inner regions for changes in
289     /// lastprivate conditional.
290     void tryToDisableInnerAnalysis(const OMPExecutableDirective &S,
291                                    llvm::DenseSet<CanonicalDeclPtr<const Decl>>
292                                        &NeedToAddForLPCsAsDisabled) const;
293 
294     LastprivateConditionalRAII(CodeGenFunction &CGF,
295                                const OMPExecutableDirective &S);
296 
297   public:
298     explicit LastprivateConditionalRAII(CodeGenFunction &CGF,
299                                         const OMPExecutableDirective &S,
300                                         LValue IVLVal);
301     static LastprivateConditionalRAII disable(CodeGenFunction &CGF,
302                                               const OMPExecutableDirective &S);
303     ~LastprivateConditionalRAII();
304   };
305 
306   llvm::OpenMPIRBuilder &getOMPBuilder() { return OMPBuilder; }
307 
308 protected:
309   CodeGenModule &CGM;
310 
311   /// An OpenMP-IR-Builder instance.
312   llvm::OpenMPIRBuilder OMPBuilder;
313 
314   /// Helper to emit outlined function for 'target' directive.
315   /// \param D Directive to emit.
316   /// \param ParentName Name of the function that encloses the target region.
317   /// \param OutlinedFn Outlined function value to be defined by this call.
318   /// \param OutlinedFnID Outlined function ID value to be defined by this call.
319   /// \param IsOffloadEntry True if the outlined function is an offload entry.
320   /// \param CodeGen Lambda codegen specific to an accelerator device.
321   /// An outlined function may not be an entry if, e.g. the if clause always
322   /// evaluates to false.
323   virtual void emitTargetOutlinedFunctionHelper(const OMPExecutableDirective &D,
324                                                 StringRef ParentName,
325                                                 llvm::Function *&OutlinedFn,
326                                                 llvm::Constant *&OutlinedFnID,
327                                                 bool IsOffloadEntry,
328                                                 const RegionCodeGenTy &CodeGen);
329 
330   /// Returns pointer to ident_t type.
331   llvm::Type *getIdentTyPointerTy();
332 
333   /// Gets thread id value for the current thread.
334   ///
335   llvm::Value *getThreadID(CodeGenFunction &CGF, SourceLocation Loc);
336 
337   /// Get the function name of an outlined region.
338   std::string getOutlinedHelperName(StringRef Name) const;
339   std::string getOutlinedHelperName(CodeGenFunction &CGF) const;
340 
341   /// Get the function name of a reduction function.
342   std::string getReductionFuncName(StringRef Name) const;
343 
344   /// Emits \p Callee function call with arguments \p Args with location \p Loc.
345   void emitCall(CodeGenFunction &CGF, SourceLocation Loc,
346                 llvm::FunctionCallee Callee,
347                 ArrayRef<llvm::Value *> Args = std::nullopt) const;
348 
349   /// Emits address of the word in a memory where current thread id is
350   /// stored.
351   virtual Address emitThreadIDAddress(CodeGenFunction &CGF, SourceLocation Loc);
352 
353   void setLocThreadIdInsertPt(CodeGenFunction &CGF,
354                               bool AtCurrentPoint = false);
355   void clearLocThreadIdInsertPt(CodeGenFunction &CGF);
356 
357   /// Check if the default location must be constant.
358   /// Default is false to support OMPT/OMPD.
359   virtual bool isDefaultLocationConstant() const { return false; }
360 
361   /// Returns additional flags that can be stored in reserved_2 field of the
362   /// default location.
363   virtual unsigned getDefaultLocationReserved2Flags() const { return 0; }
364 
365   /// Returns default flags for the barriers depending on the directive, for
366   /// which this barier is going to be emitted.
367   static unsigned getDefaultFlagsForBarriers(OpenMPDirectiveKind Kind);
368 
369   /// Get the LLVM type for the critical name.
370   llvm::ArrayType *getKmpCriticalNameTy() const {return KmpCriticalNameTy;}
371 
372   /// Returns corresponding lock object for the specified critical region
373   /// name. If the lock object does not exist it is created, otherwise the
374   /// reference to the existing copy is returned.
375   /// \param CriticalName Name of the critical region.
376   ///
377   llvm::Value *getCriticalRegionLock(StringRef CriticalName);
378 
379 protected:
380   /// Map for SourceLocation and OpenMP runtime library debug locations.
381   typedef llvm::DenseMap<SourceLocation, llvm::Value *> OpenMPDebugLocMapTy;
382   OpenMPDebugLocMapTy OpenMPDebugLocMap;
383   /// The type for a microtask which gets passed to __kmpc_fork_call().
384   /// Original representation is:
385   /// typedef void (kmpc_micro)(kmp_int32 global_tid, kmp_int32 bound_tid,...);
386   llvm::FunctionType *Kmpc_MicroTy = nullptr;
387   /// Stores debug location and ThreadID for the function.
388   struct DebugLocThreadIdTy {
389     llvm::Value *DebugLoc;
390     llvm::Value *ThreadID;
391     /// Insert point for the service instructions.
392     llvm::AssertingVH<llvm::Instruction> ServiceInsertPt = nullptr;
393   };
394   /// Map of local debug location, ThreadId and functions.
395   typedef llvm::DenseMap<llvm::Function *, DebugLocThreadIdTy>
396       OpenMPLocThreadIDMapTy;
397   OpenMPLocThreadIDMapTy OpenMPLocThreadIDMap;
398   /// Map of UDRs and corresponding combiner/initializer.
399   typedef llvm::DenseMap<const OMPDeclareReductionDecl *,
400                          std::pair<llvm::Function *, llvm::Function *>>
401       UDRMapTy;
402   UDRMapTy UDRMap;
403   /// Map of functions and locally defined UDRs.
404   typedef llvm::DenseMap<llvm::Function *,
405                          SmallVector<const OMPDeclareReductionDecl *, 4>>
406       FunctionUDRMapTy;
407   FunctionUDRMapTy FunctionUDRMap;
408   /// Map from the user-defined mapper declaration to its corresponding
409   /// functions.
410   llvm::DenseMap<const OMPDeclareMapperDecl *, llvm::Function *> UDMMap;
411   /// Map of functions and their local user-defined mappers.
412   using FunctionUDMMapTy =
413       llvm::DenseMap<llvm::Function *,
414                      SmallVector<const OMPDeclareMapperDecl *, 4>>;
415   FunctionUDMMapTy FunctionUDMMap;
416   /// Maps local variables marked as lastprivate conditional to their internal
417   /// types.
418   llvm::DenseMap<llvm::Function *,
419                  llvm::DenseMap<CanonicalDeclPtr<const Decl>,
420                                 std::tuple<QualType, const FieldDecl *,
421                                            const FieldDecl *, LValue>>>
422       LastprivateConditionalToTypes;
423   /// Maps function to the position of the untied task locals stack.
424   llvm::DenseMap<llvm::Function *, unsigned> FunctionToUntiedTaskStackMap;
425   /// Type kmp_critical_name, originally defined as typedef kmp_int32
426   /// kmp_critical_name[8];
427   llvm::ArrayType *KmpCriticalNameTy;
428   /// An ordered map of auto-generated variables to their unique names.
429   /// It stores variables with the following names: 1) ".gomp_critical_user_" +
430   /// <critical_section_name> + ".var" for "omp critical" directives; 2)
431   /// <mangled_name_for_global_var> + ".cache." for cache for threadprivate
432   /// variables.
433   llvm::StringMap<llvm::AssertingVH<llvm::GlobalVariable>,
434                   llvm::BumpPtrAllocator> InternalVars;
435   /// Type typedef kmp_int32 (* kmp_routine_entry_t)(kmp_int32, void *);
436   llvm::Type *KmpRoutineEntryPtrTy = nullptr;
437   QualType KmpRoutineEntryPtrQTy;
438   /// Type typedef struct kmp_task {
439   ///    void *              shareds; /**< pointer to block of pointers to
440   ///    shared vars   */
441   ///    kmp_routine_entry_t routine; /**< pointer to routine to call for
442   ///    executing task */
443   ///    kmp_int32           part_id; /**< part id for the task */
444   ///    kmp_routine_entry_t destructors; /* pointer to function to invoke
445   ///    deconstructors of firstprivate C++ objects */
446   /// } kmp_task_t;
447   QualType KmpTaskTQTy;
448   /// Saved kmp_task_t for task directive.
449   QualType SavedKmpTaskTQTy;
450   /// Saved kmp_task_t for taskloop-based directive.
451   QualType SavedKmpTaskloopTQTy;
452   /// Type typedef struct kmp_depend_info {
453   ///    kmp_intptr_t               base_addr;
454   ///    size_t                     len;
455   ///    struct {
456   ///             bool                   in:1;
457   ///             bool                   out:1;
458   ///    } flags;
459   /// } kmp_depend_info_t;
460   QualType KmpDependInfoTy;
461   /// Type typedef struct kmp_task_affinity_info {
462   ///    kmp_intptr_t base_addr;
463   ///    size_t len;
464   ///    struct {
465   ///      bool flag1 : 1;
466   ///      bool flag2 : 1;
467   ///      kmp_int32 reserved : 30;
468   ///   } flags;
469   /// } kmp_task_affinity_info_t;
470   QualType KmpTaskAffinityInfoTy;
471   /// struct kmp_dim {  // loop bounds info casted to kmp_int64
472   ///  kmp_int64 lo; // lower
473   ///  kmp_int64 up; // upper
474   ///  kmp_int64 st; // stride
475   /// };
476   QualType KmpDimTy;
477 
478   bool ShouldMarkAsGlobal = true;
479   /// List of the emitted declarations.
480   llvm::DenseSet<CanonicalDeclPtr<const Decl>> AlreadyEmittedTargetDecls;
481   /// List of the global variables with their addresses that should not be
482   /// emitted for the target.
483   llvm::StringMap<llvm::WeakTrackingVH> EmittedNonTargetVariables;
484 
485   /// List of variables that can become declare target implicitly and, thus,
486   /// must be emitted.
487   llvm::SmallDenseSet<const VarDecl *> DeferredGlobalVariables;
488 
489   using NontemporalDeclsSet = llvm::SmallDenseSet<CanonicalDeclPtr<const Decl>>;
490   /// Stack for list of declarations in current context marked as nontemporal.
491   /// The set is the union of all current stack elements.
492   llvm::SmallVector<NontemporalDeclsSet, 4> NontemporalDeclsStack;
493 
494   using UntiedLocalVarsAddressesMap =
495       llvm::MapVector<CanonicalDeclPtr<const VarDecl>,
496                       std::pair<Address, Address>>;
497   llvm::SmallVector<UntiedLocalVarsAddressesMap, 4> UntiedLocalVarsStack;
498 
499   /// Stack for list of addresses of declarations in current context marked as
500   /// lastprivate conditional. The set is the union of all current stack
501   /// elements.
502   llvm::SmallVector<LastprivateConditionalData, 4> LastprivateConditionalStack;
503 
504   /// Flag for keeping track of weather a requires unified_shared_memory
505   /// directive is present.
506   bool HasRequiresUnifiedSharedMemory = false;
507 
508   /// Atomic ordering from the omp requires directive.
509   llvm::AtomicOrdering RequiresAtomicOrdering = llvm::AtomicOrdering::Monotonic;
510 
511   /// Flag for keeping track of weather a target region has been emitted.
512   bool HasEmittedTargetRegion = false;
513 
514   /// Flag for keeping track of weather a device routine has been emitted.
515   /// Device routines are specific to the
516   bool HasEmittedDeclareTargetRegion = false;
517 
518   /// Start scanning from statement \a S and emit all target regions
519   /// found along the way.
520   /// \param S Starting statement.
521   /// \param ParentName Name of the function declaration that is being scanned.
522   void scanForTargetRegionsFunctions(const Stmt *S, StringRef ParentName);
523 
524   /// Build type kmp_routine_entry_t (if not built yet).
525   void emitKmpRoutineEntryT(QualType KmpInt32Ty);
526 
527   /// Returns pointer to kmpc_micro type.
528   llvm::Type *getKmpc_MicroPointerTy();
529 
530   /// Returns __kmpc_for_static_init_* runtime function for the specified
531   /// size \a IVSize and sign \a IVSigned. Will create a distribute call
532   /// __kmpc_distribute_static_init* if \a IsGPUDistribute is set.
533   llvm::FunctionCallee createForStaticInitFunction(unsigned IVSize,
534                                                    bool IVSigned,
535                                                    bool IsGPUDistribute);
536 
537   /// Returns __kmpc_dispatch_init_* runtime function for the specified
538   /// size \a IVSize and sign \a IVSigned.
539   llvm::FunctionCallee createDispatchInitFunction(unsigned IVSize,
540                                                   bool IVSigned);
541 
542   /// Returns __kmpc_dispatch_next_* runtime function for the specified
543   /// size \a IVSize and sign \a IVSigned.
544   llvm::FunctionCallee createDispatchNextFunction(unsigned IVSize,
545                                                   bool IVSigned);
546 
547   /// Returns __kmpc_dispatch_fini_* runtime function for the specified
548   /// size \a IVSize and sign \a IVSigned.
549   llvm::FunctionCallee createDispatchFiniFunction(unsigned IVSize,
550                                                   bool IVSigned);
551 
552   /// If the specified mangled name is not in the module, create and
553   /// return threadprivate cache object. This object is a pointer's worth of
554   /// storage that's reserved for use by the OpenMP runtime.
555   /// \param VD Threadprivate variable.
556   /// \return Cache variable for the specified threadprivate.
557   llvm::Constant *getOrCreateThreadPrivateCache(const VarDecl *VD);
558 
559   /// Set of threadprivate variables with the generated initializer.
560   llvm::StringSet<> ThreadPrivateWithDefinition;
561 
562   /// Set of declare target variables with the generated initializer.
563   llvm::StringSet<> DeclareTargetWithDefinition;
564 
565   /// Emits initialization code for the threadprivate variables.
566   /// \param VDAddr Address of the global variable \a VD.
567   /// \param Ctor Pointer to a global init function for \a VD.
568   /// \param CopyCtor Pointer to a global copy function for \a VD.
569   /// \param Dtor Pointer to a global destructor function for \a VD.
570   /// \param Loc Location of threadprivate declaration.
571   void emitThreadPrivateVarInit(CodeGenFunction &CGF, Address VDAddr,
572                                 llvm::Value *Ctor, llvm::Value *CopyCtor,
573                                 llvm::Value *Dtor, SourceLocation Loc);
574 
575   /// Emit the array initialization or deletion portion for user-defined mapper
576   /// code generation.
577   void emitUDMapperArrayInitOrDel(CodeGenFunction &MapperCGF,
578                                   llvm::Value *Handle, llvm::Value *BasePtr,
579                                   llvm::Value *Ptr, llvm::Value *Size,
580                                   llvm::Value *MapType, llvm::Value *MapName,
581                                   CharUnits ElementSize,
582                                   llvm::BasicBlock *ExitBB, bool IsInit);
583 
584   struct TaskResultTy {
585     llvm::Value *NewTask = nullptr;
586     llvm::Function *TaskEntry = nullptr;
587     llvm::Value *NewTaskNewTaskTTy = nullptr;
588     LValue TDBase;
589     const RecordDecl *KmpTaskTQTyRD = nullptr;
590     llvm::Value *TaskDupFn = nullptr;
591   };
592   /// Emit task region for the task directive. The task region is emitted in
593   /// several steps:
594   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
595   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
596   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
597   /// function:
598   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
599   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
600   ///   return 0;
601   /// }
602   /// 2. Copy a list of shared variables to field shareds of the resulting
603   /// structure kmp_task_t returned by the previous call (if any).
604   /// 3. Copy a pointer to destructions function to field destructions of the
605   /// resulting structure kmp_task_t.
606   /// \param D Current task directive.
607   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
608   /// /*part_id*/, captured_struct */*__context*/);
609   /// \param SharedsTy A type which contains references the shared variables.
610   /// \param Shareds Context with the list of shared variables from the \p
611   /// TaskFunction.
612   /// \param Data Additional data for task generation like tiednsee, final
613   /// state, list of privates etc.
614   TaskResultTy emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc,
615                             const OMPExecutableDirective &D,
616                             llvm::Function *TaskFunction, QualType SharedsTy,
617                             Address Shareds, const OMPTaskDataTy &Data);
618 
619   /// Emit update for lastprivate conditional data.
620   void emitLastprivateConditionalUpdate(CodeGenFunction &CGF, LValue IVLVal,
621                                         StringRef UniqueDeclName, LValue LVal,
622                                         SourceLocation Loc);
623 
624   /// Returns the number of the elements and the address of the depobj
625   /// dependency array.
626   /// \return Number of elements in depobj array and the pointer to the array of
627   /// dependencies.
628   std::pair<llvm::Value *, LValue> getDepobjElements(CodeGenFunction &CGF,
629                                                      LValue DepobjLVal,
630                                                      SourceLocation Loc);
631 
632   SmallVector<llvm::Value *, 4>
633   emitDepobjElementsSizes(CodeGenFunction &CGF, QualType &KmpDependInfoTy,
634                           const OMPTaskDataTy::DependData &Data);
635 
636   void emitDepobjElements(CodeGenFunction &CGF, QualType &KmpDependInfoTy,
637                           LValue PosLVal, const OMPTaskDataTy::DependData &Data,
638                           Address DependenciesArray);
639 
640 public:
641   explicit CGOpenMPRuntime(CodeGenModule &CGM);
642   virtual ~CGOpenMPRuntime() {}
643   virtual void clear();
644 
645   /// Emits object of ident_t type with info for source location.
646   /// \param Flags Flags for OpenMP location.
647   /// \param EmitLoc emit source location with debug-info is off.
648   ///
649   llvm::Value *emitUpdateLocation(CodeGenFunction &CGF, SourceLocation Loc,
650                                   unsigned Flags = 0, bool EmitLoc = false);
651 
652   /// Emit the number of teams for a target directive.  Inspect the num_teams
653   /// clause associated with a teams construct combined or closely nested
654   /// with the target directive.
655   ///
656   /// Emit a team of size one for directives such as 'target parallel' that
657   /// have no associated teams construct.
658   ///
659   /// Otherwise, return nullptr.
660   const Expr *getNumTeamsExprForTargetDirective(CodeGenFunction &CGF,
661                                                 const OMPExecutableDirective &D,
662                                                 int32_t &DefaultVal);
663   llvm::Value *emitNumTeamsForTargetDirective(CodeGenFunction &CGF,
664                                               const OMPExecutableDirective &D);
665   /// Emit the number of threads for a target directive.  Inspect the
666   /// thread_limit clause associated with a teams construct combined or closely
667   /// nested with the target directive.
668   ///
669   /// Emit the num_threads clause for directives such as 'target parallel' that
670   /// have no associated teams construct.
671   ///
672   /// Otherwise, return nullptr.
673   const Expr *
674   getNumThreadsExprForTargetDirective(CodeGenFunction &CGF,
675                                       const OMPExecutableDirective &D,
676                                       int32_t &DefaultVal);
677   llvm::Value *
678   emitNumThreadsForTargetDirective(CodeGenFunction &CGF,
679                                    const OMPExecutableDirective &D);
680 
681   /// Return the trip count of loops associated with constructs / 'target teams
682   /// distribute' and 'teams distribute parallel for'. \param SizeEmitter Emits
683   /// the int64 value for the number of iterations of the associated loop.
684   llvm::Value *emitTargetNumIterationsCall(
685       CodeGenFunction &CGF, const OMPExecutableDirective &D,
686       llvm::function_ref<llvm::Value *(CodeGenFunction &CGF,
687                                        const OMPLoopDirective &D)>
688           SizeEmitter);
689 
690   /// Returns true if the current target is a GPU.
691   virtual bool isGPU() const { return false; }
692 
693   /// Check if the variable length declaration is delayed:
694   virtual bool isDelayedVariableLengthDecl(CodeGenFunction &CGF,
695                                            const VarDecl *VD) const {
696     return false;
697   };
698 
699   /// Get call to __kmpc_alloc_shared
700   virtual std::pair<llvm::Value *, llvm::Value *>
701   getKmpcAllocShared(CodeGenFunction &CGF, const VarDecl *VD) {
702     llvm_unreachable("not implemented");
703   }
704 
705   /// Get call to __kmpc_free_shared
706   virtual void getKmpcFreeShared(
707       CodeGenFunction &CGF,
708       const std::pair<llvm::Value *, llvm::Value *> &AddrSizePair) {
709     llvm_unreachable("not implemented");
710   }
711 
712   /// Emits code for OpenMP 'if' clause using specified \a CodeGen
713   /// function. Here is the logic:
714   /// if (Cond) {
715   ///   ThenGen();
716   /// } else {
717   ///   ElseGen();
718   /// }
719   void emitIfClause(CodeGenFunction &CGF, const Expr *Cond,
720                     const RegionCodeGenTy &ThenGen,
721                     const RegionCodeGenTy &ElseGen);
722 
723   /// Checks if the \p Body is the \a CompoundStmt and returns its child
724   /// statement iff there is only one that is not evaluatable at the compile
725   /// time.
726   static const Stmt *getSingleCompoundChild(ASTContext &Ctx, const Stmt *Body);
727 
728   /// Get the platform-specific name separator.
729   std::string getName(ArrayRef<StringRef> Parts) const;
730 
731   /// Emit code for the specified user defined reduction construct.
732   virtual void emitUserDefinedReduction(CodeGenFunction *CGF,
733                                         const OMPDeclareReductionDecl *D);
734   /// Get combiner/initializer for the specified user-defined reduction, if any.
735   virtual std::pair<llvm::Function *, llvm::Function *>
736   getUserDefinedReduction(const OMPDeclareReductionDecl *D);
737 
738   /// Emit the function for the user defined mapper construct.
739   void emitUserDefinedMapper(const OMPDeclareMapperDecl *D,
740                              CodeGenFunction *CGF = nullptr);
741   /// Get the function for the specified user-defined mapper. If it does not
742   /// exist, create one.
743   llvm::Function *
744   getOrCreateUserDefinedMapperFunc(const OMPDeclareMapperDecl *D);
745 
746   /// Emits outlined function for the specified OpenMP parallel directive
747   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
748   /// kmp_int32 BoundID, struct context_vars*).
749   /// \param CGF Reference to current CodeGenFunction.
750   /// \param D OpenMP directive.
751   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
752   /// \param InnermostKind Kind of innermost directive (for simple directives it
753   /// is a directive itself, for combined - its innermost directive).
754   /// \param CodeGen Code generation sequence for the \a D directive.
755   virtual llvm::Function *emitParallelOutlinedFunction(
756       CodeGenFunction &CGF, const OMPExecutableDirective &D,
757       const VarDecl *ThreadIDVar, OpenMPDirectiveKind InnermostKind,
758       const RegionCodeGenTy &CodeGen);
759 
760   /// Emits outlined function for the specified OpenMP teams directive
761   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
762   /// kmp_int32 BoundID, struct context_vars*).
763   /// \param CGF Reference to current CodeGenFunction.
764   /// \param D OpenMP directive.
765   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
766   /// \param InnermostKind Kind of innermost directive (for simple directives it
767   /// is a directive itself, for combined - its innermost directive).
768   /// \param CodeGen Code generation sequence for the \a D directive.
769   virtual llvm::Function *emitTeamsOutlinedFunction(
770       CodeGenFunction &CGF, const OMPExecutableDirective &D,
771       const VarDecl *ThreadIDVar, OpenMPDirectiveKind InnermostKind,
772       const RegionCodeGenTy &CodeGen);
773 
774   /// Emits outlined function for the OpenMP task directive \a D. This
775   /// outlined function has type void(*)(kmp_int32 ThreadID, struct task_t*
776   /// TaskT).
777   /// \param D OpenMP directive.
778   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
779   /// \param PartIDVar Variable for partition id in the current OpenMP untied
780   /// task region.
781   /// \param TaskTVar Variable for task_t argument.
782   /// \param InnermostKind Kind of innermost directive (for simple directives it
783   /// is a directive itself, for combined - its innermost directive).
784   /// \param CodeGen Code generation sequence for the \a D directive.
785   /// \param Tied true if task is generated for tied task, false otherwise.
786   /// \param NumberOfParts Number of parts in untied task. Ignored for tied
787   /// tasks.
788   ///
789   virtual llvm::Function *emitTaskOutlinedFunction(
790       const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
791       const VarDecl *PartIDVar, const VarDecl *TaskTVar,
792       OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen,
793       bool Tied, unsigned &NumberOfParts);
794 
795   /// Cleans up references to the objects in finished function.
796   ///
797   virtual void functionFinished(CodeGenFunction &CGF);
798 
799   /// Emits code for parallel or serial call of the \a OutlinedFn with
800   /// variables captured in a record which address is stored in \a
801   /// CapturedStruct.
802   /// \param OutlinedFn Outlined function to be run in parallel threads. Type of
803   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
804   /// \param CapturedVars A pointer to the record with the references to
805   /// variables used in \a OutlinedFn function.
806   /// \param IfCond Condition in the associated 'if' clause, if it was
807   /// specified, nullptr otherwise.
808   /// \param NumThreads The value corresponding to the num_threads clause, if
809   /// any, or nullptr.
810   ///
811   virtual void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
812                                 llvm::Function *OutlinedFn,
813                                 ArrayRef<llvm::Value *> CapturedVars,
814                                 const Expr *IfCond, llvm::Value *NumThreads);
815 
816   /// Emits a critical region.
817   /// \param CriticalName Name of the critical region.
818   /// \param CriticalOpGen Generator for the statement associated with the given
819   /// critical region.
820   /// \param Hint Value of the 'hint' clause (optional).
821   virtual void emitCriticalRegion(CodeGenFunction &CGF, StringRef CriticalName,
822                                   const RegionCodeGenTy &CriticalOpGen,
823                                   SourceLocation Loc,
824                                   const Expr *Hint = nullptr);
825 
826   /// Emits a master region.
827   /// \param MasterOpGen Generator for the statement associated with the given
828   /// master region.
829   virtual void emitMasterRegion(CodeGenFunction &CGF,
830                                 const RegionCodeGenTy &MasterOpGen,
831                                 SourceLocation Loc);
832 
833   /// Emits a masked region.
834   /// \param MaskedOpGen Generator for the statement associated with the given
835   /// masked region.
836   virtual void emitMaskedRegion(CodeGenFunction &CGF,
837                                 const RegionCodeGenTy &MaskedOpGen,
838                                 SourceLocation Loc,
839                                 const Expr *Filter = nullptr);
840 
841   /// Emits code for a taskyield directive.
842   virtual void emitTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc);
843 
844   /// Emit __kmpc_error call for error directive
845   /// extern void __kmpc_error(ident_t *loc, int severity, const char *message);
846   virtual void emitErrorCall(CodeGenFunction &CGF, SourceLocation Loc, Expr *ME,
847                              bool IsFatal);
848 
849   /// Emit a taskgroup region.
850   /// \param TaskgroupOpGen Generator for the statement associated with the
851   /// given taskgroup region.
852   virtual void emitTaskgroupRegion(CodeGenFunction &CGF,
853                                    const RegionCodeGenTy &TaskgroupOpGen,
854                                    SourceLocation Loc);
855 
856   /// Emits a single region.
857   /// \param SingleOpGen Generator for the statement associated with the given
858   /// single region.
859   virtual void emitSingleRegion(CodeGenFunction &CGF,
860                                 const RegionCodeGenTy &SingleOpGen,
861                                 SourceLocation Loc,
862                                 ArrayRef<const Expr *> CopyprivateVars,
863                                 ArrayRef<const Expr *> DestExprs,
864                                 ArrayRef<const Expr *> SrcExprs,
865                                 ArrayRef<const Expr *> AssignmentOps);
866 
867   /// Emit an ordered region.
868   /// \param OrderedOpGen Generator for the statement associated with the given
869   /// ordered region.
870   virtual void emitOrderedRegion(CodeGenFunction &CGF,
871                                  const RegionCodeGenTy &OrderedOpGen,
872                                  SourceLocation Loc, bool IsThreads);
873 
874   /// Emit an implicit/explicit barrier for OpenMP threads.
875   /// \param Kind Directive for which this implicit barrier call must be
876   /// generated. Must be OMPD_barrier for explicit barrier generation.
877   /// \param EmitChecks true if need to emit checks for cancellation barriers.
878   /// \param ForceSimpleCall true simple barrier call must be emitted, false if
879   /// runtime class decides which one to emit (simple or with cancellation
880   /// checks).
881   ///
882   virtual void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
883                                OpenMPDirectiveKind Kind,
884                                bool EmitChecks = true,
885                                bool ForceSimpleCall = false);
886 
887   /// Check if the specified \a ScheduleKind is static non-chunked.
888   /// This kind of worksharing directive is emitted without outer loop.
889   /// \param ScheduleKind Schedule kind specified in the 'schedule' clause.
890   /// \param Chunked True if chunk is specified in the clause.
891   ///
892   virtual bool isStaticNonchunked(OpenMPScheduleClauseKind ScheduleKind,
893                                   bool Chunked) const;
894 
895   /// Check if the specified \a ScheduleKind is static non-chunked.
896   /// This kind of distribute directive is emitted without outer loop.
897   /// \param ScheduleKind Schedule kind specified in the 'dist_schedule' clause.
898   /// \param Chunked True if chunk is specified in the clause.
899   ///
900   virtual bool isStaticNonchunked(OpenMPDistScheduleClauseKind ScheduleKind,
901                                   bool Chunked) const;
902 
903   /// Check if the specified \a ScheduleKind is static chunked.
904   /// \param ScheduleKind Schedule kind specified in the 'schedule' clause.
905   /// \param Chunked True if chunk is specified in the clause.
906   ///
907   virtual bool isStaticChunked(OpenMPScheduleClauseKind ScheduleKind,
908                                bool Chunked) const;
909 
910   /// Check if the specified \a ScheduleKind is static non-chunked.
911   /// \param ScheduleKind Schedule kind specified in the 'dist_schedule' clause.
912   /// \param Chunked True if chunk is specified in the clause.
913   ///
914   virtual bool isStaticChunked(OpenMPDistScheduleClauseKind ScheduleKind,
915                                bool Chunked) const;
916 
917   /// Check if the specified \a ScheduleKind is dynamic.
918   /// This kind of worksharing directive is emitted without outer loop.
919   /// \param ScheduleKind Schedule Kind specified in the 'schedule' clause.
920   ///
921   virtual bool isDynamic(OpenMPScheduleClauseKind ScheduleKind) const;
922 
923   /// struct with the values to be passed to the dispatch runtime function
924   struct DispatchRTInput {
925     /// Loop lower bound
926     llvm::Value *LB = nullptr;
927     /// Loop upper bound
928     llvm::Value *UB = nullptr;
929     /// Chunk size specified using 'schedule' clause (nullptr if chunk
930     /// was not specified)
931     llvm::Value *Chunk = nullptr;
932     DispatchRTInput() = default;
933     DispatchRTInput(llvm::Value *LB, llvm::Value *UB, llvm::Value *Chunk)
934         : LB(LB), UB(UB), Chunk(Chunk) {}
935   };
936 
937   /// Call the appropriate runtime routine to initialize it before start
938   /// of loop.
939 
940   /// This is used for non static scheduled types and when the ordered
941   /// clause is present on the loop construct.
942   /// Depending on the loop schedule, it is necessary to call some runtime
943   /// routine before start of the OpenMP loop to get the loop upper / lower
944   /// bounds \a LB and \a UB and stride \a ST.
945   ///
946   /// \param CGF Reference to current CodeGenFunction.
947   /// \param Loc Clang source location.
948   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
949   /// \param IVSize Size of the iteration variable in bits.
950   /// \param IVSigned Sign of the iteration variable.
951   /// \param Ordered true if loop is ordered, false otherwise.
952   /// \param DispatchValues struct containing llvm values for lower bound, upper
953   /// bound, and chunk expression.
954   /// For the default (nullptr) value, the chunk 1 will be used.
955   ///
956   virtual void emitForDispatchInit(CodeGenFunction &CGF, SourceLocation Loc,
957                                    const OpenMPScheduleTy &ScheduleKind,
958                                    unsigned IVSize, bool IVSigned, bool Ordered,
959                                    const DispatchRTInput &DispatchValues);
960 
961   /// Struct with the values to be passed to the static runtime function
962   struct StaticRTInput {
963     /// Size of the iteration variable in bits.
964     unsigned IVSize = 0;
965     /// Sign of the iteration variable.
966     bool IVSigned = false;
967     /// true if loop is ordered, false otherwise.
968     bool Ordered = false;
969     /// Address of the output variable in which the flag of the last iteration
970     /// is returned.
971     Address IL = Address::invalid();
972     /// Address of the output variable in which the lower iteration number is
973     /// returned.
974     Address LB = Address::invalid();
975     /// Address of the output variable in which the upper iteration number is
976     /// returned.
977     Address UB = Address::invalid();
978     /// Address of the output variable in which the stride value is returned
979     /// necessary to generated the static_chunked scheduled loop.
980     Address ST = Address::invalid();
981     /// Value of the chunk for the static_chunked scheduled loop. For the
982     /// default (nullptr) value, the chunk 1 will be used.
983     llvm::Value *Chunk = nullptr;
984     StaticRTInput(unsigned IVSize, bool IVSigned, bool Ordered, Address IL,
985                   Address LB, Address UB, Address ST,
986                   llvm::Value *Chunk = nullptr)
987         : IVSize(IVSize), IVSigned(IVSigned), Ordered(Ordered), IL(IL), LB(LB),
988           UB(UB), ST(ST), Chunk(Chunk) {}
989   };
990   /// Call the appropriate runtime routine to initialize it before start
991   /// of loop.
992   ///
993   /// This is used only in case of static schedule, when the user did not
994   /// specify a ordered clause on the loop construct.
995   /// Depending on the loop schedule, it is necessary to call some runtime
996   /// routine before start of the OpenMP loop to get the loop upper / lower
997   /// bounds LB and UB and stride ST.
998   ///
999   /// \param CGF Reference to current CodeGenFunction.
1000   /// \param Loc Clang source location.
1001   /// \param DKind Kind of the directive.
1002   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
1003   /// \param Values Input arguments for the construct.
1004   ///
1005   virtual void emitForStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
1006                                  OpenMPDirectiveKind DKind,
1007                                  const OpenMPScheduleTy &ScheduleKind,
1008                                  const StaticRTInput &Values);
1009 
1010   ///
1011   /// \param CGF Reference to current CodeGenFunction.
1012   /// \param Loc Clang source location.
1013   /// \param SchedKind Schedule kind, specified by the 'dist_schedule' clause.
1014   /// \param Values Input arguments for the construct.
1015   ///
1016   virtual void emitDistributeStaticInit(CodeGenFunction &CGF,
1017                                         SourceLocation Loc,
1018                                         OpenMPDistScheduleClauseKind SchedKind,
1019                                         const StaticRTInput &Values);
1020 
1021   /// Call the appropriate runtime routine to notify that we finished
1022   /// iteration of the ordered loop with the dynamic scheduling.
1023   ///
1024   /// \param CGF Reference to current CodeGenFunction.
1025   /// \param Loc Clang source location.
1026   /// \param IVSize Size of the iteration variable in bits.
1027   /// \param IVSigned Sign of the iteration variable.
1028   ///
1029   virtual void emitForOrderedIterationEnd(CodeGenFunction &CGF,
1030                                           SourceLocation Loc, unsigned IVSize,
1031                                           bool IVSigned);
1032 
1033   /// Call the appropriate runtime routine to notify that we finished
1034   /// all the work with current loop.
1035   ///
1036   /// \param CGF Reference to current CodeGenFunction.
1037   /// \param Loc Clang source location.
1038   /// \param DKind Kind of the directive for which the static finish is emitted.
1039   ///
1040   virtual void emitForStaticFinish(CodeGenFunction &CGF, SourceLocation Loc,
1041                                    OpenMPDirectiveKind DKind);
1042 
1043   /// Call __kmpc_dispatch_next(
1044   ///          ident_t *loc, kmp_int32 tid, kmp_int32 *p_lastiter,
1045   ///          kmp_int[32|64] *p_lower, kmp_int[32|64] *p_upper,
1046   ///          kmp_int[32|64] *p_stride);
1047   /// \param IVSize Size of the iteration variable in bits.
1048   /// \param IVSigned Sign of the iteration variable.
1049   /// \param IL Address of the output variable in which the flag of the
1050   /// last iteration is returned.
1051   /// \param LB Address of the output variable in which the lower iteration
1052   /// number is returned.
1053   /// \param UB Address of the output variable in which the upper iteration
1054   /// number is returned.
1055   /// \param ST Address of the output variable in which the stride value is
1056   /// returned.
1057   virtual llvm::Value *emitForNext(CodeGenFunction &CGF, SourceLocation Loc,
1058                                    unsigned IVSize, bool IVSigned,
1059                                    Address IL, Address LB,
1060                                    Address UB, Address ST);
1061 
1062   /// Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32
1063   /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads'
1064   /// clause.
1065   /// \param NumThreads An integer value of threads.
1066   virtual void emitNumThreadsClause(CodeGenFunction &CGF,
1067                                     llvm::Value *NumThreads,
1068                                     SourceLocation Loc);
1069 
1070   /// Emit call to void __kmpc_push_proc_bind(ident_t *loc, kmp_int32
1071   /// global_tid, int proc_bind) to generate code for 'proc_bind' clause.
1072   virtual void emitProcBindClause(CodeGenFunction &CGF,
1073                                   llvm::omp::ProcBindKind ProcBind,
1074                                   SourceLocation Loc);
1075 
1076   /// Returns address of the threadprivate variable for the current
1077   /// thread.
1078   /// \param VD Threadprivate variable.
1079   /// \param VDAddr Address of the global variable \a VD.
1080   /// \param Loc Location of the reference to threadprivate var.
1081   /// \return Address of the threadprivate variable for the current thread.
1082   virtual Address getAddrOfThreadPrivate(CodeGenFunction &CGF,
1083                                          const VarDecl *VD,
1084                                          Address VDAddr,
1085                                          SourceLocation Loc);
1086 
1087   /// Returns the address of the variable marked as declare target with link
1088   /// clause OR as declare target with to clause and unified memory.
1089   virtual Address getAddrOfDeclareTargetVar(const VarDecl *VD);
1090 
1091   /// Emit a code for initialization of threadprivate variable. It emits
1092   /// a call to runtime library which adds initial value to the newly created
1093   /// threadprivate variable (if it is not constant) and registers destructor
1094   /// for the variable (if any).
1095   /// \param VD Threadprivate variable.
1096   /// \param VDAddr Address of the global variable \a VD.
1097   /// \param Loc Location of threadprivate declaration.
1098   /// \param PerformInit true if initialization expression is not constant.
1099   virtual llvm::Function *
1100   emitThreadPrivateVarDefinition(const VarDecl *VD, Address VDAddr,
1101                                  SourceLocation Loc, bool PerformInit,
1102                                  CodeGenFunction *CGF = nullptr);
1103 
1104   /// Emit a code for initialization of declare target variable.
1105   /// \param VD Declare target variable.
1106   /// \param Addr Address of the global variable \a VD.
1107   /// \param PerformInit true if initialization expression is not constant.
1108   virtual bool emitDeclareTargetVarDefinition(const VarDecl *VD,
1109                                               llvm::GlobalVariable *Addr,
1110                                               bool PerformInit);
1111 
1112   /// Creates artificial threadprivate variable with name \p Name and type \p
1113   /// VarType.
1114   /// \param VarType Type of the artificial threadprivate variable.
1115   /// \param Name Name of the artificial threadprivate variable.
1116   virtual Address getAddrOfArtificialThreadPrivate(CodeGenFunction &CGF,
1117                                                    QualType VarType,
1118                                                    StringRef Name);
1119 
1120   /// Emit flush of the variables specified in 'omp flush' directive.
1121   /// \param Vars List of variables to flush.
1122   virtual void emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars,
1123                          SourceLocation Loc, llvm::AtomicOrdering AO);
1124 
1125   /// Emit task region for the task directive. The task region is
1126   /// emitted in several steps:
1127   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1128   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1129   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1130   /// function:
1131   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1132   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
1133   ///   return 0;
1134   /// }
1135   /// 2. Copy a list of shared variables to field shareds of the resulting
1136   /// structure kmp_task_t returned by the previous call (if any).
1137   /// 3. Copy a pointer to destructions function to field destructions of the
1138   /// resulting structure kmp_task_t.
1139   /// 4. Emit a call to kmp_int32 __kmpc_omp_task(ident_t *, kmp_int32 gtid,
1140   /// kmp_task_t *new_task), where new_task is a resulting structure from
1141   /// previous items.
1142   /// \param D Current task directive.
1143   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
1144   /// /*part_id*/, captured_struct */*__context*/);
1145   /// \param SharedsTy A type which contains references the shared variables.
1146   /// \param Shareds Context with the list of shared variables from the \p
1147   /// TaskFunction.
1148   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
1149   /// otherwise.
1150   /// \param Data Additional data for task generation like tiednsee, final
1151   /// state, list of privates etc.
1152   virtual void emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc,
1153                             const OMPExecutableDirective &D,
1154                             llvm::Function *TaskFunction, QualType SharedsTy,
1155                             Address Shareds, const Expr *IfCond,
1156                             const OMPTaskDataTy &Data);
1157 
1158   /// Emit task region for the taskloop directive. The taskloop region is
1159   /// emitted in several steps:
1160   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1161   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1162   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1163   /// function:
1164   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1165   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
1166   ///   return 0;
1167   /// }
1168   /// 2. Copy a list of shared variables to field shareds of the resulting
1169   /// structure kmp_task_t returned by the previous call (if any).
1170   /// 3. Copy a pointer to destructions function to field destructions of the
1171   /// resulting structure kmp_task_t.
1172   /// 4. Emit a call to void __kmpc_taskloop(ident_t *loc, int gtid, kmp_task_t
1173   /// *task, int if_val, kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, int
1174   /// nogroup, int sched, kmp_uint64 grainsize, void *task_dup ), where new_task
1175   /// is a resulting structure from
1176   /// previous items.
1177   /// \param D Current task directive.
1178   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
1179   /// /*part_id*/, captured_struct */*__context*/);
1180   /// \param SharedsTy A type which contains references the shared variables.
1181   /// \param Shareds Context with the list of shared variables from the \p
1182   /// TaskFunction.
1183   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
1184   /// otherwise.
1185   /// \param Data Additional data for task generation like tiednsee, final
1186   /// state, list of privates etc.
1187   virtual void emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
1188                                 const OMPLoopDirective &D,
1189                                 llvm::Function *TaskFunction,
1190                                 QualType SharedsTy, Address Shareds,
1191                                 const Expr *IfCond, const OMPTaskDataTy &Data);
1192 
1193   /// Emit code for the directive that does not require outlining.
1194   ///
1195   /// \param InnermostKind Kind of innermost directive (for simple directives it
1196   /// is a directive itself, for combined - its innermost directive).
1197   /// \param CodeGen Code generation sequence for the \a D directive.
1198   /// \param HasCancel true if region has inner cancel directive, false
1199   /// otherwise.
1200   virtual void emitInlinedDirective(CodeGenFunction &CGF,
1201                                     OpenMPDirectiveKind InnermostKind,
1202                                     const RegionCodeGenTy &CodeGen,
1203                                     bool HasCancel = false);
1204 
1205   /// Emits reduction function.
1206   /// \param ReducerName Name of the function calling the reduction.
1207   /// \param ArgsElemType Array type containing pointers to reduction variables.
1208   /// \param Privates List of private copies for original reduction arguments.
1209   /// \param LHSExprs List of LHS in \a ReductionOps reduction operations.
1210   /// \param RHSExprs List of RHS in \a ReductionOps reduction operations.
1211   /// \param ReductionOps List of reduction operations in form 'LHS binop RHS'
1212   /// or 'operator binop(LHS, RHS)'.
1213   llvm::Function *emitReductionFunction(
1214       StringRef ReducerName, SourceLocation Loc, llvm::Type *ArgsElemType,
1215       ArrayRef<const Expr *> Privates, ArrayRef<const Expr *> LHSExprs,
1216       ArrayRef<const Expr *> RHSExprs, ArrayRef<const Expr *> ReductionOps);
1217 
1218   /// Emits single reduction combiner
1219   void emitSingleReductionCombiner(CodeGenFunction &CGF,
1220                                    const Expr *ReductionOp,
1221                                    const Expr *PrivateRef,
1222                                    const DeclRefExpr *LHS,
1223                                    const DeclRefExpr *RHS);
1224 
1225   struct ReductionOptionsTy {
1226     bool WithNowait;
1227     bool SimpleReduction;
1228     OpenMPDirectiveKind ReductionKind;
1229   };
1230   /// Emit a code for reduction clause. Next code should be emitted for
1231   /// reduction:
1232   /// \code
1233   ///
1234   /// static kmp_critical_name lock = { 0 };
1235   ///
1236   /// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
1237   ///  ...
1238   ///  *(Type<i>*)lhs[i] = RedOp<i>(*(Type<i>*)lhs[i], *(Type<i>*)rhs[i]);
1239   ///  ...
1240   /// }
1241   ///
1242   /// ...
1243   /// void *RedList[<n>] = {&<RHSExprs>[0], ..., &<RHSExprs>[<n>-1]};
1244   /// switch (__kmpc_reduce{_nowait}(<loc>, <gtid>, <n>, sizeof(RedList),
1245   /// RedList, reduce_func, &<lock>)) {
1246   /// case 1:
1247   ///  ...
1248   ///  <LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]);
1249   ///  ...
1250   /// __kmpc_end_reduce{_nowait}(<loc>, <gtid>, &<lock>);
1251   /// break;
1252   /// case 2:
1253   ///  ...
1254   ///  Atomic(<LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]));
1255   ///  ...
1256   /// break;
1257   /// default:;
1258   /// }
1259   /// \endcode
1260   ///
1261   /// \param Privates List of private copies for original reduction arguments.
1262   /// \param LHSExprs List of LHS in \a ReductionOps reduction operations.
1263   /// \param RHSExprs List of RHS in \a ReductionOps reduction operations.
1264   /// \param ReductionOps List of reduction operations in form 'LHS binop RHS'
1265   /// or 'operator binop(LHS, RHS)'.
1266   /// \param Options List of options for reduction codegen:
1267   ///     WithNowait true if parent directive has also nowait clause, false
1268   ///     otherwise.
1269   ///     SimpleReduction Emit reduction operation only. Used for omp simd
1270   ///     directive on the host.
1271   ///     ReductionKind The kind of reduction to perform.
1272   virtual void emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
1273                              ArrayRef<const Expr *> Privates,
1274                              ArrayRef<const Expr *> LHSExprs,
1275                              ArrayRef<const Expr *> RHSExprs,
1276                              ArrayRef<const Expr *> ReductionOps,
1277                              ReductionOptionsTy Options);
1278 
1279   /// Emit a code for initialization of task reduction clause. Next code
1280   /// should be emitted for reduction:
1281   /// \code
1282   ///
1283   /// _taskred_item_t red_data[n];
1284   /// ...
1285   /// red_data[i].shar = &shareds[i];
1286   /// red_data[i].orig = &origs[i];
1287   /// red_data[i].size = sizeof(origs[i]);
1288   /// red_data[i].f_init = (void*)RedInit<i>;
1289   /// red_data[i].f_fini = (void*)RedDest<i>;
1290   /// red_data[i].f_comb = (void*)RedOp<i>;
1291   /// red_data[i].flags = <Flag_i>;
1292   /// ...
1293   /// void* tg1 = __kmpc_taskred_init(gtid, n, red_data);
1294   /// \endcode
1295   /// For reduction clause with task modifier it emits the next call:
1296   /// \code
1297   ///
1298   /// _taskred_item_t red_data[n];
1299   /// ...
1300   /// red_data[i].shar = &shareds[i];
1301   /// red_data[i].orig = &origs[i];
1302   /// red_data[i].size = sizeof(origs[i]);
1303   /// red_data[i].f_init = (void*)RedInit<i>;
1304   /// red_data[i].f_fini = (void*)RedDest<i>;
1305   /// red_data[i].f_comb = (void*)RedOp<i>;
1306   /// red_data[i].flags = <Flag_i>;
1307   /// ...
1308   /// void* tg1 = __kmpc_taskred_modifier_init(loc, gtid, is_worksharing, n,
1309   /// red_data);
1310   /// \endcode
1311   /// \param LHSExprs List of LHS in \a Data.ReductionOps reduction operations.
1312   /// \param RHSExprs List of RHS in \a Data.ReductionOps reduction operations.
1313   /// \param Data Additional data for task generation like tiedness, final
1314   /// state, list of privates, reductions etc.
1315   virtual llvm::Value *emitTaskReductionInit(CodeGenFunction &CGF,
1316                                              SourceLocation Loc,
1317                                              ArrayRef<const Expr *> LHSExprs,
1318                                              ArrayRef<const Expr *> RHSExprs,
1319                                              const OMPTaskDataTy &Data);
1320 
1321   /// Emits the following code for reduction clause with task modifier:
1322   /// \code
1323   /// __kmpc_task_reduction_modifier_fini(loc, gtid, is_worksharing);
1324   /// \endcode
1325   virtual void emitTaskReductionFini(CodeGenFunction &CGF, SourceLocation Loc,
1326                                      bool IsWorksharingReduction);
1327 
1328   /// Required to resolve existing problems in the runtime. Emits threadprivate
1329   /// variables to store the size of the VLAs/array sections for
1330   /// initializer/combiner/finalizer functions.
1331   /// \param RCG Allows to reuse an existing data for the reductions.
1332   /// \param N Reduction item for which fixups must be emitted.
1333   virtual void emitTaskReductionFixups(CodeGenFunction &CGF, SourceLocation Loc,
1334                                        ReductionCodeGen &RCG, unsigned N);
1335 
1336   /// Get the address of `void *` type of the privatue copy of the reduction
1337   /// item specified by the \p SharedLVal.
1338   /// \param ReductionsPtr Pointer to the reduction data returned by the
1339   /// emitTaskReductionInit function.
1340   /// \param SharedLVal Address of the original reduction item.
1341   virtual Address getTaskReductionItem(CodeGenFunction &CGF, SourceLocation Loc,
1342                                        llvm::Value *ReductionsPtr,
1343                                        LValue SharedLVal);
1344 
1345   /// Emit code for 'taskwait' directive.
1346   virtual void emitTaskwaitCall(CodeGenFunction &CGF, SourceLocation Loc,
1347                                 const OMPTaskDataTy &Data);
1348 
1349   /// Emit code for 'cancellation point' construct.
1350   /// \param CancelRegion Region kind for which the cancellation point must be
1351   /// emitted.
1352   ///
1353   virtual void emitCancellationPointCall(CodeGenFunction &CGF,
1354                                          SourceLocation Loc,
1355                                          OpenMPDirectiveKind CancelRegion);
1356 
1357   /// Emit code for 'cancel' construct.
1358   /// \param IfCond Condition in the associated 'if' clause, if it was
1359   /// specified, nullptr otherwise.
1360   /// \param CancelRegion Region kind for which the cancel must be emitted.
1361   ///
1362   virtual void emitCancelCall(CodeGenFunction &CGF, SourceLocation Loc,
1363                               const Expr *IfCond,
1364                               OpenMPDirectiveKind CancelRegion);
1365 
1366   /// Emit outilined function for 'target' directive.
1367   /// \param D Directive to emit.
1368   /// \param ParentName Name of the function that encloses the target region.
1369   /// \param OutlinedFn Outlined function value to be defined by this call.
1370   /// \param OutlinedFnID Outlined function ID value to be defined by this call.
1371   /// \param IsOffloadEntry True if the outlined function is an offload entry.
1372   /// \param CodeGen Code generation sequence for the \a D directive.
1373   /// An outlined function may not be an entry if, e.g. the if clause always
1374   /// evaluates to false.
1375   virtual void emitTargetOutlinedFunction(const OMPExecutableDirective &D,
1376                                           StringRef ParentName,
1377                                           llvm::Function *&OutlinedFn,
1378                                           llvm::Constant *&OutlinedFnID,
1379                                           bool IsOffloadEntry,
1380                                           const RegionCodeGenTy &CodeGen);
1381 
1382   /// Emit the target offloading code associated with \a D. The emitted
1383   /// code attempts offloading the execution to the device, an the event of
1384   /// a failure it executes the host version outlined in \a OutlinedFn.
1385   /// \param D Directive to emit.
1386   /// \param OutlinedFn Host version of the code to be offloaded.
1387   /// \param OutlinedFnID ID of host version of the code to be offloaded.
1388   /// \param IfCond Expression evaluated in if clause associated with the target
1389   /// directive, or null if no if clause is used.
1390   /// \param Device Expression evaluated in device clause associated with the
1391   /// target directive, or null if no device clause is used and device modifier.
1392   /// \param SizeEmitter Callback to emit number of iterations for loop-based
1393   /// directives.
1394   virtual void emitTargetCall(
1395       CodeGenFunction &CGF, const OMPExecutableDirective &D,
1396       llvm::Function *OutlinedFn, llvm::Value *OutlinedFnID, const Expr *IfCond,
1397       llvm::PointerIntPair<const Expr *, 2, OpenMPDeviceClauseModifier> Device,
1398       llvm::function_ref<llvm::Value *(CodeGenFunction &CGF,
1399                                        const OMPLoopDirective &D)>
1400           SizeEmitter);
1401 
1402   /// Emit the target regions enclosed in \a GD function definition or
1403   /// the function itself in case it is a valid device function. Returns true if
1404   /// \a GD was dealt with successfully.
1405   /// \param GD Function to scan.
1406   virtual bool emitTargetFunctions(GlobalDecl GD);
1407 
1408   /// Emit the global variable if it is a valid device global variable.
1409   /// Returns true if \a GD was dealt with successfully.
1410   /// \param GD Variable declaration to emit.
1411   virtual bool emitTargetGlobalVariable(GlobalDecl GD);
1412 
1413   /// Checks if the provided global decl \a GD is a declare target variable and
1414   /// registers it when emitting code for the host.
1415   virtual void registerTargetGlobalVariable(const VarDecl *VD,
1416                                             llvm::Constant *Addr);
1417 
1418   /// Emit the global \a GD if it is meaningful for the target. Returns
1419   /// if it was emitted successfully.
1420   /// \param GD Global to scan.
1421   virtual bool emitTargetGlobal(GlobalDecl GD);
1422 
1423   /// Creates and returns a registration function for when at least one
1424   /// requires directives was used in the current module.
1425   llvm::Function *emitRequiresDirectiveRegFun();
1426 
1427   /// Creates all the offload entries in the current compilation unit
1428   /// along with the associated metadata.
1429   void createOffloadEntriesAndInfoMetadata();
1430 
1431   /// Emits code for teams call of the \a OutlinedFn with
1432   /// variables captured in a record which address is stored in \a
1433   /// CapturedStruct.
1434   /// \param OutlinedFn Outlined function to be run by team masters. Type of
1435   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
1436   /// \param CapturedVars A pointer to the record with the references to
1437   /// variables used in \a OutlinedFn function.
1438   ///
1439   virtual void emitTeamsCall(CodeGenFunction &CGF,
1440                              const OMPExecutableDirective &D,
1441                              SourceLocation Loc, llvm::Function *OutlinedFn,
1442                              ArrayRef<llvm::Value *> CapturedVars);
1443 
1444   /// Emits call to void __kmpc_push_num_teams(ident_t *loc, kmp_int32
1445   /// global_tid, kmp_int32 num_teams, kmp_int32 thread_limit) to generate code
1446   /// for num_teams clause.
1447   /// \param NumTeams An integer expression of teams.
1448   /// \param ThreadLimit An integer expression of threads.
1449   virtual void emitNumTeamsClause(CodeGenFunction &CGF, const Expr *NumTeams,
1450                                   const Expr *ThreadLimit, SourceLocation Loc);
1451 
1452   /// Struct that keeps all the relevant information that should be kept
1453   /// throughout a 'target data' region.
1454   class TargetDataInfo : public llvm::OpenMPIRBuilder::TargetDataInfo {
1455   public:
1456     explicit TargetDataInfo() : llvm::OpenMPIRBuilder::TargetDataInfo() {}
1457     explicit TargetDataInfo(bool RequiresDevicePointerInfo,
1458                             bool SeparateBeginEndCalls)
1459         : llvm::OpenMPIRBuilder::TargetDataInfo(RequiresDevicePointerInfo,
1460                                                 SeparateBeginEndCalls) {}
1461     /// Map between the a declaration of a capture and the corresponding new
1462     /// llvm address where the runtime returns the device pointers.
1463     llvm::DenseMap<const ValueDecl *, llvm::Value *> CaptureDeviceAddrMap;
1464   };
1465 
1466   /// Emit the target data mapping code associated with \a D.
1467   /// \param D Directive to emit.
1468   /// \param IfCond Expression evaluated in if clause associated with the
1469   /// target directive, or null if no device clause is used.
1470   /// \param Device Expression evaluated in device clause associated with the
1471   /// target directive, or null if no device clause is used.
1472   /// \param Info A record used to store information that needs to be preserved
1473   /// until the region is closed.
1474   virtual void emitTargetDataCalls(CodeGenFunction &CGF,
1475                                    const OMPExecutableDirective &D,
1476                                    const Expr *IfCond, const Expr *Device,
1477                                    const RegionCodeGenTy &CodeGen,
1478                                    CGOpenMPRuntime::TargetDataInfo &Info);
1479 
1480   /// Emit the data mapping/movement code associated with the directive
1481   /// \a D that should be of the form 'target [{enter|exit} data | update]'.
1482   /// \param D Directive to emit.
1483   /// \param IfCond Expression evaluated in if clause associated with the target
1484   /// directive, or null if no if clause is used.
1485   /// \param Device Expression evaluated in device clause associated with the
1486   /// target directive, or null if no device clause is used.
1487   virtual void emitTargetDataStandAloneCall(CodeGenFunction &CGF,
1488                                             const OMPExecutableDirective &D,
1489                                             const Expr *IfCond,
1490                                             const Expr *Device);
1491 
1492   /// Marks function \a Fn with properly mangled versions of vector functions.
1493   /// \param FD Function marked as 'declare simd'.
1494   /// \param Fn LLVM function that must be marked with 'declare simd'
1495   /// attributes.
1496   virtual void emitDeclareSimdFunction(const FunctionDecl *FD,
1497                                        llvm::Function *Fn);
1498 
1499   /// Emit initialization for doacross loop nesting support.
1500   /// \param D Loop-based construct used in doacross nesting construct.
1501   virtual void emitDoacrossInit(CodeGenFunction &CGF, const OMPLoopDirective &D,
1502                                 ArrayRef<Expr *> NumIterations);
1503 
1504   /// Emit code for doacross ordered directive with 'depend' clause.
1505   /// \param C 'depend' clause with 'sink|source' dependency kind.
1506   virtual void emitDoacrossOrdered(CodeGenFunction &CGF,
1507                                    const OMPDependClause *C);
1508 
1509   /// Emit code for doacross ordered directive with 'doacross' clause.
1510   /// \param C 'doacross' clause with 'sink|source' dependence type.
1511   virtual void emitDoacrossOrdered(CodeGenFunction &CGF,
1512                                    const OMPDoacrossClause *C);
1513 
1514   /// Translates the native parameter of outlined function if this is required
1515   /// for target.
1516   /// \param FD Field decl from captured record for the parameter.
1517   /// \param NativeParam Parameter itself.
1518   virtual const VarDecl *translateParameter(const FieldDecl *FD,
1519                                             const VarDecl *NativeParam) const {
1520     return NativeParam;
1521   }
1522 
1523   /// Gets the address of the native argument basing on the address of the
1524   /// target-specific parameter.
1525   /// \param NativeParam Parameter itself.
1526   /// \param TargetParam Corresponding target-specific parameter.
1527   virtual Address getParameterAddress(CodeGenFunction &CGF,
1528                                       const VarDecl *NativeParam,
1529                                       const VarDecl *TargetParam) const;
1530 
1531   /// Choose default schedule type and chunk value for the
1532   /// dist_schedule clause.
1533   virtual void getDefaultDistScheduleAndChunk(CodeGenFunction &CGF,
1534       const OMPLoopDirective &S, OpenMPDistScheduleClauseKind &ScheduleKind,
1535       llvm::Value *&Chunk) const {}
1536 
1537   /// Choose default schedule type and chunk value for the
1538   /// schedule clause.
1539   virtual void getDefaultScheduleAndChunk(CodeGenFunction &CGF,
1540       const OMPLoopDirective &S, OpenMPScheduleClauseKind &ScheduleKind,
1541       const Expr *&ChunkExpr) const;
1542 
1543   /// Emits call of the outlined function with the provided arguments,
1544   /// translating these arguments to correct target-specific arguments.
1545   virtual void
1546   emitOutlinedFunctionCall(CodeGenFunction &CGF, SourceLocation Loc,
1547                            llvm::FunctionCallee OutlinedFn,
1548                            ArrayRef<llvm::Value *> Args = std::nullopt) const;
1549 
1550   /// Emits OpenMP-specific function prolog.
1551   /// Required for device constructs.
1552   virtual void emitFunctionProlog(CodeGenFunction &CGF, const Decl *D);
1553 
1554   /// Gets the OpenMP-specific address of the local variable.
1555   virtual Address getAddressOfLocalVariable(CodeGenFunction &CGF,
1556                                             const VarDecl *VD);
1557 
1558   /// Marks the declaration as already emitted for the device code and returns
1559   /// true, if it was marked already, and false, otherwise.
1560   bool markAsGlobalTarget(GlobalDecl GD);
1561 
1562   /// Emit deferred declare target variables marked for deferred emission.
1563   void emitDeferredTargetDecls() const;
1564 
1565   /// Adjust some parameters for the target-based directives, like addresses of
1566   /// the variables captured by reference in lambdas.
1567   virtual void
1568   adjustTargetSpecificDataForLambdas(CodeGenFunction &CGF,
1569                                      const OMPExecutableDirective &D) const;
1570 
1571   /// Perform check on requires decl to ensure that target architecture
1572   /// supports unified addressing
1573   virtual void processRequiresDirective(const OMPRequiresDecl *D);
1574 
1575   /// Gets default memory ordering as specified in requires directive.
1576   llvm::AtomicOrdering getDefaultMemoryOrdering() const;
1577 
1578   /// Checks if the variable has associated OMPAllocateDeclAttr attribute with
1579   /// the predefined allocator and translates it into the corresponding address
1580   /// space.
1581   virtual bool hasAllocateAttributeForGlobalVar(const VarDecl *VD, LangAS &AS);
1582 
1583   /// Return whether the unified_shared_memory has been specified.
1584   bool hasRequiresUnifiedSharedMemory() const;
1585 
1586   /// Checks if the \p VD variable is marked as nontemporal declaration in
1587   /// current context.
1588   bool isNontemporalDecl(const ValueDecl *VD) const;
1589 
1590   /// Create specialized alloca to handle lastprivate conditionals.
1591   Address emitLastprivateConditionalInit(CodeGenFunction &CGF,
1592                                          const VarDecl *VD);
1593 
1594   /// Checks if the provided \p LVal is lastprivate conditional and emits the
1595   /// code to update the value of the original variable.
1596   /// \code
1597   /// lastprivate(conditional: a)
1598   /// ...
1599   /// <type> a;
1600   /// lp_a = ...;
1601   /// #pragma omp critical(a)
1602   /// if (last_iv_a <= iv) {
1603   ///   last_iv_a = iv;
1604   ///   global_a = lp_a;
1605   /// }
1606   /// \endcode
1607   virtual void checkAndEmitLastprivateConditional(CodeGenFunction &CGF,
1608                                                   const Expr *LHS);
1609 
1610   /// Checks if the lastprivate conditional was updated in inner region and
1611   /// writes the value.
1612   /// \code
1613   /// lastprivate(conditional: a)
1614   /// ...
1615   /// <type> a;bool Fired = false;
1616   /// #pragma omp ... shared(a)
1617   /// {
1618   ///   lp_a = ...;
1619   ///   Fired = true;
1620   /// }
1621   /// if (Fired) {
1622   ///   #pragma omp critical(a)
1623   ///   if (last_iv_a <= iv) {
1624   ///     last_iv_a = iv;
1625   ///     global_a = lp_a;
1626   ///   }
1627   ///   Fired = false;
1628   /// }
1629   /// \endcode
1630   virtual void checkAndEmitSharedLastprivateConditional(
1631       CodeGenFunction &CGF, const OMPExecutableDirective &D,
1632       const llvm::DenseSet<CanonicalDeclPtr<const VarDecl>> &IgnoredDecls);
1633 
1634   /// Gets the address of the global copy used for lastprivate conditional
1635   /// update, if any.
1636   /// \param PrivLVal LValue for the private copy.
1637   /// \param VD Original lastprivate declaration.
1638   virtual void emitLastprivateConditionalFinalUpdate(CodeGenFunction &CGF,
1639                                                      LValue PrivLVal,
1640                                                      const VarDecl *VD,
1641                                                      SourceLocation Loc);
1642 
1643   /// Emits list of dependecies based on the provided data (array of
1644   /// dependence/expression pairs).
1645   /// \returns Pointer to the first element of the array casted to VoidPtr type.
1646   std::pair<llvm::Value *, Address>
1647   emitDependClause(CodeGenFunction &CGF,
1648                    ArrayRef<OMPTaskDataTy::DependData> Dependencies,
1649                    SourceLocation Loc);
1650 
1651   /// Emits list of dependecies based on the provided data (array of
1652   /// dependence/expression pairs) for depobj construct. In this case, the
1653   /// variable is allocated in dynamically. \returns Pointer to the first
1654   /// element of the array casted to VoidPtr type.
1655   Address emitDepobjDependClause(CodeGenFunction &CGF,
1656                                  const OMPTaskDataTy::DependData &Dependencies,
1657                                  SourceLocation Loc);
1658 
1659   /// Emits the code to destroy the dependency object provided in depobj
1660   /// directive.
1661   void emitDestroyClause(CodeGenFunction &CGF, LValue DepobjLVal,
1662                          SourceLocation Loc);
1663 
1664   /// Updates the dependency kind in the specified depobj object.
1665   /// \param DepobjLVal LValue for the main depobj object.
1666   /// \param NewDepKind New dependency kind.
1667   void emitUpdateClause(CodeGenFunction &CGF, LValue DepobjLVal,
1668                         OpenMPDependClauseKind NewDepKind, SourceLocation Loc);
1669 
1670   /// Initializes user defined allocators specified in the uses_allocators
1671   /// clauses.
1672   void emitUsesAllocatorsInit(CodeGenFunction &CGF, const Expr *Allocator,
1673                               const Expr *AllocatorTraits);
1674 
1675   /// Destroys user defined allocators specified in the uses_allocators clause.
1676   void emitUsesAllocatorsFini(CodeGenFunction &CGF, const Expr *Allocator);
1677 
1678   /// Returns true if the variable is a local variable in untied task.
1679   bool isLocalVarInUntiedTask(CodeGenFunction &CGF, const VarDecl *VD) const;
1680 };
1681 
1682 /// Class supports emissionof SIMD-only code.
1683 class CGOpenMPSIMDRuntime final : public CGOpenMPRuntime {
1684 public:
1685   explicit CGOpenMPSIMDRuntime(CodeGenModule &CGM) : CGOpenMPRuntime(CGM) {}
1686   ~CGOpenMPSIMDRuntime() override {}
1687 
1688   /// Emits outlined function for the specified OpenMP parallel directive
1689   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
1690   /// kmp_int32 BoundID, struct context_vars*).
1691   /// \param CGF Reference to current CodeGenFunction.
1692   /// \param D OpenMP directive.
1693   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
1694   /// \param InnermostKind Kind of innermost directive (for simple directives it
1695   /// is a directive itself, for combined - its innermost directive).
1696   /// \param CodeGen Code generation sequence for the \a D directive.
1697   llvm::Function *emitParallelOutlinedFunction(
1698       CodeGenFunction &CGF, const OMPExecutableDirective &D,
1699       const VarDecl *ThreadIDVar, OpenMPDirectiveKind InnermostKind,
1700       const RegionCodeGenTy &CodeGen) override;
1701 
1702   /// Emits outlined function for the specified OpenMP teams directive
1703   /// \a D. This outlined function has type void(*)(kmp_int32 *ThreadID,
1704   /// kmp_int32 BoundID, struct context_vars*).
1705   /// \param CGF Reference to current CodeGenFunction.
1706   /// \param D OpenMP directive.
1707   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
1708   /// \param InnermostKind Kind of innermost directive (for simple directives it
1709   /// is a directive itself, for combined - its innermost directive).
1710   /// \param CodeGen Code generation sequence for the \a D directive.
1711   llvm::Function *emitTeamsOutlinedFunction(
1712       CodeGenFunction &CGF, const OMPExecutableDirective &D,
1713       const VarDecl *ThreadIDVar, OpenMPDirectiveKind InnermostKind,
1714       const RegionCodeGenTy &CodeGen) override;
1715 
1716   /// Emits outlined function for the OpenMP task directive \a D. This
1717   /// outlined function has type void(*)(kmp_int32 ThreadID, struct task_t*
1718   /// TaskT).
1719   /// \param D OpenMP directive.
1720   /// \param ThreadIDVar Variable for thread id in the current OpenMP region.
1721   /// \param PartIDVar Variable for partition id in the current OpenMP untied
1722   /// task region.
1723   /// \param TaskTVar Variable for task_t argument.
1724   /// \param InnermostKind Kind of innermost directive (for simple directives it
1725   /// is a directive itself, for combined - its innermost directive).
1726   /// \param CodeGen Code generation sequence for the \a D directive.
1727   /// \param Tied true if task is generated for tied task, false otherwise.
1728   /// \param NumberOfParts Number of parts in untied task. Ignored for tied
1729   /// tasks.
1730   ///
1731   llvm::Function *emitTaskOutlinedFunction(
1732       const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
1733       const VarDecl *PartIDVar, const VarDecl *TaskTVar,
1734       OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen,
1735       bool Tied, unsigned &NumberOfParts) override;
1736 
1737   /// Emits code for parallel or serial call of the \a OutlinedFn with
1738   /// variables captured in a record which address is stored in \a
1739   /// CapturedStruct.
1740   /// \param OutlinedFn Outlined function to be run in parallel threads. Type of
1741   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
1742   /// \param CapturedVars A pointer to the record with the references to
1743   /// variables used in \a OutlinedFn function.
1744   /// \param IfCond Condition in the associated 'if' clause, if it was
1745   /// specified, nullptr otherwise.
1746   /// \param NumThreads The value corresponding to the num_threads clause, if
1747   /// any, or nullptr.
1748   ///
1749   void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
1750                         llvm::Function *OutlinedFn,
1751                         ArrayRef<llvm::Value *> CapturedVars,
1752                         const Expr *IfCond, llvm::Value *NumThreads) override;
1753 
1754   /// Emits a critical region.
1755   /// \param CriticalName Name of the critical region.
1756   /// \param CriticalOpGen Generator for the statement associated with the given
1757   /// critical region.
1758   /// \param Hint Value of the 'hint' clause (optional).
1759   void emitCriticalRegion(CodeGenFunction &CGF, StringRef CriticalName,
1760                           const RegionCodeGenTy &CriticalOpGen,
1761                           SourceLocation Loc,
1762                           const Expr *Hint = nullptr) override;
1763 
1764   /// Emits a master region.
1765   /// \param MasterOpGen Generator for the statement associated with the given
1766   /// master region.
1767   void emitMasterRegion(CodeGenFunction &CGF,
1768                         const RegionCodeGenTy &MasterOpGen,
1769                         SourceLocation Loc) override;
1770 
1771   /// Emits a masked region.
1772   /// \param MaskedOpGen Generator for the statement associated with the given
1773   /// masked region.
1774   void emitMaskedRegion(CodeGenFunction &CGF,
1775                         const RegionCodeGenTy &MaskedOpGen, SourceLocation Loc,
1776                         const Expr *Filter = nullptr) override;
1777 
1778   /// Emits a masked region.
1779   /// \param MaskedOpGen Generator for the statement associated with the given
1780   /// masked region.
1781 
1782   /// Emits code for a taskyield directive.
1783   void emitTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc) override;
1784 
1785   /// Emit a taskgroup region.
1786   /// \param TaskgroupOpGen Generator for the statement associated with the
1787   /// given taskgroup region.
1788   void emitTaskgroupRegion(CodeGenFunction &CGF,
1789                            const RegionCodeGenTy &TaskgroupOpGen,
1790                            SourceLocation Loc) override;
1791 
1792   /// Emits a single region.
1793   /// \param SingleOpGen Generator for the statement associated with the given
1794   /// single region.
1795   void emitSingleRegion(CodeGenFunction &CGF,
1796                         const RegionCodeGenTy &SingleOpGen, SourceLocation Loc,
1797                         ArrayRef<const Expr *> CopyprivateVars,
1798                         ArrayRef<const Expr *> DestExprs,
1799                         ArrayRef<const Expr *> SrcExprs,
1800                         ArrayRef<const Expr *> AssignmentOps) override;
1801 
1802   /// Emit an ordered region.
1803   /// \param OrderedOpGen Generator for the statement associated with the given
1804   /// ordered region.
1805   void emitOrderedRegion(CodeGenFunction &CGF,
1806                          const RegionCodeGenTy &OrderedOpGen,
1807                          SourceLocation Loc, bool IsThreads) override;
1808 
1809   /// Emit an implicit/explicit barrier for OpenMP threads.
1810   /// \param Kind Directive for which this implicit barrier call must be
1811   /// generated. Must be OMPD_barrier for explicit barrier generation.
1812   /// \param EmitChecks true if need to emit checks for cancellation barriers.
1813   /// \param ForceSimpleCall true simple barrier call must be emitted, false if
1814   /// runtime class decides which one to emit (simple or with cancellation
1815   /// checks).
1816   ///
1817   void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
1818                        OpenMPDirectiveKind Kind, bool EmitChecks = true,
1819                        bool ForceSimpleCall = false) override;
1820 
1821   /// This is used for non static scheduled types and when the ordered
1822   /// clause is present on the loop construct.
1823   /// Depending on the loop schedule, it is necessary to call some runtime
1824   /// routine before start of the OpenMP loop to get the loop upper / lower
1825   /// bounds \a LB and \a UB and stride \a ST.
1826   ///
1827   /// \param CGF Reference to current CodeGenFunction.
1828   /// \param Loc Clang source location.
1829   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
1830   /// \param IVSize Size of the iteration variable in bits.
1831   /// \param IVSigned Sign of the iteration variable.
1832   /// \param Ordered true if loop is ordered, false otherwise.
1833   /// \param DispatchValues struct containing llvm values for lower bound, upper
1834   /// bound, and chunk expression.
1835   /// For the default (nullptr) value, the chunk 1 will be used.
1836   ///
1837   void emitForDispatchInit(CodeGenFunction &CGF, SourceLocation Loc,
1838                            const OpenMPScheduleTy &ScheduleKind,
1839                            unsigned IVSize, bool IVSigned, bool Ordered,
1840                            const DispatchRTInput &DispatchValues) override;
1841 
1842   /// Call the appropriate runtime routine to initialize it before start
1843   /// of loop.
1844   ///
1845   /// This is used only in case of static schedule, when the user did not
1846   /// specify a ordered clause on the loop construct.
1847   /// Depending on the loop schedule, it is necessary to call some runtime
1848   /// routine before start of the OpenMP loop to get the loop upper / lower
1849   /// bounds LB and UB and stride ST.
1850   ///
1851   /// \param CGF Reference to current CodeGenFunction.
1852   /// \param Loc Clang source location.
1853   /// \param DKind Kind of the directive.
1854   /// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
1855   /// \param Values Input arguments for the construct.
1856   ///
1857   void emitForStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
1858                          OpenMPDirectiveKind DKind,
1859                          const OpenMPScheduleTy &ScheduleKind,
1860                          const StaticRTInput &Values) override;
1861 
1862   ///
1863   /// \param CGF Reference to current CodeGenFunction.
1864   /// \param Loc Clang source location.
1865   /// \param SchedKind Schedule kind, specified by the 'dist_schedule' clause.
1866   /// \param Values Input arguments for the construct.
1867   ///
1868   void emitDistributeStaticInit(CodeGenFunction &CGF, SourceLocation Loc,
1869                                 OpenMPDistScheduleClauseKind SchedKind,
1870                                 const StaticRTInput &Values) override;
1871 
1872   /// Call the appropriate runtime routine to notify that we finished
1873   /// iteration of the ordered loop with the dynamic scheduling.
1874   ///
1875   /// \param CGF Reference to current CodeGenFunction.
1876   /// \param Loc Clang source location.
1877   /// \param IVSize Size of the iteration variable in bits.
1878   /// \param IVSigned Sign of the iteration variable.
1879   ///
1880   void emitForOrderedIterationEnd(CodeGenFunction &CGF, SourceLocation Loc,
1881                                   unsigned IVSize, bool IVSigned) override;
1882 
1883   /// Call the appropriate runtime routine to notify that we finished
1884   /// all the work with current loop.
1885   ///
1886   /// \param CGF Reference to current CodeGenFunction.
1887   /// \param Loc Clang source location.
1888   /// \param DKind Kind of the directive for which the static finish is emitted.
1889   ///
1890   void emitForStaticFinish(CodeGenFunction &CGF, SourceLocation Loc,
1891                            OpenMPDirectiveKind DKind) override;
1892 
1893   /// Call __kmpc_dispatch_next(
1894   ///          ident_t *loc, kmp_int32 tid, kmp_int32 *p_lastiter,
1895   ///          kmp_int[32|64] *p_lower, kmp_int[32|64] *p_upper,
1896   ///          kmp_int[32|64] *p_stride);
1897   /// \param IVSize Size of the iteration variable in bits.
1898   /// \param IVSigned Sign of the iteration variable.
1899   /// \param IL Address of the output variable in which the flag of the
1900   /// last iteration is returned.
1901   /// \param LB Address of the output variable in which the lower iteration
1902   /// number is returned.
1903   /// \param UB Address of the output variable in which the upper iteration
1904   /// number is returned.
1905   /// \param ST Address of the output variable in which the stride value is
1906   /// returned.
1907   llvm::Value *emitForNext(CodeGenFunction &CGF, SourceLocation Loc,
1908                            unsigned IVSize, bool IVSigned, Address IL,
1909                            Address LB, Address UB, Address ST) override;
1910 
1911   /// Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32
1912   /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads'
1913   /// clause.
1914   /// \param NumThreads An integer value of threads.
1915   void emitNumThreadsClause(CodeGenFunction &CGF, llvm::Value *NumThreads,
1916                             SourceLocation Loc) override;
1917 
1918   /// Emit call to void __kmpc_push_proc_bind(ident_t *loc, kmp_int32
1919   /// global_tid, int proc_bind) to generate code for 'proc_bind' clause.
1920   void emitProcBindClause(CodeGenFunction &CGF,
1921                           llvm::omp::ProcBindKind ProcBind,
1922                           SourceLocation Loc) override;
1923 
1924   /// Returns address of the threadprivate variable for the current
1925   /// thread.
1926   /// \param VD Threadprivate variable.
1927   /// \param VDAddr Address of the global variable \a VD.
1928   /// \param Loc Location of the reference to threadprivate var.
1929   /// \return Address of the threadprivate variable for the current thread.
1930   Address getAddrOfThreadPrivate(CodeGenFunction &CGF, const VarDecl *VD,
1931                                  Address VDAddr, SourceLocation Loc) override;
1932 
1933   /// Emit a code for initialization of threadprivate variable. It emits
1934   /// a call to runtime library which adds initial value to the newly created
1935   /// threadprivate variable (if it is not constant) and registers destructor
1936   /// for the variable (if any).
1937   /// \param VD Threadprivate variable.
1938   /// \param VDAddr Address of the global variable \a VD.
1939   /// \param Loc Location of threadprivate declaration.
1940   /// \param PerformInit true if initialization expression is not constant.
1941   llvm::Function *
1942   emitThreadPrivateVarDefinition(const VarDecl *VD, Address VDAddr,
1943                                  SourceLocation Loc, bool PerformInit,
1944                                  CodeGenFunction *CGF = nullptr) override;
1945 
1946   /// Creates artificial threadprivate variable with name \p Name and type \p
1947   /// VarType.
1948   /// \param VarType Type of the artificial threadprivate variable.
1949   /// \param Name Name of the artificial threadprivate variable.
1950   Address getAddrOfArtificialThreadPrivate(CodeGenFunction &CGF,
1951                                            QualType VarType,
1952                                            StringRef Name) override;
1953 
1954   /// Emit flush of the variables specified in 'omp flush' directive.
1955   /// \param Vars List of variables to flush.
1956   void emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars,
1957                  SourceLocation Loc, llvm::AtomicOrdering AO) override;
1958 
1959   /// Emit task region for the task directive. The task region is
1960   /// emitted in several steps:
1961   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1962   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1963   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1964   /// function:
1965   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1966   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
1967   ///   return 0;
1968   /// }
1969   /// 2. Copy a list of shared variables to field shareds of the resulting
1970   /// structure kmp_task_t returned by the previous call (if any).
1971   /// 3. Copy a pointer to destructions function to field destructions of the
1972   /// resulting structure kmp_task_t.
1973   /// 4. Emit a call to kmp_int32 __kmpc_omp_task(ident_t *, kmp_int32 gtid,
1974   /// kmp_task_t *new_task), where new_task is a resulting structure from
1975   /// previous items.
1976   /// \param D Current task directive.
1977   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
1978   /// /*part_id*/, captured_struct */*__context*/);
1979   /// \param SharedsTy A type which contains references the shared variables.
1980   /// \param Shareds Context with the list of shared variables from the \p
1981   /// TaskFunction.
1982   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
1983   /// otherwise.
1984   /// \param Data Additional data for task generation like tiednsee, final
1985   /// state, list of privates etc.
1986   void emitTaskCall(CodeGenFunction &CGF, SourceLocation Loc,
1987                     const OMPExecutableDirective &D,
1988                     llvm::Function *TaskFunction, QualType SharedsTy,
1989                     Address Shareds, const Expr *IfCond,
1990                     const OMPTaskDataTy &Data) override;
1991 
1992   /// Emit task region for the taskloop directive. The taskloop region is
1993   /// emitted in several steps:
1994   /// 1. Emit a call to kmp_task_t *__kmpc_omp_task_alloc(ident_t *, kmp_int32
1995   /// gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds,
1996   /// kmp_routine_entry_t *task_entry). Here task_entry is a pointer to the
1997   /// function:
1998   /// kmp_int32 .omp_task_entry.(kmp_int32 gtid, kmp_task_t *tt) {
1999   ///   TaskFunction(gtid, tt->part_id, tt->shareds);
2000   ///   return 0;
2001   /// }
2002   /// 2. Copy a list of shared variables to field shareds of the resulting
2003   /// structure kmp_task_t returned by the previous call (if any).
2004   /// 3. Copy a pointer to destructions function to field destructions of the
2005   /// resulting structure kmp_task_t.
2006   /// 4. Emit a call to void __kmpc_taskloop(ident_t *loc, int gtid, kmp_task_t
2007   /// *task, int if_val, kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, int
2008   /// nogroup, int sched, kmp_uint64 grainsize, void *task_dup ), where new_task
2009   /// is a resulting structure from
2010   /// previous items.
2011   /// \param D Current task directive.
2012   /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32
2013   /// /*part_id*/, captured_struct */*__context*/);
2014   /// \param SharedsTy A type which contains references the shared variables.
2015   /// \param Shareds Context with the list of shared variables from the \p
2016   /// TaskFunction.
2017   /// \param IfCond Not a nullptr if 'if' clause was specified, nullptr
2018   /// otherwise.
2019   /// \param Data Additional data for task generation like tiednsee, final
2020   /// state, list of privates etc.
2021   void emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
2022                         const OMPLoopDirective &D, llvm::Function *TaskFunction,
2023                         QualType SharedsTy, Address Shareds, const Expr *IfCond,
2024                         const OMPTaskDataTy &Data) override;
2025 
2026   /// Emit a code for reduction clause. Next code should be emitted for
2027   /// reduction:
2028   /// \code
2029   ///
2030   /// static kmp_critical_name lock = { 0 };
2031   ///
2032   /// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
2033   ///  ...
2034   ///  *(Type<i>*)lhs[i] = RedOp<i>(*(Type<i>*)lhs[i], *(Type<i>*)rhs[i]);
2035   ///  ...
2036   /// }
2037   ///
2038   /// ...
2039   /// void *RedList[<n>] = {&<RHSExprs>[0], ..., &<RHSExprs>[<n>-1]};
2040   /// switch (__kmpc_reduce{_nowait}(<loc>, <gtid>, <n>, sizeof(RedList),
2041   /// RedList, reduce_func, &<lock>)) {
2042   /// case 1:
2043   ///  ...
2044   ///  <LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]);
2045   ///  ...
2046   /// __kmpc_end_reduce{_nowait}(<loc>, <gtid>, &<lock>);
2047   /// break;
2048   /// case 2:
2049   ///  ...
2050   ///  Atomic(<LHSExprs>[i] = RedOp<i>(*<LHSExprs>[i], *<RHSExprs>[i]));
2051   ///  ...
2052   /// break;
2053   /// default:;
2054   /// }
2055   /// \endcode
2056   ///
2057   /// \param Privates List of private copies for original reduction arguments.
2058   /// \param LHSExprs List of LHS in \a ReductionOps reduction operations.
2059   /// \param RHSExprs List of RHS in \a ReductionOps reduction operations.
2060   /// \param ReductionOps List of reduction operations in form 'LHS binop RHS'
2061   /// or 'operator binop(LHS, RHS)'.
2062   /// \param Options List of options for reduction codegen:
2063   ///     WithNowait true if parent directive has also nowait clause, false
2064   ///     otherwise.
2065   ///     SimpleReduction Emit reduction operation only. Used for omp simd
2066   ///     directive on the host.
2067   ///     ReductionKind The kind of reduction to perform.
2068   void emitReduction(CodeGenFunction &CGF, SourceLocation Loc,
2069                      ArrayRef<const Expr *> Privates,
2070                      ArrayRef<const Expr *> LHSExprs,
2071                      ArrayRef<const Expr *> RHSExprs,
2072                      ArrayRef<const Expr *> ReductionOps,
2073                      ReductionOptionsTy Options) override;
2074 
2075   /// Emit a code for initialization of task reduction clause. Next code
2076   /// should be emitted for reduction:
2077   /// \code
2078   ///
2079   /// _taskred_item_t red_data[n];
2080   /// ...
2081   /// red_data[i].shar = &shareds[i];
2082   /// red_data[i].orig = &origs[i];
2083   /// red_data[i].size = sizeof(origs[i]);
2084   /// red_data[i].f_init = (void*)RedInit<i>;
2085   /// red_data[i].f_fini = (void*)RedDest<i>;
2086   /// red_data[i].f_comb = (void*)RedOp<i>;
2087   /// red_data[i].flags = <Flag_i>;
2088   /// ...
2089   /// void* tg1 = __kmpc_taskred_init(gtid, n, red_data);
2090   /// \endcode
2091   /// For reduction clause with task modifier it emits the next call:
2092   /// \code
2093   ///
2094   /// _taskred_item_t red_data[n];
2095   /// ...
2096   /// red_data[i].shar = &shareds[i];
2097   /// red_data[i].orig = &origs[i];
2098   /// red_data[i].size = sizeof(origs[i]);
2099   /// red_data[i].f_init = (void*)RedInit<i>;
2100   /// red_data[i].f_fini = (void*)RedDest<i>;
2101   /// red_data[i].f_comb = (void*)RedOp<i>;
2102   /// red_data[i].flags = <Flag_i>;
2103   /// ...
2104   /// void* tg1 = __kmpc_taskred_modifier_init(loc, gtid, is_worksharing, n,
2105   /// red_data);
2106   /// \endcode
2107   /// \param LHSExprs List of LHS in \a Data.ReductionOps reduction operations.
2108   /// \param RHSExprs List of RHS in \a Data.ReductionOps reduction operations.
2109   /// \param Data Additional data for task generation like tiedness, final
2110   /// state, list of privates, reductions etc.
2111   llvm::Value *emitTaskReductionInit(CodeGenFunction &CGF, SourceLocation Loc,
2112                                      ArrayRef<const Expr *> LHSExprs,
2113                                      ArrayRef<const Expr *> RHSExprs,
2114                                      const OMPTaskDataTy &Data) override;
2115 
2116   /// Emits the following code for reduction clause with task modifier:
2117   /// \code
2118   /// __kmpc_task_reduction_modifier_fini(loc, gtid, is_worksharing);
2119   /// \endcode
2120   void emitTaskReductionFini(CodeGenFunction &CGF, SourceLocation Loc,
2121                              bool IsWorksharingReduction) override;
2122 
2123   /// Required to resolve existing problems in the runtime. Emits threadprivate
2124   /// variables to store the size of the VLAs/array sections for
2125   /// initializer/combiner/finalizer functions + emits threadprivate variable to
2126   /// store the pointer to the original reduction item for the custom
2127   /// initializer defined by declare reduction construct.
2128   /// \param RCG Allows to reuse an existing data for the reductions.
2129   /// \param N Reduction item for which fixups must be emitted.
2130   void emitTaskReductionFixups(CodeGenFunction &CGF, SourceLocation Loc,
2131                                ReductionCodeGen &RCG, unsigned N) override;
2132 
2133   /// Get the address of `void *` type of the privatue copy of the reduction
2134   /// item specified by the \p SharedLVal.
2135   /// \param ReductionsPtr Pointer to the reduction data returned by the
2136   /// emitTaskReductionInit function.
2137   /// \param SharedLVal Address of the original reduction item.
2138   Address getTaskReductionItem(CodeGenFunction &CGF, SourceLocation Loc,
2139                                llvm::Value *ReductionsPtr,
2140                                LValue SharedLVal) override;
2141 
2142   /// Emit code for 'taskwait' directive.
2143   void emitTaskwaitCall(CodeGenFunction &CGF, SourceLocation Loc,
2144                         const OMPTaskDataTy &Data) override;
2145 
2146   /// Emit code for 'cancellation point' construct.
2147   /// \param CancelRegion Region kind for which the cancellation point must be
2148   /// emitted.
2149   ///
2150   void emitCancellationPointCall(CodeGenFunction &CGF, SourceLocation Loc,
2151                                  OpenMPDirectiveKind CancelRegion) override;
2152 
2153   /// Emit code for 'cancel' construct.
2154   /// \param IfCond Condition in the associated 'if' clause, if it was
2155   /// specified, nullptr otherwise.
2156   /// \param CancelRegion Region kind for which the cancel must be emitted.
2157   ///
2158   void emitCancelCall(CodeGenFunction &CGF, SourceLocation Loc,
2159                       const Expr *IfCond,
2160                       OpenMPDirectiveKind CancelRegion) override;
2161 
2162   /// Emit outilined function for 'target' directive.
2163   /// \param D Directive to emit.
2164   /// \param ParentName Name of the function that encloses the target region.
2165   /// \param OutlinedFn Outlined function value to be defined by this call.
2166   /// \param OutlinedFnID Outlined function ID value to be defined by this call.
2167   /// \param IsOffloadEntry True if the outlined function is an offload entry.
2168   /// \param CodeGen Code generation sequence for the \a D directive.
2169   /// An outlined function may not be an entry if, e.g. the if clause always
2170   /// evaluates to false.
2171   void emitTargetOutlinedFunction(const OMPExecutableDirective &D,
2172                                   StringRef ParentName,
2173                                   llvm::Function *&OutlinedFn,
2174                                   llvm::Constant *&OutlinedFnID,
2175                                   bool IsOffloadEntry,
2176                                   const RegionCodeGenTy &CodeGen) override;
2177 
2178   /// Emit the target offloading code associated with \a D. The emitted
2179   /// code attempts offloading the execution to the device, an the event of
2180   /// a failure it executes the host version outlined in \a OutlinedFn.
2181   /// \param D Directive to emit.
2182   /// \param OutlinedFn Host version of the code to be offloaded.
2183   /// \param OutlinedFnID ID of host version of the code to be offloaded.
2184   /// \param IfCond Expression evaluated in if clause associated with the target
2185   /// directive, or null if no if clause is used.
2186   /// \param Device Expression evaluated in device clause associated with the
2187   /// target directive, or null if no device clause is used and device modifier.
2188   void emitTargetCall(
2189       CodeGenFunction &CGF, const OMPExecutableDirective &D,
2190       llvm::Function *OutlinedFn, llvm::Value *OutlinedFnID, const Expr *IfCond,
2191       llvm::PointerIntPair<const Expr *, 2, OpenMPDeviceClauseModifier> Device,
2192       llvm::function_ref<llvm::Value *(CodeGenFunction &CGF,
2193                                        const OMPLoopDirective &D)>
2194           SizeEmitter) override;
2195 
2196   /// Emit the target regions enclosed in \a GD function definition or
2197   /// the function itself in case it is a valid device function. Returns true if
2198   /// \a GD was dealt with successfully.
2199   /// \param GD Function to scan.
2200   bool emitTargetFunctions(GlobalDecl GD) override;
2201 
2202   /// Emit the global variable if it is a valid device global variable.
2203   /// Returns true if \a GD was dealt with successfully.
2204   /// \param GD Variable declaration to emit.
2205   bool emitTargetGlobalVariable(GlobalDecl GD) override;
2206 
2207   /// Emit the global \a GD if it is meaningful for the target. Returns
2208   /// if it was emitted successfully.
2209   /// \param GD Global to scan.
2210   bool emitTargetGlobal(GlobalDecl GD) override;
2211 
2212   /// Emits code for teams call of the \a OutlinedFn with
2213   /// variables captured in a record which address is stored in \a
2214   /// CapturedStruct.
2215   /// \param OutlinedFn Outlined function to be run by team masters. Type of
2216   /// this function is void(*)(kmp_int32 *, kmp_int32, struct context_vars*).
2217   /// \param CapturedVars A pointer to the record with the references to
2218   /// variables used in \a OutlinedFn function.
2219   ///
2220   void emitTeamsCall(CodeGenFunction &CGF, const OMPExecutableDirective &D,
2221                      SourceLocation Loc, llvm::Function *OutlinedFn,
2222                      ArrayRef<llvm::Value *> CapturedVars) override;
2223 
2224   /// Emits call to void __kmpc_push_num_teams(ident_t *loc, kmp_int32
2225   /// global_tid, kmp_int32 num_teams, kmp_int32 thread_limit) to generate code
2226   /// for num_teams clause.
2227   /// \param NumTeams An integer expression of teams.
2228   /// \param ThreadLimit An integer expression of threads.
2229   void emitNumTeamsClause(CodeGenFunction &CGF, const Expr *NumTeams,
2230                           const Expr *ThreadLimit, SourceLocation Loc) override;
2231 
2232   /// Emit the target data mapping code associated with \a D.
2233   /// \param D Directive to emit.
2234   /// \param IfCond Expression evaluated in if clause associated with the
2235   /// target directive, or null if no device clause is used.
2236   /// \param Device Expression evaluated in device clause associated with the
2237   /// target directive, or null if no device clause is used.
2238   /// \param Info A record used to store information that needs to be preserved
2239   /// until the region is closed.
2240   void emitTargetDataCalls(CodeGenFunction &CGF,
2241                            const OMPExecutableDirective &D, const Expr *IfCond,
2242                            const Expr *Device, const RegionCodeGenTy &CodeGen,
2243                            CGOpenMPRuntime::TargetDataInfo &Info) override;
2244 
2245   /// Emit the data mapping/movement code associated with the directive
2246   /// \a D that should be of the form 'target [{enter|exit} data | update]'.
2247   /// \param D Directive to emit.
2248   /// \param IfCond Expression evaluated in if clause associated with the target
2249   /// directive, or null if no if clause is used.
2250   /// \param Device Expression evaluated in device clause associated with the
2251   /// target directive, or null if no device clause is used.
2252   void emitTargetDataStandAloneCall(CodeGenFunction &CGF,
2253                                     const OMPExecutableDirective &D,
2254                                     const Expr *IfCond,
2255                                     const Expr *Device) override;
2256 
2257   /// Emit initialization for doacross loop nesting support.
2258   /// \param D Loop-based construct used in doacross nesting construct.
2259   void emitDoacrossInit(CodeGenFunction &CGF, const OMPLoopDirective &D,
2260                         ArrayRef<Expr *> NumIterations) override;
2261 
2262   /// Emit code for doacross ordered directive with 'depend' clause.
2263   /// \param C 'depend' clause with 'sink|source' dependency kind.
2264   void emitDoacrossOrdered(CodeGenFunction &CGF,
2265                            const OMPDependClause *C) override;
2266 
2267   /// Emit code for doacross ordered directive with 'doacross' clause.
2268   /// \param C 'doacross' clause with 'sink|source' dependence type.
2269   void emitDoacrossOrdered(CodeGenFunction &CGF,
2270                            const OMPDoacrossClause *C) override;
2271 
2272   /// Translates the native parameter of outlined function if this is required
2273   /// for target.
2274   /// \param FD Field decl from captured record for the parameter.
2275   /// \param NativeParam Parameter itself.
2276   const VarDecl *translateParameter(const FieldDecl *FD,
2277                                     const VarDecl *NativeParam) const override;
2278 
2279   /// Gets the address of the native argument basing on the address of the
2280   /// target-specific parameter.
2281   /// \param NativeParam Parameter itself.
2282   /// \param TargetParam Corresponding target-specific parameter.
2283   Address getParameterAddress(CodeGenFunction &CGF, const VarDecl *NativeParam,
2284                               const VarDecl *TargetParam) const override;
2285 
2286   /// Gets the OpenMP-specific address of the local variable.
2287   Address getAddressOfLocalVariable(CodeGenFunction &CGF,
2288                                     const VarDecl *VD) override {
2289     return Address::invalid();
2290   }
2291 };
2292 
2293 } // namespace CodeGen
2294 // Utility for openmp doacross clause kind
2295 namespace {
2296 template <typename T> class OMPDoacrossKind {
2297 public:
2298   bool isSink(const T *) { return false; }
2299   bool isSource(const T *) { return false; }
2300 };
2301 template <> class OMPDoacrossKind<OMPDependClause> {
2302 public:
2303   bool isSink(const OMPDependClause *C) {
2304     return C->getDependencyKind() == OMPC_DEPEND_sink;
2305   }
2306   bool isSource(const OMPDependClause *C) {
2307     return C->getDependencyKind() == OMPC_DEPEND_source;
2308   }
2309 };
2310 template <> class OMPDoacrossKind<OMPDoacrossClause> {
2311 public:
2312   bool isSource(const OMPDoacrossClause *C) {
2313     return C->getDependenceType() == OMPC_DOACROSS_source ||
2314            C->getDependenceType() == OMPC_DOACROSS_source_omp_cur_iteration;
2315   }
2316   bool isSink(const OMPDoacrossClause *C) {
2317     return C->getDependenceType() == OMPC_DOACROSS_sink ||
2318            C->getDependenceType() == OMPC_DOACROSS_sink_omp_cur_iteration;
2319   }
2320 };
2321 } // namespace
2322 } // namespace clang
2323 
2324 #endif
2325