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