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