1 //===--- StmtOpenMP.cpp - Classes for OpenMP directives -------------------===// 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 file implements the subclasses of Stmt class declared in StmtOpenMP.h 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/AST/ASTContext.h" 14 #include "clang/AST/StmtOpenMP.h" 15 16 using namespace clang; 17 using namespace llvm::omp; 18 19 size_t OMPChildren::size(unsigned NumClauses, bool HasAssociatedStmt, 20 unsigned NumChildren) { 21 return llvm::alignTo( 22 totalSizeToAlloc<OMPClause *, Stmt *>( 23 NumClauses, NumChildren + (HasAssociatedStmt ? 1 : 0)), 24 alignof(OMPChildren)); 25 } 26 27 void OMPChildren::setClauses(ArrayRef<OMPClause *> Clauses) { 28 assert(Clauses.size() == NumClauses && 29 "Number of clauses is not the same as the preallocated buffer"); 30 llvm::copy(Clauses, getTrailingObjects<OMPClause *>()); 31 } 32 33 MutableArrayRef<Stmt *> OMPChildren::getChildren() { 34 return llvm::MutableArrayRef(getTrailingObjects<Stmt *>(), NumChildren); 35 } 36 37 OMPChildren *OMPChildren::Create(void *Mem, ArrayRef<OMPClause *> Clauses) { 38 auto *Data = CreateEmpty(Mem, Clauses.size()); 39 Data->setClauses(Clauses); 40 return Data; 41 } 42 43 OMPChildren *OMPChildren::Create(void *Mem, ArrayRef<OMPClause *> Clauses, 44 Stmt *S, unsigned NumChildren) { 45 auto *Data = CreateEmpty(Mem, Clauses.size(), S, NumChildren); 46 Data->setClauses(Clauses); 47 if (S) 48 Data->setAssociatedStmt(S); 49 return Data; 50 } 51 52 OMPChildren *OMPChildren::CreateEmpty(void *Mem, unsigned NumClauses, 53 bool HasAssociatedStmt, 54 unsigned NumChildren) { 55 return new (Mem) OMPChildren(NumClauses, NumChildren, HasAssociatedStmt); 56 } 57 58 bool OMPExecutableDirective::isStandaloneDirective() const { 59 // Special case: 'omp target enter data', 'omp target exit data', 60 // 'omp target update' are stand-alone directives, but for implementation 61 // reasons they have empty synthetic structured block, to simplify codegen. 62 if (isa<OMPTargetEnterDataDirective>(this) || 63 isa<OMPTargetExitDataDirective>(this) || 64 isa<OMPTargetUpdateDirective>(this)) 65 return true; 66 return !hasAssociatedStmt(); 67 } 68 69 Stmt *OMPExecutableDirective::getStructuredBlock() { 70 assert(!isStandaloneDirective() && 71 "Standalone Executable Directives don't have Structured Blocks."); 72 if (auto *LD = dyn_cast<OMPLoopDirective>(this)) 73 return LD->getBody(); 74 return getRawStmt(); 75 } 76 77 Stmt * 78 OMPLoopBasedDirective::tryToFindNextInnerLoop(Stmt *CurStmt, 79 bool TryImperfectlyNestedLoops) { 80 Stmt *OrigStmt = CurStmt; 81 CurStmt = CurStmt->IgnoreContainers(); 82 // Additional work for imperfectly nested loops, introduced in OpenMP 5.0. 83 if (TryImperfectlyNestedLoops) { 84 if (auto *CS = dyn_cast<CompoundStmt>(CurStmt)) { 85 CurStmt = nullptr; 86 SmallVector<CompoundStmt *, 4> Statements(1, CS); 87 SmallVector<CompoundStmt *, 4> NextStatements; 88 while (!Statements.empty()) { 89 CS = Statements.pop_back_val(); 90 if (!CS) 91 continue; 92 for (Stmt *S : CS->body()) { 93 if (!S) 94 continue; 95 if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(S)) 96 S = CanonLoop->getLoopStmt(); 97 if (isa<ForStmt>(S) || isa<CXXForRangeStmt>(S) || 98 (isa<OMPLoopBasedDirective>(S) && !isa<OMPLoopDirective>(S))) { 99 // Only single loop construct is allowed. 100 if (CurStmt) { 101 CurStmt = OrigStmt; 102 break; 103 } 104 CurStmt = S; 105 continue; 106 } 107 S = S->IgnoreContainers(); 108 if (auto *InnerCS = dyn_cast_or_null<CompoundStmt>(S)) 109 NextStatements.push_back(InnerCS); 110 } 111 if (Statements.empty()) { 112 // Found single inner loop or multiple loops - exit. 113 if (CurStmt) 114 break; 115 Statements.swap(NextStatements); 116 } 117 } 118 if (!CurStmt) 119 CurStmt = OrigStmt; 120 } 121 } 122 return CurStmt; 123 } 124 125 bool OMPLoopBasedDirective::doForAllLoops( 126 Stmt *CurStmt, bool TryImperfectlyNestedLoops, unsigned NumLoops, 127 llvm::function_ref<bool(unsigned, Stmt *)> Callback, 128 llvm::function_ref<void(OMPLoopTransformationDirective *)> 129 OnTransformationCallback) { 130 CurStmt = CurStmt->IgnoreContainers(); 131 for (unsigned Cnt = 0; Cnt < NumLoops; ++Cnt) { 132 while (true) { 133 auto *Dir = dyn_cast<OMPLoopTransformationDirective>(CurStmt); 134 if (!Dir) 135 break; 136 137 OnTransformationCallback(Dir); 138 139 Stmt *TransformedStmt = Dir->getTransformedStmt(); 140 if (!TransformedStmt) { 141 unsigned NumGeneratedLoops = Dir->getNumGeneratedLoops(); 142 if (NumGeneratedLoops == 0) { 143 // May happen if the loop transformation does not result in a 144 // generated loop (such as full unrolling). 145 break; 146 } 147 if (NumGeneratedLoops > 0) { 148 // The loop transformation construct has generated loops, but these 149 // may not have been generated yet due to being in a dependent 150 // context. 151 return true; 152 } 153 } 154 155 CurStmt = TransformedStmt; 156 } 157 if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(CurStmt)) 158 CurStmt = CanonLoop->getLoopStmt(); 159 if (Callback(Cnt, CurStmt)) 160 return false; 161 // Move on to the next nested for loop, or to the loop body. 162 // OpenMP [2.8.1, simd construct, Restrictions] 163 // All loops associated with the construct must be perfectly nested; that 164 // is, there must be no intervening code nor any OpenMP directive between 165 // any two loops. 166 if (auto *For = dyn_cast<ForStmt>(CurStmt)) { 167 CurStmt = For->getBody(); 168 } else { 169 assert(isa<CXXForRangeStmt>(CurStmt) && 170 "Expected canonical for or range-based for loops."); 171 CurStmt = cast<CXXForRangeStmt>(CurStmt)->getBody(); 172 } 173 CurStmt = OMPLoopBasedDirective::tryToFindNextInnerLoop( 174 CurStmt, TryImperfectlyNestedLoops); 175 } 176 return true; 177 } 178 179 void OMPLoopBasedDirective::doForAllLoopsBodies( 180 Stmt *CurStmt, bool TryImperfectlyNestedLoops, unsigned NumLoops, 181 llvm::function_ref<void(unsigned, Stmt *, Stmt *)> Callback) { 182 bool Res = OMPLoopBasedDirective::doForAllLoops( 183 CurStmt, TryImperfectlyNestedLoops, NumLoops, 184 [Callback](unsigned Cnt, Stmt *Loop) { 185 Stmt *Body = nullptr; 186 if (auto *For = dyn_cast<ForStmt>(Loop)) { 187 Body = For->getBody(); 188 } else { 189 assert(isa<CXXForRangeStmt>(Loop) && 190 "Expected canonical for or range-based for loops."); 191 Body = cast<CXXForRangeStmt>(Loop)->getBody(); 192 } 193 if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(Body)) 194 Body = CanonLoop->getLoopStmt(); 195 Callback(Cnt, Loop, Body); 196 return false; 197 }); 198 assert(Res && "Expected only loops"); 199 (void)Res; 200 } 201 202 Stmt *OMPLoopDirective::getBody() { 203 // This relies on the loop form is already checked by Sema. 204 Stmt *Body = nullptr; 205 OMPLoopBasedDirective::doForAllLoopsBodies( 206 Data->getRawStmt(), /*TryImperfectlyNestedLoops=*/true, 207 NumAssociatedLoops, 208 [&Body](unsigned, Stmt *, Stmt *BodyStmt) { Body = BodyStmt; }); 209 return Body; 210 } 211 212 void OMPLoopDirective::setCounters(ArrayRef<Expr *> A) { 213 assert(A.size() == getLoopsNumber() && 214 "Number of loop counters is not the same as the collapsed number"); 215 llvm::copy(A, getCounters().begin()); 216 } 217 218 void OMPLoopDirective::setPrivateCounters(ArrayRef<Expr *> A) { 219 assert(A.size() == getLoopsNumber() && "Number of loop private counters " 220 "is not the same as the collapsed " 221 "number"); 222 llvm::copy(A, getPrivateCounters().begin()); 223 } 224 225 void OMPLoopDirective::setInits(ArrayRef<Expr *> A) { 226 assert(A.size() == getLoopsNumber() && 227 "Number of counter inits is not the same as the collapsed number"); 228 llvm::copy(A, getInits().begin()); 229 } 230 231 void OMPLoopDirective::setUpdates(ArrayRef<Expr *> A) { 232 assert(A.size() == getLoopsNumber() && 233 "Number of counter updates is not the same as the collapsed number"); 234 llvm::copy(A, getUpdates().begin()); 235 } 236 237 void OMPLoopDirective::setFinals(ArrayRef<Expr *> A) { 238 assert(A.size() == getLoopsNumber() && 239 "Number of counter finals is not the same as the collapsed number"); 240 llvm::copy(A, getFinals().begin()); 241 } 242 243 void OMPLoopDirective::setDependentCounters(ArrayRef<Expr *> A) { 244 assert( 245 A.size() == getLoopsNumber() && 246 "Number of dependent counters is not the same as the collapsed number"); 247 llvm::copy(A, getDependentCounters().begin()); 248 } 249 250 void OMPLoopDirective::setDependentInits(ArrayRef<Expr *> A) { 251 assert(A.size() == getLoopsNumber() && 252 "Number of dependent inits is not the same as the collapsed number"); 253 llvm::copy(A, getDependentInits().begin()); 254 } 255 256 void OMPLoopDirective::setFinalsConditions(ArrayRef<Expr *> A) { 257 assert(A.size() == getLoopsNumber() && 258 "Number of finals conditions is not the same as the collapsed number"); 259 llvm::copy(A, getFinalsConditions().begin()); 260 } 261 262 OMPMetaDirective *OMPMetaDirective::Create(const ASTContext &C, 263 SourceLocation StartLoc, 264 SourceLocation EndLoc, 265 ArrayRef<OMPClause *> Clauses, 266 Stmt *AssociatedStmt, Stmt *IfStmt) { 267 auto *Dir = createDirective<OMPMetaDirective>( 268 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc); 269 Dir->setIfStmt(IfStmt); 270 return Dir; 271 } 272 273 OMPMetaDirective *OMPMetaDirective::CreateEmpty(const ASTContext &C, 274 unsigned NumClauses, 275 EmptyShell) { 276 return createEmptyDirective<OMPMetaDirective>(C, NumClauses, 277 /*HasAssociatedStmt=*/true, 278 /*NumChildren=*/1); 279 } 280 281 OMPParallelDirective *OMPParallelDirective::Create( 282 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 283 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef, 284 bool HasCancel) { 285 auto *Dir = createDirective<OMPParallelDirective>( 286 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc); 287 Dir->setTaskReductionRefExpr(TaskRedRef); 288 Dir->setHasCancel(HasCancel); 289 return Dir; 290 } 291 292 OMPParallelDirective *OMPParallelDirective::CreateEmpty(const ASTContext &C, 293 unsigned NumClauses, 294 EmptyShell) { 295 return createEmptyDirective<OMPParallelDirective>(C, NumClauses, 296 /*HasAssociatedStmt=*/true, 297 /*NumChildren=*/1); 298 } 299 300 OMPSimdDirective * 301 OMPSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc, 302 SourceLocation EndLoc, unsigned CollapsedNum, 303 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 304 const HelperExprs &Exprs) { 305 auto *Dir = createDirective<OMPSimdDirective>( 306 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_simd), 307 StartLoc, EndLoc, CollapsedNum); 308 Dir->setIterationVariable(Exprs.IterationVarRef); 309 Dir->setLastIteration(Exprs.LastIteration); 310 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 311 Dir->setPreCond(Exprs.PreCond); 312 Dir->setCond(Exprs.Cond); 313 Dir->setInit(Exprs.Init); 314 Dir->setInc(Exprs.Inc); 315 Dir->setCounters(Exprs.Counters); 316 Dir->setPrivateCounters(Exprs.PrivateCounters); 317 Dir->setInits(Exprs.Inits); 318 Dir->setUpdates(Exprs.Updates); 319 Dir->setFinals(Exprs.Finals); 320 Dir->setDependentCounters(Exprs.DependentCounters); 321 Dir->setDependentInits(Exprs.DependentInits); 322 Dir->setFinalsConditions(Exprs.FinalsConditions); 323 Dir->setPreInits(Exprs.PreInits); 324 return Dir; 325 } 326 327 OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C, 328 unsigned NumClauses, 329 unsigned CollapsedNum, 330 EmptyShell) { 331 return createEmptyDirective<OMPSimdDirective>( 332 C, NumClauses, /*HasAssociatedStmt=*/true, 333 numLoopChildren(CollapsedNum, OMPD_simd), CollapsedNum); 334 } 335 336 OMPForDirective *OMPForDirective::Create( 337 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 338 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 339 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) { 340 auto *Dir = createDirective<OMPForDirective>( 341 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_for) + 1, 342 StartLoc, EndLoc, CollapsedNum); 343 Dir->setIterationVariable(Exprs.IterationVarRef); 344 Dir->setLastIteration(Exprs.LastIteration); 345 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 346 Dir->setPreCond(Exprs.PreCond); 347 Dir->setCond(Exprs.Cond); 348 Dir->setInit(Exprs.Init); 349 Dir->setInc(Exprs.Inc); 350 Dir->setIsLastIterVariable(Exprs.IL); 351 Dir->setLowerBoundVariable(Exprs.LB); 352 Dir->setUpperBoundVariable(Exprs.UB); 353 Dir->setStrideVariable(Exprs.ST); 354 Dir->setEnsureUpperBound(Exprs.EUB); 355 Dir->setNextLowerBound(Exprs.NLB); 356 Dir->setNextUpperBound(Exprs.NUB); 357 Dir->setNumIterations(Exprs.NumIterations); 358 Dir->setCounters(Exprs.Counters); 359 Dir->setPrivateCounters(Exprs.PrivateCounters); 360 Dir->setInits(Exprs.Inits); 361 Dir->setUpdates(Exprs.Updates); 362 Dir->setFinals(Exprs.Finals); 363 Dir->setDependentCounters(Exprs.DependentCounters); 364 Dir->setDependentInits(Exprs.DependentInits); 365 Dir->setFinalsConditions(Exprs.FinalsConditions); 366 Dir->setPreInits(Exprs.PreInits); 367 Dir->setTaskReductionRefExpr(TaskRedRef); 368 Dir->setHasCancel(HasCancel); 369 return Dir; 370 } 371 372 Stmt *OMPLoopTransformationDirective::getTransformedStmt() const { 373 switch (getStmtClass()) { 374 #define STMT(CLASS, PARENT) 375 #define ABSTRACT_STMT(CLASS) 376 #define OMPLOOPTRANSFORMATIONDIRECTIVE(CLASS, PARENT) \ 377 case Stmt::CLASS##Class: \ 378 return static_cast<const CLASS *>(this)->getTransformedStmt(); 379 #include "clang/AST/StmtNodes.inc" 380 default: 381 llvm_unreachable("Not a loop transformation"); 382 } 383 } 384 385 Stmt *OMPLoopTransformationDirective::getPreInits() const { 386 switch (getStmtClass()) { 387 #define STMT(CLASS, PARENT) 388 #define ABSTRACT_STMT(CLASS) 389 #define OMPLOOPTRANSFORMATIONDIRECTIVE(CLASS, PARENT) \ 390 case Stmt::CLASS##Class: \ 391 return static_cast<const CLASS *>(this)->getPreInits(); 392 #include "clang/AST/StmtNodes.inc" 393 default: 394 llvm_unreachable("Not a loop transformation"); 395 } 396 } 397 398 OMPForDirective *OMPForDirective::CreateEmpty(const ASTContext &C, 399 unsigned NumClauses, 400 unsigned CollapsedNum, 401 EmptyShell) { 402 return createEmptyDirective<OMPForDirective>( 403 C, NumClauses, /*HasAssociatedStmt=*/true, 404 numLoopChildren(CollapsedNum, OMPD_for) + 1, CollapsedNum); 405 } 406 407 OMPTileDirective * 408 OMPTileDirective::Create(const ASTContext &C, SourceLocation StartLoc, 409 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses, 410 unsigned NumLoops, Stmt *AssociatedStmt, 411 Stmt *TransformedStmt, Stmt *PreInits) { 412 OMPTileDirective *Dir = createDirective<OMPTileDirective>( 413 C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc, 414 NumLoops); 415 Dir->setTransformedStmt(TransformedStmt); 416 Dir->setPreInits(PreInits); 417 return Dir; 418 } 419 420 OMPTileDirective *OMPTileDirective::CreateEmpty(const ASTContext &C, 421 unsigned NumClauses, 422 unsigned NumLoops) { 423 return createEmptyDirective<OMPTileDirective>( 424 C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1, 425 SourceLocation(), SourceLocation(), NumLoops); 426 } 427 428 OMPUnrollDirective * 429 OMPUnrollDirective::Create(const ASTContext &C, SourceLocation StartLoc, 430 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses, 431 Stmt *AssociatedStmt, unsigned NumGeneratedLoops, 432 Stmt *TransformedStmt, Stmt *PreInits) { 433 assert(NumGeneratedLoops <= 1 && "Unrolling generates at most one loop"); 434 435 auto *Dir = createDirective<OMPUnrollDirective>( 436 C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc); 437 Dir->setNumGeneratedLoops(NumGeneratedLoops); 438 Dir->setTransformedStmt(TransformedStmt); 439 Dir->setPreInits(PreInits); 440 return Dir; 441 } 442 443 OMPUnrollDirective *OMPUnrollDirective::CreateEmpty(const ASTContext &C, 444 unsigned NumClauses) { 445 return createEmptyDirective<OMPUnrollDirective>( 446 C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1, 447 SourceLocation(), SourceLocation()); 448 } 449 450 OMPReverseDirective * 451 OMPReverseDirective::Create(const ASTContext &C, SourceLocation StartLoc, 452 SourceLocation EndLoc, Stmt *AssociatedStmt, 453 Stmt *TransformedStmt, Stmt *PreInits) { 454 OMPReverseDirective *Dir = createDirective<OMPReverseDirective>( 455 C, {}, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc); 456 Dir->setTransformedStmt(TransformedStmt); 457 Dir->setPreInits(PreInits); 458 return Dir; 459 } 460 461 OMPReverseDirective *OMPReverseDirective::CreateEmpty(const ASTContext &C) { 462 return createEmptyDirective<OMPReverseDirective>( 463 C, /*NumClauses=*/0, /*HasAssociatedStmt=*/true, 464 TransformedStmtOffset + 1, SourceLocation(), SourceLocation()); 465 } 466 467 OMPInterchangeDirective *OMPInterchangeDirective::Create( 468 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 469 ArrayRef<OMPClause *> Clauses, unsigned NumLoops, Stmt *AssociatedStmt, 470 Stmt *TransformedStmt, Stmt *PreInits) { 471 OMPInterchangeDirective *Dir = createDirective<OMPInterchangeDirective>( 472 C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc, 473 NumLoops); 474 Dir->setTransformedStmt(TransformedStmt); 475 Dir->setPreInits(PreInits); 476 return Dir; 477 } 478 479 OMPInterchangeDirective * 480 OMPInterchangeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 481 unsigned NumLoops) { 482 return createEmptyDirective<OMPInterchangeDirective>( 483 C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1, 484 SourceLocation(), SourceLocation(), NumLoops); 485 } 486 487 OMPForSimdDirective * 488 OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc, 489 SourceLocation EndLoc, unsigned CollapsedNum, 490 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 491 const HelperExprs &Exprs) { 492 auto *Dir = createDirective<OMPForSimdDirective>( 493 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_for_simd), 494 StartLoc, EndLoc, CollapsedNum); 495 Dir->setIterationVariable(Exprs.IterationVarRef); 496 Dir->setLastIteration(Exprs.LastIteration); 497 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 498 Dir->setPreCond(Exprs.PreCond); 499 Dir->setCond(Exprs.Cond); 500 Dir->setInit(Exprs.Init); 501 Dir->setInc(Exprs.Inc); 502 Dir->setIsLastIterVariable(Exprs.IL); 503 Dir->setLowerBoundVariable(Exprs.LB); 504 Dir->setUpperBoundVariable(Exprs.UB); 505 Dir->setStrideVariable(Exprs.ST); 506 Dir->setEnsureUpperBound(Exprs.EUB); 507 Dir->setNextLowerBound(Exprs.NLB); 508 Dir->setNextUpperBound(Exprs.NUB); 509 Dir->setNumIterations(Exprs.NumIterations); 510 Dir->setCounters(Exprs.Counters); 511 Dir->setPrivateCounters(Exprs.PrivateCounters); 512 Dir->setInits(Exprs.Inits); 513 Dir->setUpdates(Exprs.Updates); 514 Dir->setFinals(Exprs.Finals); 515 Dir->setDependentCounters(Exprs.DependentCounters); 516 Dir->setDependentInits(Exprs.DependentInits); 517 Dir->setFinalsConditions(Exprs.FinalsConditions); 518 Dir->setPreInits(Exprs.PreInits); 519 return Dir; 520 } 521 522 OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C, 523 unsigned NumClauses, 524 unsigned CollapsedNum, 525 EmptyShell) { 526 return createEmptyDirective<OMPForSimdDirective>( 527 C, NumClauses, /*HasAssociatedStmt=*/true, 528 numLoopChildren(CollapsedNum, OMPD_for_simd), CollapsedNum); 529 } 530 531 OMPSectionsDirective *OMPSectionsDirective::Create( 532 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 533 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef, 534 bool HasCancel) { 535 auto *Dir = createDirective<OMPSectionsDirective>(C, Clauses, AssociatedStmt, 536 /*NumChildren=*/1, StartLoc, 537 EndLoc); 538 Dir->setTaskReductionRefExpr(TaskRedRef); 539 Dir->setHasCancel(HasCancel); 540 return Dir; 541 } 542 543 OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C, 544 unsigned NumClauses, 545 EmptyShell) { 546 return createEmptyDirective<OMPSectionsDirective>(C, NumClauses, 547 /*HasAssociatedStmt=*/true, 548 /*NumChildren=*/1); 549 } 550 551 OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C, 552 SourceLocation StartLoc, 553 SourceLocation EndLoc, 554 Stmt *AssociatedStmt, 555 bool HasCancel) { 556 auto *Dir = 557 createDirective<OMPSectionDirective>(C, {}, AssociatedStmt, 558 /*NumChildren=*/0, StartLoc, EndLoc); 559 Dir->setHasCancel(HasCancel); 560 return Dir; 561 } 562 563 OMPSectionDirective *OMPSectionDirective::CreateEmpty(const ASTContext &C, 564 EmptyShell) { 565 return createEmptyDirective<OMPSectionDirective>(C, /*NumClauses=*/0, 566 /*HasAssociatedStmt=*/true); 567 } 568 569 OMPScopeDirective *OMPScopeDirective::Create(const ASTContext &C, 570 SourceLocation StartLoc, 571 SourceLocation EndLoc, 572 ArrayRef<OMPClause *> Clauses, 573 Stmt *AssociatedStmt) { 574 return createDirective<OMPScopeDirective>(C, Clauses, AssociatedStmt, 575 /*NumChildren=*/0, StartLoc, 576 EndLoc); 577 } 578 579 OMPScopeDirective *OMPScopeDirective::CreateEmpty(const ASTContext &C, 580 unsigned NumClauses, 581 EmptyShell) { 582 return createEmptyDirective<OMPScopeDirective>(C, NumClauses, 583 /*HasAssociatedStmt=*/true); 584 } 585 586 OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C, 587 SourceLocation StartLoc, 588 SourceLocation EndLoc, 589 ArrayRef<OMPClause *> Clauses, 590 Stmt *AssociatedStmt) { 591 return createDirective<OMPSingleDirective>(C, Clauses, AssociatedStmt, 592 /*NumChildren=*/0, StartLoc, 593 EndLoc); 594 } 595 596 OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C, 597 unsigned NumClauses, 598 EmptyShell) { 599 return createEmptyDirective<OMPSingleDirective>(C, NumClauses, 600 /*HasAssociatedStmt=*/true); 601 } 602 603 OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C, 604 SourceLocation StartLoc, 605 SourceLocation EndLoc, 606 Stmt *AssociatedStmt) { 607 return createDirective<OMPMasterDirective>(C, {}, AssociatedStmt, 608 /*NumChildren=*/0, StartLoc, 609 EndLoc); 610 } 611 612 OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C, 613 EmptyShell) { 614 return createEmptyDirective<OMPMasterDirective>(C, /*NumClauses=*/0, 615 /*HasAssociatedStmt=*/true); 616 } 617 618 OMPCriticalDirective *OMPCriticalDirective::Create( 619 const ASTContext &C, const DeclarationNameInfo &Name, 620 SourceLocation StartLoc, SourceLocation EndLoc, 621 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 622 return createDirective<OMPCriticalDirective>(C, Clauses, AssociatedStmt, 623 /*NumChildren=*/0, Name, 624 StartLoc, EndLoc); 625 } 626 627 OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C, 628 unsigned NumClauses, 629 EmptyShell) { 630 return createEmptyDirective<OMPCriticalDirective>(C, NumClauses, 631 /*HasAssociatedStmt=*/true); 632 } 633 634 OMPParallelForDirective *OMPParallelForDirective::Create( 635 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 636 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 637 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) { 638 auto *Dir = createDirective<OMPParallelForDirective>( 639 C, Clauses, AssociatedStmt, 640 numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, StartLoc, EndLoc, 641 CollapsedNum); 642 Dir->setIterationVariable(Exprs.IterationVarRef); 643 Dir->setLastIteration(Exprs.LastIteration); 644 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 645 Dir->setPreCond(Exprs.PreCond); 646 Dir->setCond(Exprs.Cond); 647 Dir->setInit(Exprs.Init); 648 Dir->setInc(Exprs.Inc); 649 Dir->setIsLastIterVariable(Exprs.IL); 650 Dir->setLowerBoundVariable(Exprs.LB); 651 Dir->setUpperBoundVariable(Exprs.UB); 652 Dir->setStrideVariable(Exprs.ST); 653 Dir->setEnsureUpperBound(Exprs.EUB); 654 Dir->setNextLowerBound(Exprs.NLB); 655 Dir->setNextUpperBound(Exprs.NUB); 656 Dir->setNumIterations(Exprs.NumIterations); 657 Dir->setCounters(Exprs.Counters); 658 Dir->setPrivateCounters(Exprs.PrivateCounters); 659 Dir->setInits(Exprs.Inits); 660 Dir->setUpdates(Exprs.Updates); 661 Dir->setFinals(Exprs.Finals); 662 Dir->setDependentCounters(Exprs.DependentCounters); 663 Dir->setDependentInits(Exprs.DependentInits); 664 Dir->setFinalsConditions(Exprs.FinalsConditions); 665 Dir->setPreInits(Exprs.PreInits); 666 Dir->setTaskReductionRefExpr(TaskRedRef); 667 Dir->setHasCancel(HasCancel); 668 return Dir; 669 } 670 671 OMPParallelForDirective * 672 OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 673 unsigned CollapsedNum, EmptyShell) { 674 return createEmptyDirective<OMPParallelForDirective>( 675 C, NumClauses, /*HasAssociatedStmt=*/true, 676 numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, CollapsedNum); 677 } 678 679 OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create( 680 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 681 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 682 const HelperExprs &Exprs) { 683 auto *Dir = createDirective<OMPParallelForSimdDirective>( 684 C, Clauses, AssociatedStmt, 685 numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), StartLoc, EndLoc, 686 CollapsedNum); 687 Dir->setIterationVariable(Exprs.IterationVarRef); 688 Dir->setLastIteration(Exprs.LastIteration); 689 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 690 Dir->setPreCond(Exprs.PreCond); 691 Dir->setCond(Exprs.Cond); 692 Dir->setInit(Exprs.Init); 693 Dir->setInc(Exprs.Inc); 694 Dir->setIsLastIterVariable(Exprs.IL); 695 Dir->setLowerBoundVariable(Exprs.LB); 696 Dir->setUpperBoundVariable(Exprs.UB); 697 Dir->setStrideVariable(Exprs.ST); 698 Dir->setEnsureUpperBound(Exprs.EUB); 699 Dir->setNextLowerBound(Exprs.NLB); 700 Dir->setNextUpperBound(Exprs.NUB); 701 Dir->setNumIterations(Exprs.NumIterations); 702 Dir->setCounters(Exprs.Counters); 703 Dir->setPrivateCounters(Exprs.PrivateCounters); 704 Dir->setInits(Exprs.Inits); 705 Dir->setUpdates(Exprs.Updates); 706 Dir->setFinals(Exprs.Finals); 707 Dir->setDependentCounters(Exprs.DependentCounters); 708 Dir->setDependentInits(Exprs.DependentInits); 709 Dir->setFinalsConditions(Exprs.FinalsConditions); 710 Dir->setPreInits(Exprs.PreInits); 711 return Dir; 712 } 713 714 OMPParallelForSimdDirective * 715 OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C, 716 unsigned NumClauses, 717 unsigned CollapsedNum, EmptyShell) { 718 return createEmptyDirective<OMPParallelForSimdDirective>( 719 C, NumClauses, /*HasAssociatedStmt=*/true, 720 numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), CollapsedNum); 721 } 722 723 OMPParallelMasterDirective *OMPParallelMasterDirective::Create( 724 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 725 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef) { 726 auto *Dir = createDirective<OMPParallelMasterDirective>( 727 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc); 728 Dir->setTaskReductionRefExpr(TaskRedRef); 729 return Dir; 730 } 731 732 OMPParallelMasterDirective * 733 OMPParallelMasterDirective::CreateEmpty(const ASTContext &C, 734 unsigned NumClauses, EmptyShell) { 735 return createEmptyDirective<OMPParallelMasterDirective>( 736 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1); 737 } 738 739 OMPParallelMaskedDirective *OMPParallelMaskedDirective::Create( 740 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 741 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef) { 742 auto *Dir = createDirective<OMPParallelMaskedDirective>( 743 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc); 744 Dir->setTaskReductionRefExpr(TaskRedRef); 745 return Dir; 746 } 747 748 OMPParallelMaskedDirective * 749 OMPParallelMaskedDirective::CreateEmpty(const ASTContext &C, 750 unsigned NumClauses, EmptyShell) { 751 return createEmptyDirective<OMPParallelMaskedDirective>( 752 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1); 753 } 754 755 OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create( 756 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 757 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef, 758 bool HasCancel) { 759 auto *Dir = createDirective<OMPParallelSectionsDirective>( 760 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc); 761 Dir->setTaskReductionRefExpr(TaskRedRef); 762 Dir->setHasCancel(HasCancel); 763 return Dir; 764 } 765 766 OMPParallelSectionsDirective * 767 OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C, 768 unsigned NumClauses, EmptyShell) { 769 return createEmptyDirective<OMPParallelSectionsDirective>( 770 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1); 771 } 772 773 OMPTaskDirective * 774 OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc, 775 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses, 776 Stmt *AssociatedStmt, bool HasCancel) { 777 auto *Dir = createDirective<OMPTaskDirective>( 778 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc); 779 Dir->setHasCancel(HasCancel); 780 return Dir; 781 } 782 783 OMPTaskDirective *OMPTaskDirective::CreateEmpty(const ASTContext &C, 784 unsigned NumClauses, 785 EmptyShell) { 786 return createEmptyDirective<OMPTaskDirective>(C, NumClauses, 787 /*HasAssociatedStmt=*/true); 788 } 789 790 OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C, 791 SourceLocation StartLoc, 792 SourceLocation EndLoc) { 793 return new (C) OMPTaskyieldDirective(StartLoc, EndLoc); 794 } 795 796 OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C, 797 EmptyShell) { 798 return new (C) OMPTaskyieldDirective(); 799 } 800 801 OMPAssumeDirective *OMPAssumeDirective::Create(const ASTContext &C, 802 SourceLocation StartLoc, 803 SourceLocation EndLoc, 804 ArrayRef<OMPClause *> Clauses, 805 Stmt *AStmt) { 806 return createDirective<OMPAssumeDirective>(C, Clauses, AStmt, 807 /*NumChildren=*/0, StartLoc, 808 EndLoc); 809 } 810 811 OMPAssumeDirective *OMPAssumeDirective::CreateEmpty(const ASTContext &C, 812 unsigned NumClauses, 813 EmptyShell) { 814 return createEmptyDirective<OMPAssumeDirective>(C, NumClauses, 815 /*HasAssociatedStmt=*/true); 816 } 817 818 OMPErrorDirective *OMPErrorDirective::Create(const ASTContext &C, 819 SourceLocation StartLoc, 820 SourceLocation EndLoc, 821 ArrayRef<OMPClause *> Clauses) { 822 return createDirective<OMPErrorDirective>( 823 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc, 824 EndLoc); 825 } 826 827 OMPErrorDirective *OMPErrorDirective::CreateEmpty(const ASTContext &C, 828 unsigned NumClauses, 829 EmptyShell) { 830 return createEmptyDirective<OMPErrorDirective>(C, NumClauses); 831 } 832 833 OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C, 834 SourceLocation StartLoc, 835 SourceLocation EndLoc) { 836 return new (C) OMPBarrierDirective(StartLoc, EndLoc); 837 } 838 839 OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C, 840 EmptyShell) { 841 return new (C) OMPBarrierDirective(); 842 } 843 844 OMPTaskwaitDirective * 845 OMPTaskwaitDirective::Create(const ASTContext &C, SourceLocation StartLoc, 846 SourceLocation EndLoc, 847 ArrayRef<OMPClause *> Clauses) { 848 return createDirective<OMPTaskwaitDirective>( 849 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc, 850 EndLoc); 851 } 852 853 OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C, 854 unsigned NumClauses, 855 EmptyShell) { 856 return createEmptyDirective<OMPTaskwaitDirective>(C, NumClauses); 857 } 858 859 OMPTaskgroupDirective *OMPTaskgroupDirective::Create( 860 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 861 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *ReductionRef) { 862 auto *Dir = createDirective<OMPTaskgroupDirective>( 863 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc); 864 Dir->setReductionRef(ReductionRef); 865 return Dir; 866 } 867 868 OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C, 869 unsigned NumClauses, 870 EmptyShell) { 871 return createEmptyDirective<OMPTaskgroupDirective>( 872 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1); 873 } 874 875 OMPCancellationPointDirective *OMPCancellationPointDirective::Create( 876 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 877 OpenMPDirectiveKind CancelRegion) { 878 auto *Dir = new (C) OMPCancellationPointDirective(StartLoc, EndLoc); 879 Dir->setCancelRegion(CancelRegion); 880 return Dir; 881 } 882 883 OMPCancellationPointDirective * 884 OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) { 885 return new (C) OMPCancellationPointDirective(); 886 } 887 888 OMPCancelDirective * 889 OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc, 890 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses, 891 OpenMPDirectiveKind CancelRegion) { 892 auto *Dir = createDirective<OMPCancelDirective>( 893 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc, 894 EndLoc); 895 Dir->setCancelRegion(CancelRegion); 896 return Dir; 897 } 898 899 OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C, 900 unsigned NumClauses, 901 EmptyShell) { 902 return createEmptyDirective<OMPCancelDirective>(C, NumClauses); 903 } 904 905 OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C, 906 SourceLocation StartLoc, 907 SourceLocation EndLoc, 908 ArrayRef<OMPClause *> Clauses) { 909 return createDirective<OMPFlushDirective>( 910 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc, 911 EndLoc); 912 } 913 914 OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C, 915 unsigned NumClauses, 916 EmptyShell) { 917 return createEmptyDirective<OMPFlushDirective>(C, NumClauses); 918 } 919 920 OMPDepobjDirective *OMPDepobjDirective::Create(const ASTContext &C, 921 SourceLocation StartLoc, 922 SourceLocation EndLoc, 923 ArrayRef<OMPClause *> Clauses) { 924 return createDirective<OMPDepobjDirective>( 925 C, Clauses, /*AssociatedStmt=*/nullptr, 926 /*NumChildren=*/0, StartLoc, EndLoc); 927 } 928 929 OMPDepobjDirective *OMPDepobjDirective::CreateEmpty(const ASTContext &C, 930 unsigned NumClauses, 931 EmptyShell) { 932 return createEmptyDirective<OMPDepobjDirective>(C, NumClauses); 933 } 934 935 OMPScanDirective *OMPScanDirective::Create(const ASTContext &C, 936 SourceLocation StartLoc, 937 SourceLocation EndLoc, 938 ArrayRef<OMPClause *> Clauses) { 939 return createDirective<OMPScanDirective>(C, Clauses, 940 /*AssociatedStmt=*/nullptr, 941 /*NumChildren=*/0, StartLoc, EndLoc); 942 } 943 944 OMPScanDirective *OMPScanDirective::CreateEmpty(const ASTContext &C, 945 unsigned NumClauses, 946 EmptyShell) { 947 return createEmptyDirective<OMPScanDirective>(C, NumClauses); 948 } 949 950 OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C, 951 SourceLocation StartLoc, 952 SourceLocation EndLoc, 953 ArrayRef<OMPClause *> Clauses, 954 Stmt *AssociatedStmt) { 955 return createDirective<OMPOrderedDirective>( 956 C, Clauses, cast_or_null<CapturedStmt>(AssociatedStmt), 957 /*NumChildren=*/0, StartLoc, EndLoc); 958 } 959 960 OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C, 961 unsigned NumClauses, 962 bool IsStandalone, 963 EmptyShell) { 964 return createEmptyDirective<OMPOrderedDirective>(C, NumClauses, 965 !IsStandalone); 966 } 967 968 OMPAtomicDirective * 969 OMPAtomicDirective::Create(const ASTContext &C, SourceLocation StartLoc, 970 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses, 971 Stmt *AssociatedStmt, Expressions Exprs) { 972 auto *Dir = createDirective<OMPAtomicDirective>( 973 C, Clauses, AssociatedStmt, /*NumChildren=*/7, StartLoc, EndLoc); 974 Dir->setX(Exprs.X); 975 Dir->setV(Exprs.V); 976 Dir->setR(Exprs.R); 977 Dir->setExpr(Exprs.E); 978 Dir->setUpdateExpr(Exprs.UE); 979 Dir->setD(Exprs.D); 980 Dir->setCond(Exprs.Cond); 981 Dir->Flags.IsXLHSInRHSPart = Exprs.IsXLHSInRHSPart ? 1 : 0; 982 Dir->Flags.IsPostfixUpdate = Exprs.IsPostfixUpdate ? 1 : 0; 983 Dir->Flags.IsFailOnly = Exprs.IsFailOnly ? 1 : 0; 984 return Dir; 985 } 986 987 OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C, 988 unsigned NumClauses, 989 EmptyShell) { 990 return createEmptyDirective<OMPAtomicDirective>( 991 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/7); 992 } 993 994 OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C, 995 SourceLocation StartLoc, 996 SourceLocation EndLoc, 997 ArrayRef<OMPClause *> Clauses, 998 Stmt *AssociatedStmt) { 999 return createDirective<OMPTargetDirective>( 1000 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc); 1001 } 1002 1003 OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C, 1004 unsigned NumClauses, 1005 EmptyShell) { 1006 return createEmptyDirective<OMPTargetDirective>(C, NumClauses, 1007 /*HasAssociatedStmt=*/true); 1008 } 1009 1010 OMPTargetParallelDirective *OMPTargetParallelDirective::Create( 1011 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1012 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef, 1013 bool HasCancel) { 1014 auto *Dir = createDirective<OMPTargetParallelDirective>( 1015 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc); 1016 Dir->setTaskReductionRefExpr(TaskRedRef); 1017 Dir->setHasCancel(HasCancel); 1018 return Dir; 1019 } 1020 1021 OMPTargetParallelDirective * 1022 OMPTargetParallelDirective::CreateEmpty(const ASTContext &C, 1023 unsigned NumClauses, EmptyShell) { 1024 return createEmptyDirective<OMPTargetParallelDirective>( 1025 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1); 1026 } 1027 1028 OMPTargetParallelForDirective *OMPTargetParallelForDirective::Create( 1029 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1030 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1031 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) { 1032 auto *Dir = createDirective<OMPTargetParallelForDirective>( 1033 C, Clauses, AssociatedStmt, 1034 numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1, StartLoc, 1035 EndLoc, CollapsedNum); 1036 Dir->setIterationVariable(Exprs.IterationVarRef); 1037 Dir->setLastIteration(Exprs.LastIteration); 1038 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1039 Dir->setPreCond(Exprs.PreCond); 1040 Dir->setCond(Exprs.Cond); 1041 Dir->setInit(Exprs.Init); 1042 Dir->setInc(Exprs.Inc); 1043 Dir->setIsLastIterVariable(Exprs.IL); 1044 Dir->setLowerBoundVariable(Exprs.LB); 1045 Dir->setUpperBoundVariable(Exprs.UB); 1046 Dir->setStrideVariable(Exprs.ST); 1047 Dir->setEnsureUpperBound(Exprs.EUB); 1048 Dir->setNextLowerBound(Exprs.NLB); 1049 Dir->setNextUpperBound(Exprs.NUB); 1050 Dir->setNumIterations(Exprs.NumIterations); 1051 Dir->setCounters(Exprs.Counters); 1052 Dir->setPrivateCounters(Exprs.PrivateCounters); 1053 Dir->setInits(Exprs.Inits); 1054 Dir->setUpdates(Exprs.Updates); 1055 Dir->setFinals(Exprs.Finals); 1056 Dir->setDependentCounters(Exprs.DependentCounters); 1057 Dir->setDependentInits(Exprs.DependentInits); 1058 Dir->setFinalsConditions(Exprs.FinalsConditions); 1059 Dir->setPreInits(Exprs.PreInits); 1060 Dir->setTaskReductionRefExpr(TaskRedRef); 1061 Dir->setHasCancel(HasCancel); 1062 return Dir; 1063 } 1064 1065 OMPTargetParallelForDirective * 1066 OMPTargetParallelForDirective::CreateEmpty(const ASTContext &C, 1067 unsigned NumClauses, 1068 unsigned CollapsedNum, EmptyShell) { 1069 return createEmptyDirective<OMPTargetParallelForDirective>( 1070 C, NumClauses, /*HasAssociatedStmt=*/true, 1071 numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1, 1072 CollapsedNum); 1073 } 1074 1075 OMPTargetDataDirective *OMPTargetDataDirective::Create( 1076 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1077 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 1078 return createDirective<OMPTargetDataDirective>( 1079 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc); 1080 } 1081 1082 OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C, 1083 unsigned N, 1084 EmptyShell) { 1085 return createEmptyDirective<OMPTargetDataDirective>( 1086 C, N, /*HasAssociatedStmt=*/true); 1087 } 1088 1089 OMPTargetEnterDataDirective *OMPTargetEnterDataDirective::Create( 1090 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1091 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 1092 return createDirective<OMPTargetEnterDataDirective>( 1093 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc); 1094 } 1095 1096 OMPTargetEnterDataDirective * 1097 OMPTargetEnterDataDirective::CreateEmpty(const ASTContext &C, unsigned N, 1098 EmptyShell) { 1099 return createEmptyDirective<OMPTargetEnterDataDirective>( 1100 C, N, /*HasAssociatedStmt=*/true); 1101 } 1102 1103 OMPTargetExitDataDirective *OMPTargetExitDataDirective::Create( 1104 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1105 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 1106 return createDirective<OMPTargetExitDataDirective>( 1107 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc); 1108 } 1109 1110 OMPTargetExitDataDirective * 1111 OMPTargetExitDataDirective::CreateEmpty(const ASTContext &C, unsigned N, 1112 EmptyShell) { 1113 return createEmptyDirective<OMPTargetExitDataDirective>( 1114 C, N, /*HasAssociatedStmt=*/true); 1115 } 1116 1117 OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C, 1118 SourceLocation StartLoc, 1119 SourceLocation EndLoc, 1120 ArrayRef<OMPClause *> Clauses, 1121 Stmt *AssociatedStmt) { 1122 return createDirective<OMPTeamsDirective>( 1123 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc); 1124 } 1125 1126 OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C, 1127 unsigned NumClauses, 1128 EmptyShell) { 1129 return createEmptyDirective<OMPTeamsDirective>(C, NumClauses, 1130 /*HasAssociatedStmt=*/true); 1131 } 1132 1133 OMPTaskLoopDirective *OMPTaskLoopDirective::Create( 1134 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1135 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1136 const HelperExprs &Exprs, bool HasCancel) { 1137 auto *Dir = createDirective<OMPTaskLoopDirective>( 1138 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_taskloop), 1139 StartLoc, EndLoc, CollapsedNum); 1140 Dir->setIterationVariable(Exprs.IterationVarRef); 1141 Dir->setLastIteration(Exprs.LastIteration); 1142 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1143 Dir->setPreCond(Exprs.PreCond); 1144 Dir->setCond(Exprs.Cond); 1145 Dir->setInit(Exprs.Init); 1146 Dir->setInc(Exprs.Inc); 1147 Dir->setIsLastIterVariable(Exprs.IL); 1148 Dir->setLowerBoundVariable(Exprs.LB); 1149 Dir->setUpperBoundVariable(Exprs.UB); 1150 Dir->setStrideVariable(Exprs.ST); 1151 Dir->setEnsureUpperBound(Exprs.EUB); 1152 Dir->setNextLowerBound(Exprs.NLB); 1153 Dir->setNextUpperBound(Exprs.NUB); 1154 Dir->setNumIterations(Exprs.NumIterations); 1155 Dir->setCounters(Exprs.Counters); 1156 Dir->setPrivateCounters(Exprs.PrivateCounters); 1157 Dir->setInits(Exprs.Inits); 1158 Dir->setUpdates(Exprs.Updates); 1159 Dir->setFinals(Exprs.Finals); 1160 Dir->setDependentCounters(Exprs.DependentCounters); 1161 Dir->setDependentInits(Exprs.DependentInits); 1162 Dir->setFinalsConditions(Exprs.FinalsConditions); 1163 Dir->setPreInits(Exprs.PreInits); 1164 Dir->setHasCancel(HasCancel); 1165 return Dir; 1166 } 1167 1168 OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C, 1169 unsigned NumClauses, 1170 unsigned CollapsedNum, 1171 EmptyShell) { 1172 return createEmptyDirective<OMPTaskLoopDirective>( 1173 C, NumClauses, /*HasAssociatedStmt=*/true, 1174 numLoopChildren(CollapsedNum, OMPD_taskloop), CollapsedNum); 1175 } 1176 1177 OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create( 1178 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1179 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1180 const HelperExprs &Exprs) { 1181 auto *Dir = createDirective<OMPTaskLoopSimdDirective>( 1182 C, Clauses, AssociatedStmt, 1183 numLoopChildren(CollapsedNum, OMPD_taskloop_simd), StartLoc, EndLoc, 1184 CollapsedNum); 1185 Dir->setIterationVariable(Exprs.IterationVarRef); 1186 Dir->setLastIteration(Exprs.LastIteration); 1187 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1188 Dir->setPreCond(Exprs.PreCond); 1189 Dir->setCond(Exprs.Cond); 1190 Dir->setInit(Exprs.Init); 1191 Dir->setInc(Exprs.Inc); 1192 Dir->setIsLastIterVariable(Exprs.IL); 1193 Dir->setLowerBoundVariable(Exprs.LB); 1194 Dir->setUpperBoundVariable(Exprs.UB); 1195 Dir->setStrideVariable(Exprs.ST); 1196 Dir->setEnsureUpperBound(Exprs.EUB); 1197 Dir->setNextLowerBound(Exprs.NLB); 1198 Dir->setNextUpperBound(Exprs.NUB); 1199 Dir->setNumIterations(Exprs.NumIterations); 1200 Dir->setCounters(Exprs.Counters); 1201 Dir->setPrivateCounters(Exprs.PrivateCounters); 1202 Dir->setInits(Exprs.Inits); 1203 Dir->setUpdates(Exprs.Updates); 1204 Dir->setFinals(Exprs.Finals); 1205 Dir->setDependentCounters(Exprs.DependentCounters); 1206 Dir->setDependentInits(Exprs.DependentInits); 1207 Dir->setFinalsConditions(Exprs.FinalsConditions); 1208 Dir->setPreInits(Exprs.PreInits); 1209 return Dir; 1210 } 1211 1212 OMPTaskLoopSimdDirective * 1213 OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 1214 unsigned CollapsedNum, EmptyShell) { 1215 return createEmptyDirective<OMPTaskLoopSimdDirective>( 1216 C, NumClauses, /*HasAssociatedStmt=*/true, 1217 numLoopChildren(CollapsedNum, OMPD_taskloop_simd), CollapsedNum); 1218 } 1219 1220 OMPMasterTaskLoopDirective *OMPMasterTaskLoopDirective::Create( 1221 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1222 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1223 const HelperExprs &Exprs, bool HasCancel) { 1224 auto *Dir = createDirective<OMPMasterTaskLoopDirective>( 1225 C, Clauses, AssociatedStmt, 1226 numLoopChildren(CollapsedNum, OMPD_master_taskloop), StartLoc, EndLoc, 1227 CollapsedNum); 1228 Dir->setIterationVariable(Exprs.IterationVarRef); 1229 Dir->setLastIteration(Exprs.LastIteration); 1230 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1231 Dir->setPreCond(Exprs.PreCond); 1232 Dir->setCond(Exprs.Cond); 1233 Dir->setInit(Exprs.Init); 1234 Dir->setInc(Exprs.Inc); 1235 Dir->setIsLastIterVariable(Exprs.IL); 1236 Dir->setLowerBoundVariable(Exprs.LB); 1237 Dir->setUpperBoundVariable(Exprs.UB); 1238 Dir->setStrideVariable(Exprs.ST); 1239 Dir->setEnsureUpperBound(Exprs.EUB); 1240 Dir->setNextLowerBound(Exprs.NLB); 1241 Dir->setNextUpperBound(Exprs.NUB); 1242 Dir->setNumIterations(Exprs.NumIterations); 1243 Dir->setCounters(Exprs.Counters); 1244 Dir->setPrivateCounters(Exprs.PrivateCounters); 1245 Dir->setInits(Exprs.Inits); 1246 Dir->setUpdates(Exprs.Updates); 1247 Dir->setFinals(Exprs.Finals); 1248 Dir->setDependentCounters(Exprs.DependentCounters); 1249 Dir->setDependentInits(Exprs.DependentInits); 1250 Dir->setFinalsConditions(Exprs.FinalsConditions); 1251 Dir->setPreInits(Exprs.PreInits); 1252 Dir->setHasCancel(HasCancel); 1253 return Dir; 1254 } 1255 1256 OMPMasterTaskLoopDirective * 1257 OMPMasterTaskLoopDirective::CreateEmpty(const ASTContext &C, 1258 unsigned NumClauses, 1259 unsigned CollapsedNum, EmptyShell) { 1260 return createEmptyDirective<OMPMasterTaskLoopDirective>( 1261 C, NumClauses, /*HasAssociatedStmt=*/true, 1262 numLoopChildren(CollapsedNum, OMPD_master_taskloop), CollapsedNum); 1263 } 1264 1265 OMPMaskedTaskLoopDirective *OMPMaskedTaskLoopDirective::Create( 1266 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1267 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1268 const HelperExprs &Exprs, bool HasCancel) { 1269 auto *Dir = createDirective<OMPMaskedTaskLoopDirective>( 1270 C, Clauses, AssociatedStmt, 1271 numLoopChildren(CollapsedNum, OMPD_masked_taskloop), StartLoc, EndLoc, 1272 CollapsedNum); 1273 Dir->setIterationVariable(Exprs.IterationVarRef); 1274 Dir->setLastIteration(Exprs.LastIteration); 1275 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1276 Dir->setPreCond(Exprs.PreCond); 1277 Dir->setCond(Exprs.Cond); 1278 Dir->setInit(Exprs.Init); 1279 Dir->setInc(Exprs.Inc); 1280 Dir->setIsLastIterVariable(Exprs.IL); 1281 Dir->setLowerBoundVariable(Exprs.LB); 1282 Dir->setUpperBoundVariable(Exprs.UB); 1283 Dir->setStrideVariable(Exprs.ST); 1284 Dir->setEnsureUpperBound(Exprs.EUB); 1285 Dir->setNextLowerBound(Exprs.NLB); 1286 Dir->setNextUpperBound(Exprs.NUB); 1287 Dir->setNumIterations(Exprs.NumIterations); 1288 Dir->setCounters(Exprs.Counters); 1289 Dir->setPrivateCounters(Exprs.PrivateCounters); 1290 Dir->setInits(Exprs.Inits); 1291 Dir->setUpdates(Exprs.Updates); 1292 Dir->setFinals(Exprs.Finals); 1293 Dir->setDependentCounters(Exprs.DependentCounters); 1294 Dir->setDependentInits(Exprs.DependentInits); 1295 Dir->setFinalsConditions(Exprs.FinalsConditions); 1296 Dir->setPreInits(Exprs.PreInits); 1297 Dir->setHasCancel(HasCancel); 1298 return Dir; 1299 } 1300 1301 OMPMaskedTaskLoopDirective * 1302 OMPMaskedTaskLoopDirective::CreateEmpty(const ASTContext &C, 1303 unsigned NumClauses, 1304 unsigned CollapsedNum, EmptyShell) { 1305 return createEmptyDirective<OMPMaskedTaskLoopDirective>( 1306 C, NumClauses, /*HasAssociatedStmt=*/true, 1307 numLoopChildren(CollapsedNum, OMPD_masked_taskloop), CollapsedNum); 1308 } 1309 1310 OMPMasterTaskLoopSimdDirective *OMPMasterTaskLoopSimdDirective::Create( 1311 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1312 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1313 const HelperExprs &Exprs) { 1314 auto *Dir = createDirective<OMPMasterTaskLoopSimdDirective>( 1315 C, Clauses, AssociatedStmt, 1316 numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), StartLoc, 1317 EndLoc, CollapsedNum); 1318 Dir->setIterationVariable(Exprs.IterationVarRef); 1319 Dir->setLastIteration(Exprs.LastIteration); 1320 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1321 Dir->setPreCond(Exprs.PreCond); 1322 Dir->setCond(Exprs.Cond); 1323 Dir->setInit(Exprs.Init); 1324 Dir->setInc(Exprs.Inc); 1325 Dir->setIsLastIterVariable(Exprs.IL); 1326 Dir->setLowerBoundVariable(Exprs.LB); 1327 Dir->setUpperBoundVariable(Exprs.UB); 1328 Dir->setStrideVariable(Exprs.ST); 1329 Dir->setEnsureUpperBound(Exprs.EUB); 1330 Dir->setNextLowerBound(Exprs.NLB); 1331 Dir->setNextUpperBound(Exprs.NUB); 1332 Dir->setNumIterations(Exprs.NumIterations); 1333 Dir->setCounters(Exprs.Counters); 1334 Dir->setPrivateCounters(Exprs.PrivateCounters); 1335 Dir->setInits(Exprs.Inits); 1336 Dir->setUpdates(Exprs.Updates); 1337 Dir->setFinals(Exprs.Finals); 1338 Dir->setDependentCounters(Exprs.DependentCounters); 1339 Dir->setDependentInits(Exprs.DependentInits); 1340 Dir->setFinalsConditions(Exprs.FinalsConditions); 1341 Dir->setPreInits(Exprs.PreInits); 1342 return Dir; 1343 } 1344 1345 OMPMasterTaskLoopSimdDirective * 1346 OMPMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, 1347 unsigned NumClauses, 1348 unsigned CollapsedNum, EmptyShell) { 1349 return createEmptyDirective<OMPMasterTaskLoopSimdDirective>( 1350 C, NumClauses, /*HasAssociatedStmt=*/true, 1351 numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), CollapsedNum); 1352 } 1353 1354 OMPMaskedTaskLoopSimdDirective *OMPMaskedTaskLoopSimdDirective::Create( 1355 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1356 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1357 const HelperExprs &Exprs) { 1358 auto *Dir = createDirective<OMPMaskedTaskLoopSimdDirective>( 1359 C, Clauses, AssociatedStmt, 1360 numLoopChildren(CollapsedNum, OMPD_masked_taskloop_simd), StartLoc, 1361 EndLoc, CollapsedNum); 1362 Dir->setIterationVariable(Exprs.IterationVarRef); 1363 Dir->setLastIteration(Exprs.LastIteration); 1364 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1365 Dir->setPreCond(Exprs.PreCond); 1366 Dir->setCond(Exprs.Cond); 1367 Dir->setInit(Exprs.Init); 1368 Dir->setInc(Exprs.Inc); 1369 Dir->setIsLastIterVariable(Exprs.IL); 1370 Dir->setLowerBoundVariable(Exprs.LB); 1371 Dir->setUpperBoundVariable(Exprs.UB); 1372 Dir->setStrideVariable(Exprs.ST); 1373 Dir->setEnsureUpperBound(Exprs.EUB); 1374 Dir->setNextLowerBound(Exprs.NLB); 1375 Dir->setNextUpperBound(Exprs.NUB); 1376 Dir->setNumIterations(Exprs.NumIterations); 1377 Dir->setCounters(Exprs.Counters); 1378 Dir->setPrivateCounters(Exprs.PrivateCounters); 1379 Dir->setInits(Exprs.Inits); 1380 Dir->setUpdates(Exprs.Updates); 1381 Dir->setFinals(Exprs.Finals); 1382 Dir->setDependentCounters(Exprs.DependentCounters); 1383 Dir->setDependentInits(Exprs.DependentInits); 1384 Dir->setFinalsConditions(Exprs.FinalsConditions); 1385 Dir->setPreInits(Exprs.PreInits); 1386 return Dir; 1387 } 1388 1389 OMPMaskedTaskLoopSimdDirective * 1390 OMPMaskedTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, 1391 unsigned NumClauses, 1392 unsigned CollapsedNum, EmptyShell) { 1393 return createEmptyDirective<OMPMaskedTaskLoopSimdDirective>( 1394 C, NumClauses, /*HasAssociatedStmt=*/true, 1395 numLoopChildren(CollapsedNum, OMPD_masked_taskloop_simd), CollapsedNum); 1396 } 1397 1398 OMPParallelMasterTaskLoopDirective *OMPParallelMasterTaskLoopDirective::Create( 1399 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1400 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1401 const HelperExprs &Exprs, bool HasCancel) { 1402 auto *Dir = createDirective<OMPParallelMasterTaskLoopDirective>( 1403 C, Clauses, AssociatedStmt, 1404 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop), StartLoc, 1405 EndLoc, CollapsedNum); 1406 Dir->setIterationVariable(Exprs.IterationVarRef); 1407 Dir->setLastIteration(Exprs.LastIteration); 1408 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1409 Dir->setPreCond(Exprs.PreCond); 1410 Dir->setCond(Exprs.Cond); 1411 Dir->setInit(Exprs.Init); 1412 Dir->setInc(Exprs.Inc); 1413 Dir->setIsLastIterVariable(Exprs.IL); 1414 Dir->setLowerBoundVariable(Exprs.LB); 1415 Dir->setUpperBoundVariable(Exprs.UB); 1416 Dir->setStrideVariable(Exprs.ST); 1417 Dir->setEnsureUpperBound(Exprs.EUB); 1418 Dir->setNextLowerBound(Exprs.NLB); 1419 Dir->setNextUpperBound(Exprs.NUB); 1420 Dir->setNumIterations(Exprs.NumIterations); 1421 Dir->setCounters(Exprs.Counters); 1422 Dir->setPrivateCounters(Exprs.PrivateCounters); 1423 Dir->setInits(Exprs.Inits); 1424 Dir->setUpdates(Exprs.Updates); 1425 Dir->setFinals(Exprs.Finals); 1426 Dir->setDependentCounters(Exprs.DependentCounters); 1427 Dir->setDependentInits(Exprs.DependentInits); 1428 Dir->setFinalsConditions(Exprs.FinalsConditions); 1429 Dir->setPreInits(Exprs.PreInits); 1430 Dir->setHasCancel(HasCancel); 1431 return Dir; 1432 } 1433 1434 OMPParallelMasterTaskLoopDirective * 1435 OMPParallelMasterTaskLoopDirective::CreateEmpty(const ASTContext &C, 1436 unsigned NumClauses, 1437 unsigned CollapsedNum, 1438 EmptyShell) { 1439 return createEmptyDirective<OMPParallelMasterTaskLoopDirective>( 1440 C, NumClauses, /*HasAssociatedStmt=*/true, 1441 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop), 1442 CollapsedNum); 1443 } 1444 1445 OMPParallelMaskedTaskLoopDirective *OMPParallelMaskedTaskLoopDirective::Create( 1446 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1447 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1448 const HelperExprs &Exprs, bool HasCancel) { 1449 auto *Dir = createDirective<OMPParallelMaskedTaskLoopDirective>( 1450 C, Clauses, AssociatedStmt, 1451 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop), StartLoc, 1452 EndLoc, CollapsedNum); 1453 Dir->setIterationVariable(Exprs.IterationVarRef); 1454 Dir->setLastIteration(Exprs.LastIteration); 1455 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1456 Dir->setPreCond(Exprs.PreCond); 1457 Dir->setCond(Exprs.Cond); 1458 Dir->setInit(Exprs.Init); 1459 Dir->setInc(Exprs.Inc); 1460 Dir->setIsLastIterVariable(Exprs.IL); 1461 Dir->setLowerBoundVariable(Exprs.LB); 1462 Dir->setUpperBoundVariable(Exprs.UB); 1463 Dir->setStrideVariable(Exprs.ST); 1464 Dir->setEnsureUpperBound(Exprs.EUB); 1465 Dir->setNextLowerBound(Exprs.NLB); 1466 Dir->setNextUpperBound(Exprs.NUB); 1467 Dir->setNumIterations(Exprs.NumIterations); 1468 Dir->setCounters(Exprs.Counters); 1469 Dir->setPrivateCounters(Exprs.PrivateCounters); 1470 Dir->setInits(Exprs.Inits); 1471 Dir->setUpdates(Exprs.Updates); 1472 Dir->setFinals(Exprs.Finals); 1473 Dir->setDependentCounters(Exprs.DependentCounters); 1474 Dir->setDependentInits(Exprs.DependentInits); 1475 Dir->setFinalsConditions(Exprs.FinalsConditions); 1476 Dir->setPreInits(Exprs.PreInits); 1477 Dir->setHasCancel(HasCancel); 1478 return Dir; 1479 } 1480 1481 OMPParallelMaskedTaskLoopDirective * 1482 OMPParallelMaskedTaskLoopDirective::CreateEmpty(const ASTContext &C, 1483 unsigned NumClauses, 1484 unsigned CollapsedNum, 1485 EmptyShell) { 1486 return createEmptyDirective<OMPParallelMaskedTaskLoopDirective>( 1487 C, NumClauses, /*HasAssociatedStmt=*/true, 1488 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop), 1489 CollapsedNum); 1490 } 1491 1492 OMPParallelMasterTaskLoopSimdDirective * 1493 OMPParallelMasterTaskLoopSimdDirective::Create( 1494 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1495 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1496 const HelperExprs &Exprs) { 1497 auto *Dir = createDirective<OMPParallelMasterTaskLoopSimdDirective>( 1498 C, Clauses, AssociatedStmt, 1499 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd), 1500 StartLoc, EndLoc, CollapsedNum); 1501 Dir->setIterationVariable(Exprs.IterationVarRef); 1502 Dir->setLastIteration(Exprs.LastIteration); 1503 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1504 Dir->setPreCond(Exprs.PreCond); 1505 Dir->setCond(Exprs.Cond); 1506 Dir->setInit(Exprs.Init); 1507 Dir->setInc(Exprs.Inc); 1508 Dir->setIsLastIterVariable(Exprs.IL); 1509 Dir->setLowerBoundVariable(Exprs.LB); 1510 Dir->setUpperBoundVariable(Exprs.UB); 1511 Dir->setStrideVariable(Exprs.ST); 1512 Dir->setEnsureUpperBound(Exprs.EUB); 1513 Dir->setNextLowerBound(Exprs.NLB); 1514 Dir->setNextUpperBound(Exprs.NUB); 1515 Dir->setNumIterations(Exprs.NumIterations); 1516 Dir->setCounters(Exprs.Counters); 1517 Dir->setPrivateCounters(Exprs.PrivateCounters); 1518 Dir->setInits(Exprs.Inits); 1519 Dir->setUpdates(Exprs.Updates); 1520 Dir->setFinals(Exprs.Finals); 1521 Dir->setDependentCounters(Exprs.DependentCounters); 1522 Dir->setDependentInits(Exprs.DependentInits); 1523 Dir->setFinalsConditions(Exprs.FinalsConditions); 1524 Dir->setPreInits(Exprs.PreInits); 1525 return Dir; 1526 } 1527 1528 OMPParallelMasterTaskLoopSimdDirective * 1529 OMPParallelMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, 1530 unsigned NumClauses, 1531 unsigned CollapsedNum, 1532 EmptyShell) { 1533 return createEmptyDirective<OMPParallelMasterTaskLoopSimdDirective>( 1534 C, NumClauses, /*HasAssociatedStmt=*/true, 1535 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd), 1536 CollapsedNum); 1537 } 1538 1539 OMPParallelMaskedTaskLoopSimdDirective * 1540 OMPParallelMaskedTaskLoopSimdDirective::Create( 1541 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1542 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1543 const HelperExprs &Exprs) { 1544 auto *Dir = createDirective<OMPParallelMaskedTaskLoopSimdDirective>( 1545 C, Clauses, AssociatedStmt, 1546 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop_simd), 1547 StartLoc, EndLoc, CollapsedNum); 1548 Dir->setIterationVariable(Exprs.IterationVarRef); 1549 Dir->setLastIteration(Exprs.LastIteration); 1550 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1551 Dir->setPreCond(Exprs.PreCond); 1552 Dir->setCond(Exprs.Cond); 1553 Dir->setInit(Exprs.Init); 1554 Dir->setInc(Exprs.Inc); 1555 Dir->setIsLastIterVariable(Exprs.IL); 1556 Dir->setLowerBoundVariable(Exprs.LB); 1557 Dir->setUpperBoundVariable(Exprs.UB); 1558 Dir->setStrideVariable(Exprs.ST); 1559 Dir->setEnsureUpperBound(Exprs.EUB); 1560 Dir->setNextLowerBound(Exprs.NLB); 1561 Dir->setNextUpperBound(Exprs.NUB); 1562 Dir->setNumIterations(Exprs.NumIterations); 1563 Dir->setCounters(Exprs.Counters); 1564 Dir->setPrivateCounters(Exprs.PrivateCounters); 1565 Dir->setInits(Exprs.Inits); 1566 Dir->setUpdates(Exprs.Updates); 1567 Dir->setFinals(Exprs.Finals); 1568 Dir->setDependentCounters(Exprs.DependentCounters); 1569 Dir->setDependentInits(Exprs.DependentInits); 1570 Dir->setFinalsConditions(Exprs.FinalsConditions); 1571 Dir->setPreInits(Exprs.PreInits); 1572 return Dir; 1573 } 1574 1575 OMPParallelMaskedTaskLoopSimdDirective * 1576 OMPParallelMaskedTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, 1577 unsigned NumClauses, 1578 unsigned CollapsedNum, 1579 EmptyShell) { 1580 return createEmptyDirective<OMPParallelMaskedTaskLoopSimdDirective>( 1581 C, NumClauses, /*HasAssociatedStmt=*/true, 1582 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop_simd), 1583 CollapsedNum); 1584 } 1585 1586 OMPDistributeDirective * 1587 OMPDistributeDirective::Create(const ASTContext &C, SourceLocation StartLoc, 1588 SourceLocation EndLoc, unsigned CollapsedNum, 1589 ArrayRef<OMPClause *> Clauses, 1590 Stmt *AssociatedStmt, const HelperExprs &Exprs) { 1591 auto *Dir = createDirective<OMPDistributeDirective>( 1592 C, Clauses, AssociatedStmt, 1593 numLoopChildren(CollapsedNum, OMPD_distribute), StartLoc, EndLoc, 1594 CollapsedNum); 1595 Dir->setIterationVariable(Exprs.IterationVarRef); 1596 Dir->setLastIteration(Exprs.LastIteration); 1597 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1598 Dir->setPreCond(Exprs.PreCond); 1599 Dir->setCond(Exprs.Cond); 1600 Dir->setInit(Exprs.Init); 1601 Dir->setInc(Exprs.Inc); 1602 Dir->setIsLastIterVariable(Exprs.IL); 1603 Dir->setLowerBoundVariable(Exprs.LB); 1604 Dir->setUpperBoundVariable(Exprs.UB); 1605 Dir->setStrideVariable(Exprs.ST); 1606 Dir->setEnsureUpperBound(Exprs.EUB); 1607 Dir->setNextLowerBound(Exprs.NLB); 1608 Dir->setNextUpperBound(Exprs.NUB); 1609 Dir->setNumIterations(Exprs.NumIterations); 1610 Dir->setCounters(Exprs.Counters); 1611 Dir->setPrivateCounters(Exprs.PrivateCounters); 1612 Dir->setInits(Exprs.Inits); 1613 Dir->setUpdates(Exprs.Updates); 1614 Dir->setFinals(Exprs.Finals); 1615 Dir->setDependentCounters(Exprs.DependentCounters); 1616 Dir->setDependentInits(Exprs.DependentInits); 1617 Dir->setFinalsConditions(Exprs.FinalsConditions); 1618 Dir->setPreInits(Exprs.PreInits); 1619 return Dir; 1620 } 1621 1622 OMPDistributeDirective * 1623 OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 1624 unsigned CollapsedNum, EmptyShell) { 1625 return createEmptyDirective<OMPDistributeDirective>( 1626 C, NumClauses, /*HasAssociatedStmt=*/true, 1627 numLoopChildren(CollapsedNum, OMPD_distribute), CollapsedNum); 1628 } 1629 1630 OMPTargetUpdateDirective *OMPTargetUpdateDirective::Create( 1631 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1632 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 1633 return createDirective<OMPTargetUpdateDirective>(C, Clauses, AssociatedStmt, 1634 /*NumChildren=*/0, StartLoc, 1635 EndLoc); 1636 } 1637 1638 OMPTargetUpdateDirective * 1639 OMPTargetUpdateDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 1640 EmptyShell) { 1641 return createEmptyDirective<OMPTargetUpdateDirective>( 1642 C, NumClauses, /*HasAssociatedStmt=*/true); 1643 } 1644 1645 OMPDistributeParallelForDirective *OMPDistributeParallelForDirective::Create( 1646 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1647 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1648 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) { 1649 auto *Dir = createDirective<OMPDistributeParallelForDirective>( 1650 C, Clauses, AssociatedStmt, 1651 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1, StartLoc, 1652 EndLoc, CollapsedNum); 1653 Dir->setIterationVariable(Exprs.IterationVarRef); 1654 Dir->setLastIteration(Exprs.LastIteration); 1655 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1656 Dir->setPreCond(Exprs.PreCond); 1657 Dir->setCond(Exprs.Cond); 1658 Dir->setInit(Exprs.Init); 1659 Dir->setInc(Exprs.Inc); 1660 Dir->setIsLastIterVariable(Exprs.IL); 1661 Dir->setLowerBoundVariable(Exprs.LB); 1662 Dir->setUpperBoundVariable(Exprs.UB); 1663 Dir->setStrideVariable(Exprs.ST); 1664 Dir->setEnsureUpperBound(Exprs.EUB); 1665 Dir->setNextLowerBound(Exprs.NLB); 1666 Dir->setNextUpperBound(Exprs.NUB); 1667 Dir->setNumIterations(Exprs.NumIterations); 1668 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 1669 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 1670 Dir->setDistInc(Exprs.DistInc); 1671 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 1672 Dir->setCounters(Exprs.Counters); 1673 Dir->setPrivateCounters(Exprs.PrivateCounters); 1674 Dir->setInits(Exprs.Inits); 1675 Dir->setUpdates(Exprs.Updates); 1676 Dir->setFinals(Exprs.Finals); 1677 Dir->setDependentCounters(Exprs.DependentCounters); 1678 Dir->setDependentInits(Exprs.DependentInits); 1679 Dir->setFinalsConditions(Exprs.FinalsConditions); 1680 Dir->setPreInits(Exprs.PreInits); 1681 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 1682 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 1683 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 1684 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 1685 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 1686 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 1687 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 1688 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 1689 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 1690 Dir->setTaskReductionRefExpr(TaskRedRef); 1691 Dir->HasCancel = HasCancel; 1692 return Dir; 1693 } 1694 1695 OMPDistributeParallelForDirective * 1696 OMPDistributeParallelForDirective::CreateEmpty(const ASTContext &C, 1697 unsigned NumClauses, 1698 unsigned CollapsedNum, 1699 EmptyShell) { 1700 return createEmptyDirective<OMPDistributeParallelForDirective>( 1701 C, NumClauses, /*HasAssociatedStmt=*/true, 1702 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1, 1703 CollapsedNum); 1704 } 1705 1706 OMPDistributeParallelForSimdDirective * 1707 OMPDistributeParallelForSimdDirective::Create( 1708 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1709 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1710 const HelperExprs &Exprs) { 1711 auto *Dir = createDirective<OMPDistributeParallelForSimdDirective>( 1712 C, Clauses, AssociatedStmt, 1713 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd), 1714 StartLoc, EndLoc, CollapsedNum); 1715 Dir->setIterationVariable(Exprs.IterationVarRef); 1716 Dir->setLastIteration(Exprs.LastIteration); 1717 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1718 Dir->setPreCond(Exprs.PreCond); 1719 Dir->setCond(Exprs.Cond); 1720 Dir->setInit(Exprs.Init); 1721 Dir->setInc(Exprs.Inc); 1722 Dir->setIsLastIterVariable(Exprs.IL); 1723 Dir->setLowerBoundVariable(Exprs.LB); 1724 Dir->setUpperBoundVariable(Exprs.UB); 1725 Dir->setStrideVariable(Exprs.ST); 1726 Dir->setEnsureUpperBound(Exprs.EUB); 1727 Dir->setNextLowerBound(Exprs.NLB); 1728 Dir->setNextUpperBound(Exprs.NUB); 1729 Dir->setNumIterations(Exprs.NumIterations); 1730 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 1731 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 1732 Dir->setDistInc(Exprs.DistInc); 1733 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 1734 Dir->setCounters(Exprs.Counters); 1735 Dir->setPrivateCounters(Exprs.PrivateCounters); 1736 Dir->setInits(Exprs.Inits); 1737 Dir->setUpdates(Exprs.Updates); 1738 Dir->setFinals(Exprs.Finals); 1739 Dir->setDependentCounters(Exprs.DependentCounters); 1740 Dir->setDependentInits(Exprs.DependentInits); 1741 Dir->setFinalsConditions(Exprs.FinalsConditions); 1742 Dir->setPreInits(Exprs.PreInits); 1743 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 1744 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 1745 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 1746 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 1747 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 1748 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 1749 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 1750 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 1751 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 1752 return Dir; 1753 } 1754 1755 OMPDistributeParallelForSimdDirective * 1756 OMPDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C, 1757 unsigned NumClauses, 1758 unsigned CollapsedNum, 1759 EmptyShell) { 1760 return createEmptyDirective<OMPDistributeParallelForSimdDirective>( 1761 C, NumClauses, /*HasAssociatedStmt=*/true, 1762 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd), 1763 CollapsedNum); 1764 } 1765 1766 OMPDistributeSimdDirective *OMPDistributeSimdDirective::Create( 1767 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1768 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1769 const HelperExprs &Exprs) { 1770 auto *Dir = createDirective<OMPDistributeSimdDirective>( 1771 C, Clauses, AssociatedStmt, 1772 numLoopChildren(CollapsedNum, OMPD_distribute_simd), StartLoc, EndLoc, 1773 CollapsedNum); 1774 Dir->setIterationVariable(Exprs.IterationVarRef); 1775 Dir->setLastIteration(Exprs.LastIteration); 1776 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1777 Dir->setPreCond(Exprs.PreCond); 1778 Dir->setCond(Exprs.Cond); 1779 Dir->setInit(Exprs.Init); 1780 Dir->setInc(Exprs.Inc); 1781 Dir->setIsLastIterVariable(Exprs.IL); 1782 Dir->setLowerBoundVariable(Exprs.LB); 1783 Dir->setUpperBoundVariable(Exprs.UB); 1784 Dir->setStrideVariable(Exprs.ST); 1785 Dir->setEnsureUpperBound(Exprs.EUB); 1786 Dir->setNextLowerBound(Exprs.NLB); 1787 Dir->setNextUpperBound(Exprs.NUB); 1788 Dir->setNumIterations(Exprs.NumIterations); 1789 Dir->setCounters(Exprs.Counters); 1790 Dir->setPrivateCounters(Exprs.PrivateCounters); 1791 Dir->setInits(Exprs.Inits); 1792 Dir->setUpdates(Exprs.Updates); 1793 Dir->setFinals(Exprs.Finals); 1794 Dir->setDependentCounters(Exprs.DependentCounters); 1795 Dir->setDependentInits(Exprs.DependentInits); 1796 Dir->setFinalsConditions(Exprs.FinalsConditions); 1797 Dir->setPreInits(Exprs.PreInits); 1798 return Dir; 1799 } 1800 1801 OMPDistributeSimdDirective * 1802 OMPDistributeSimdDirective::CreateEmpty(const ASTContext &C, 1803 unsigned NumClauses, 1804 unsigned CollapsedNum, EmptyShell) { 1805 return createEmptyDirective<OMPDistributeSimdDirective>( 1806 C, NumClauses, /*HasAssociatedStmt=*/true, 1807 numLoopChildren(CollapsedNum, OMPD_distribute_simd), CollapsedNum); 1808 } 1809 1810 OMPTargetParallelForSimdDirective *OMPTargetParallelForSimdDirective::Create( 1811 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1812 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1813 const HelperExprs &Exprs) { 1814 auto *Dir = createDirective<OMPTargetParallelForSimdDirective>( 1815 C, Clauses, AssociatedStmt, 1816 numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd), StartLoc, 1817 EndLoc, CollapsedNum); 1818 Dir->setIterationVariable(Exprs.IterationVarRef); 1819 Dir->setLastIteration(Exprs.LastIteration); 1820 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1821 Dir->setPreCond(Exprs.PreCond); 1822 Dir->setCond(Exprs.Cond); 1823 Dir->setInit(Exprs.Init); 1824 Dir->setInc(Exprs.Inc); 1825 Dir->setIsLastIterVariable(Exprs.IL); 1826 Dir->setLowerBoundVariable(Exprs.LB); 1827 Dir->setUpperBoundVariable(Exprs.UB); 1828 Dir->setStrideVariable(Exprs.ST); 1829 Dir->setEnsureUpperBound(Exprs.EUB); 1830 Dir->setNextLowerBound(Exprs.NLB); 1831 Dir->setNextUpperBound(Exprs.NUB); 1832 Dir->setNumIterations(Exprs.NumIterations); 1833 Dir->setCounters(Exprs.Counters); 1834 Dir->setPrivateCounters(Exprs.PrivateCounters); 1835 Dir->setInits(Exprs.Inits); 1836 Dir->setUpdates(Exprs.Updates); 1837 Dir->setFinals(Exprs.Finals); 1838 Dir->setDependentCounters(Exprs.DependentCounters); 1839 Dir->setDependentInits(Exprs.DependentInits); 1840 Dir->setFinalsConditions(Exprs.FinalsConditions); 1841 Dir->setPreInits(Exprs.PreInits); 1842 return Dir; 1843 } 1844 1845 OMPTargetParallelForSimdDirective * 1846 OMPTargetParallelForSimdDirective::CreateEmpty(const ASTContext &C, 1847 unsigned NumClauses, 1848 unsigned CollapsedNum, 1849 EmptyShell) { 1850 return createEmptyDirective<OMPTargetParallelForSimdDirective>( 1851 C, NumClauses, /*HasAssociatedStmt=*/true, 1852 numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd), 1853 CollapsedNum); 1854 } 1855 1856 OMPTargetSimdDirective * 1857 OMPTargetSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc, 1858 SourceLocation EndLoc, unsigned CollapsedNum, 1859 ArrayRef<OMPClause *> Clauses, 1860 Stmt *AssociatedStmt, const HelperExprs &Exprs) { 1861 auto *Dir = createDirective<OMPTargetSimdDirective>( 1862 C, Clauses, AssociatedStmt, 1863 numLoopChildren(CollapsedNum, OMPD_target_simd), StartLoc, EndLoc, 1864 CollapsedNum); 1865 Dir->setIterationVariable(Exprs.IterationVarRef); 1866 Dir->setLastIteration(Exprs.LastIteration); 1867 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1868 Dir->setPreCond(Exprs.PreCond); 1869 Dir->setCond(Exprs.Cond); 1870 Dir->setInit(Exprs.Init); 1871 Dir->setInc(Exprs.Inc); 1872 Dir->setCounters(Exprs.Counters); 1873 Dir->setPrivateCounters(Exprs.PrivateCounters); 1874 Dir->setInits(Exprs.Inits); 1875 Dir->setUpdates(Exprs.Updates); 1876 Dir->setFinals(Exprs.Finals); 1877 Dir->setDependentCounters(Exprs.DependentCounters); 1878 Dir->setDependentInits(Exprs.DependentInits); 1879 Dir->setFinalsConditions(Exprs.FinalsConditions); 1880 Dir->setPreInits(Exprs.PreInits); 1881 return Dir; 1882 } 1883 1884 OMPTargetSimdDirective * 1885 OMPTargetSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 1886 unsigned CollapsedNum, EmptyShell) { 1887 return createEmptyDirective<OMPTargetSimdDirective>( 1888 C, NumClauses, /*HasAssociatedStmt=*/true, 1889 numLoopChildren(CollapsedNum, OMPD_target_simd), CollapsedNum); 1890 } 1891 1892 OMPTeamsDistributeDirective *OMPTeamsDistributeDirective::Create( 1893 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1894 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1895 const HelperExprs &Exprs) { 1896 auto *Dir = createDirective<OMPTeamsDistributeDirective>( 1897 C, Clauses, AssociatedStmt, 1898 numLoopChildren(CollapsedNum, OMPD_teams_distribute), StartLoc, EndLoc, 1899 CollapsedNum); 1900 Dir->setIterationVariable(Exprs.IterationVarRef); 1901 Dir->setLastIteration(Exprs.LastIteration); 1902 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1903 Dir->setPreCond(Exprs.PreCond); 1904 Dir->setCond(Exprs.Cond); 1905 Dir->setInit(Exprs.Init); 1906 Dir->setInc(Exprs.Inc); 1907 Dir->setIsLastIterVariable(Exprs.IL); 1908 Dir->setLowerBoundVariable(Exprs.LB); 1909 Dir->setUpperBoundVariable(Exprs.UB); 1910 Dir->setStrideVariable(Exprs.ST); 1911 Dir->setEnsureUpperBound(Exprs.EUB); 1912 Dir->setNextLowerBound(Exprs.NLB); 1913 Dir->setNextUpperBound(Exprs.NUB); 1914 Dir->setNumIterations(Exprs.NumIterations); 1915 Dir->setCounters(Exprs.Counters); 1916 Dir->setPrivateCounters(Exprs.PrivateCounters); 1917 Dir->setInits(Exprs.Inits); 1918 Dir->setUpdates(Exprs.Updates); 1919 Dir->setFinals(Exprs.Finals); 1920 Dir->setDependentCounters(Exprs.DependentCounters); 1921 Dir->setDependentInits(Exprs.DependentInits); 1922 Dir->setFinalsConditions(Exprs.FinalsConditions); 1923 Dir->setPreInits(Exprs.PreInits); 1924 return Dir; 1925 } 1926 1927 OMPTeamsDistributeDirective * 1928 OMPTeamsDistributeDirective::CreateEmpty(const ASTContext &C, 1929 unsigned NumClauses, 1930 unsigned CollapsedNum, EmptyShell) { 1931 return createEmptyDirective<OMPTeamsDistributeDirective>( 1932 C, NumClauses, /*HasAssociatedStmt=*/true, 1933 numLoopChildren(CollapsedNum, OMPD_teams_distribute), CollapsedNum); 1934 } 1935 1936 OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::Create( 1937 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1938 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1939 const HelperExprs &Exprs) { 1940 auto *Dir = createDirective<OMPTeamsDistributeSimdDirective>( 1941 C, Clauses, AssociatedStmt, 1942 numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), StartLoc, 1943 EndLoc, CollapsedNum); 1944 Dir->setIterationVariable(Exprs.IterationVarRef); 1945 Dir->setLastIteration(Exprs.LastIteration); 1946 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1947 Dir->setPreCond(Exprs.PreCond); 1948 Dir->setCond(Exprs.Cond); 1949 Dir->setInit(Exprs.Init); 1950 Dir->setInc(Exprs.Inc); 1951 Dir->setIsLastIterVariable(Exprs.IL); 1952 Dir->setLowerBoundVariable(Exprs.LB); 1953 Dir->setUpperBoundVariable(Exprs.UB); 1954 Dir->setStrideVariable(Exprs.ST); 1955 Dir->setEnsureUpperBound(Exprs.EUB); 1956 Dir->setNextLowerBound(Exprs.NLB); 1957 Dir->setNextUpperBound(Exprs.NUB); 1958 Dir->setNumIterations(Exprs.NumIterations); 1959 Dir->setCounters(Exprs.Counters); 1960 Dir->setPrivateCounters(Exprs.PrivateCounters); 1961 Dir->setInits(Exprs.Inits); 1962 Dir->setUpdates(Exprs.Updates); 1963 Dir->setFinals(Exprs.Finals); 1964 Dir->setDependentCounters(Exprs.DependentCounters); 1965 Dir->setDependentInits(Exprs.DependentInits); 1966 Dir->setFinalsConditions(Exprs.FinalsConditions); 1967 Dir->setPreInits(Exprs.PreInits); 1968 return Dir; 1969 } 1970 1971 OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::CreateEmpty( 1972 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, 1973 EmptyShell) { 1974 return createEmptyDirective<OMPTeamsDistributeSimdDirective>( 1975 C, NumClauses, /*HasAssociatedStmt=*/true, 1976 numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), CollapsedNum); 1977 } 1978 1979 OMPTeamsDistributeParallelForSimdDirective * 1980 OMPTeamsDistributeParallelForSimdDirective::Create( 1981 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 1982 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 1983 const HelperExprs &Exprs) { 1984 auto *Dir = createDirective<OMPTeamsDistributeParallelForSimdDirective>( 1985 C, Clauses, AssociatedStmt, 1986 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd), 1987 StartLoc, EndLoc, CollapsedNum); 1988 Dir->setIterationVariable(Exprs.IterationVarRef); 1989 Dir->setLastIteration(Exprs.LastIteration); 1990 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 1991 Dir->setPreCond(Exprs.PreCond); 1992 Dir->setCond(Exprs.Cond); 1993 Dir->setInit(Exprs.Init); 1994 Dir->setInc(Exprs.Inc); 1995 Dir->setIsLastIterVariable(Exprs.IL); 1996 Dir->setLowerBoundVariable(Exprs.LB); 1997 Dir->setUpperBoundVariable(Exprs.UB); 1998 Dir->setStrideVariable(Exprs.ST); 1999 Dir->setEnsureUpperBound(Exprs.EUB); 2000 Dir->setNextLowerBound(Exprs.NLB); 2001 Dir->setNextUpperBound(Exprs.NUB); 2002 Dir->setNumIterations(Exprs.NumIterations); 2003 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 2004 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 2005 Dir->setDistInc(Exprs.DistInc); 2006 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 2007 Dir->setCounters(Exprs.Counters); 2008 Dir->setPrivateCounters(Exprs.PrivateCounters); 2009 Dir->setInits(Exprs.Inits); 2010 Dir->setUpdates(Exprs.Updates); 2011 Dir->setFinals(Exprs.Finals); 2012 Dir->setDependentCounters(Exprs.DependentCounters); 2013 Dir->setDependentInits(Exprs.DependentInits); 2014 Dir->setFinalsConditions(Exprs.FinalsConditions); 2015 Dir->setPreInits(Exprs.PreInits); 2016 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 2017 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 2018 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 2019 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 2020 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 2021 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 2022 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 2023 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 2024 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 2025 return Dir; 2026 } 2027 2028 OMPTeamsDistributeParallelForSimdDirective * 2029 OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C, 2030 unsigned NumClauses, 2031 unsigned CollapsedNum, 2032 EmptyShell) { 2033 return createEmptyDirective<OMPTeamsDistributeParallelForSimdDirective>( 2034 C, NumClauses, /*HasAssociatedStmt=*/true, 2035 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd), 2036 CollapsedNum); 2037 } 2038 2039 OMPTeamsDistributeParallelForDirective * 2040 OMPTeamsDistributeParallelForDirective::Create( 2041 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2042 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2043 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) { 2044 auto *Dir = createDirective<OMPTeamsDistributeParallelForDirective>( 2045 C, Clauses, AssociatedStmt, 2046 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1, 2047 StartLoc, EndLoc, CollapsedNum); 2048 Dir->setIterationVariable(Exprs.IterationVarRef); 2049 Dir->setLastIteration(Exprs.LastIteration); 2050 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2051 Dir->setPreCond(Exprs.PreCond); 2052 Dir->setCond(Exprs.Cond); 2053 Dir->setInit(Exprs.Init); 2054 Dir->setInc(Exprs.Inc); 2055 Dir->setIsLastIterVariable(Exprs.IL); 2056 Dir->setLowerBoundVariable(Exprs.LB); 2057 Dir->setUpperBoundVariable(Exprs.UB); 2058 Dir->setStrideVariable(Exprs.ST); 2059 Dir->setEnsureUpperBound(Exprs.EUB); 2060 Dir->setNextLowerBound(Exprs.NLB); 2061 Dir->setNextUpperBound(Exprs.NUB); 2062 Dir->setNumIterations(Exprs.NumIterations); 2063 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 2064 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 2065 Dir->setDistInc(Exprs.DistInc); 2066 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 2067 Dir->setCounters(Exprs.Counters); 2068 Dir->setPrivateCounters(Exprs.PrivateCounters); 2069 Dir->setInits(Exprs.Inits); 2070 Dir->setUpdates(Exprs.Updates); 2071 Dir->setFinals(Exprs.Finals); 2072 Dir->setDependentCounters(Exprs.DependentCounters); 2073 Dir->setDependentInits(Exprs.DependentInits); 2074 Dir->setFinalsConditions(Exprs.FinalsConditions); 2075 Dir->setPreInits(Exprs.PreInits); 2076 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 2077 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 2078 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 2079 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 2080 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 2081 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 2082 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 2083 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 2084 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 2085 Dir->setTaskReductionRefExpr(TaskRedRef); 2086 Dir->HasCancel = HasCancel; 2087 return Dir; 2088 } 2089 2090 OMPTeamsDistributeParallelForDirective * 2091 OMPTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C, 2092 unsigned NumClauses, 2093 unsigned CollapsedNum, 2094 EmptyShell) { 2095 return createEmptyDirective<OMPTeamsDistributeParallelForDirective>( 2096 C, NumClauses, /*HasAssociatedStmt=*/true, 2097 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1, 2098 CollapsedNum); 2099 } 2100 2101 OMPTargetTeamsDirective *OMPTargetTeamsDirective::Create( 2102 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2103 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 2104 return createDirective<OMPTargetTeamsDirective>(C, Clauses, AssociatedStmt, 2105 /*NumChildren=*/0, StartLoc, 2106 EndLoc); 2107 } 2108 2109 OMPTargetTeamsDirective * 2110 OMPTargetTeamsDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 2111 EmptyShell) { 2112 return createEmptyDirective<OMPTargetTeamsDirective>( 2113 C, NumClauses, /*HasAssociatedStmt=*/true); 2114 } 2115 2116 OMPTargetTeamsDistributeDirective *OMPTargetTeamsDistributeDirective::Create( 2117 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2118 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2119 const HelperExprs &Exprs) { 2120 auto *Dir = createDirective<OMPTargetTeamsDistributeDirective>( 2121 C, Clauses, AssociatedStmt, 2122 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute), StartLoc, 2123 EndLoc, CollapsedNum); 2124 Dir->setIterationVariable(Exprs.IterationVarRef); 2125 Dir->setLastIteration(Exprs.LastIteration); 2126 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2127 Dir->setPreCond(Exprs.PreCond); 2128 Dir->setCond(Exprs.Cond); 2129 Dir->setInit(Exprs.Init); 2130 Dir->setInc(Exprs.Inc); 2131 Dir->setIsLastIterVariable(Exprs.IL); 2132 Dir->setLowerBoundVariable(Exprs.LB); 2133 Dir->setUpperBoundVariable(Exprs.UB); 2134 Dir->setStrideVariable(Exprs.ST); 2135 Dir->setEnsureUpperBound(Exprs.EUB); 2136 Dir->setNextLowerBound(Exprs.NLB); 2137 Dir->setNextUpperBound(Exprs.NUB); 2138 Dir->setNumIterations(Exprs.NumIterations); 2139 Dir->setCounters(Exprs.Counters); 2140 Dir->setPrivateCounters(Exprs.PrivateCounters); 2141 Dir->setInits(Exprs.Inits); 2142 Dir->setUpdates(Exprs.Updates); 2143 Dir->setFinals(Exprs.Finals); 2144 Dir->setDependentCounters(Exprs.DependentCounters); 2145 Dir->setDependentInits(Exprs.DependentInits); 2146 Dir->setFinalsConditions(Exprs.FinalsConditions); 2147 Dir->setPreInits(Exprs.PreInits); 2148 return Dir; 2149 } 2150 2151 OMPTargetTeamsDistributeDirective * 2152 OMPTargetTeamsDistributeDirective::CreateEmpty(const ASTContext &C, 2153 unsigned NumClauses, 2154 unsigned CollapsedNum, 2155 EmptyShell) { 2156 return createEmptyDirective<OMPTargetTeamsDistributeDirective>( 2157 C, NumClauses, /*HasAssociatedStmt=*/true, 2158 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute), 2159 CollapsedNum); 2160 } 2161 2162 OMPTargetTeamsDistributeParallelForDirective * 2163 OMPTargetTeamsDistributeParallelForDirective::Create( 2164 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2165 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2166 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) { 2167 auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForDirective>( 2168 C, Clauses, AssociatedStmt, 2169 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) + 2170 1, 2171 StartLoc, EndLoc, CollapsedNum); 2172 Dir->setIterationVariable(Exprs.IterationVarRef); 2173 Dir->setLastIteration(Exprs.LastIteration); 2174 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2175 Dir->setPreCond(Exprs.PreCond); 2176 Dir->setCond(Exprs.Cond); 2177 Dir->setInit(Exprs.Init); 2178 Dir->setInc(Exprs.Inc); 2179 Dir->setIsLastIterVariable(Exprs.IL); 2180 Dir->setLowerBoundVariable(Exprs.LB); 2181 Dir->setUpperBoundVariable(Exprs.UB); 2182 Dir->setStrideVariable(Exprs.ST); 2183 Dir->setEnsureUpperBound(Exprs.EUB); 2184 Dir->setNextLowerBound(Exprs.NLB); 2185 Dir->setNextUpperBound(Exprs.NUB); 2186 Dir->setNumIterations(Exprs.NumIterations); 2187 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 2188 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 2189 Dir->setDistInc(Exprs.DistInc); 2190 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 2191 Dir->setCounters(Exprs.Counters); 2192 Dir->setPrivateCounters(Exprs.PrivateCounters); 2193 Dir->setInits(Exprs.Inits); 2194 Dir->setUpdates(Exprs.Updates); 2195 Dir->setFinals(Exprs.Finals); 2196 Dir->setDependentCounters(Exprs.DependentCounters); 2197 Dir->setDependentInits(Exprs.DependentInits); 2198 Dir->setFinalsConditions(Exprs.FinalsConditions); 2199 Dir->setPreInits(Exprs.PreInits); 2200 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 2201 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 2202 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 2203 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 2204 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 2205 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 2206 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 2207 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 2208 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 2209 Dir->setTaskReductionRefExpr(TaskRedRef); 2210 Dir->HasCancel = HasCancel; 2211 return Dir; 2212 } 2213 2214 OMPTargetTeamsDistributeParallelForDirective * 2215 OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C, 2216 unsigned NumClauses, 2217 unsigned CollapsedNum, 2218 EmptyShell) { 2219 return createEmptyDirective<OMPTargetTeamsDistributeParallelForDirective>( 2220 C, NumClauses, /*HasAssociatedStmt=*/true, 2221 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) + 2222 1, 2223 CollapsedNum); 2224 } 2225 2226 OMPTargetTeamsDistributeParallelForSimdDirective * 2227 OMPTargetTeamsDistributeParallelForSimdDirective::Create( 2228 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2229 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2230 const HelperExprs &Exprs) { 2231 auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForSimdDirective>( 2232 C, Clauses, AssociatedStmt, 2233 numLoopChildren(CollapsedNum, 2234 OMPD_target_teams_distribute_parallel_for_simd), 2235 StartLoc, EndLoc, CollapsedNum); 2236 Dir->setIterationVariable(Exprs.IterationVarRef); 2237 Dir->setLastIteration(Exprs.LastIteration); 2238 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2239 Dir->setPreCond(Exprs.PreCond); 2240 Dir->setCond(Exprs.Cond); 2241 Dir->setInit(Exprs.Init); 2242 Dir->setInc(Exprs.Inc); 2243 Dir->setIsLastIterVariable(Exprs.IL); 2244 Dir->setLowerBoundVariable(Exprs.LB); 2245 Dir->setUpperBoundVariable(Exprs.UB); 2246 Dir->setStrideVariable(Exprs.ST); 2247 Dir->setEnsureUpperBound(Exprs.EUB); 2248 Dir->setNextLowerBound(Exprs.NLB); 2249 Dir->setNextUpperBound(Exprs.NUB); 2250 Dir->setNumIterations(Exprs.NumIterations); 2251 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 2252 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 2253 Dir->setDistInc(Exprs.DistInc); 2254 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 2255 Dir->setCounters(Exprs.Counters); 2256 Dir->setPrivateCounters(Exprs.PrivateCounters); 2257 Dir->setInits(Exprs.Inits); 2258 Dir->setUpdates(Exprs.Updates); 2259 Dir->setFinals(Exprs.Finals); 2260 Dir->setDependentCounters(Exprs.DependentCounters); 2261 Dir->setDependentInits(Exprs.DependentInits); 2262 Dir->setFinalsConditions(Exprs.FinalsConditions); 2263 Dir->setPreInits(Exprs.PreInits); 2264 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 2265 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 2266 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 2267 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 2268 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 2269 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 2270 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 2271 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 2272 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 2273 return Dir; 2274 } 2275 2276 OMPTargetTeamsDistributeParallelForSimdDirective * 2277 OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty( 2278 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, 2279 EmptyShell) { 2280 return createEmptyDirective<OMPTargetTeamsDistributeParallelForSimdDirective>( 2281 C, NumClauses, /*HasAssociatedStmt=*/true, 2282 numLoopChildren(CollapsedNum, 2283 OMPD_target_teams_distribute_parallel_for_simd), 2284 CollapsedNum); 2285 } 2286 2287 OMPTargetTeamsDistributeSimdDirective * 2288 OMPTargetTeamsDistributeSimdDirective::Create( 2289 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2290 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2291 const HelperExprs &Exprs) { 2292 auto *Dir = createDirective<OMPTargetTeamsDistributeSimdDirective>( 2293 C, Clauses, AssociatedStmt, 2294 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd), 2295 StartLoc, EndLoc, CollapsedNum); 2296 Dir->setIterationVariable(Exprs.IterationVarRef); 2297 Dir->setLastIteration(Exprs.LastIteration); 2298 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2299 Dir->setPreCond(Exprs.PreCond); 2300 Dir->setCond(Exprs.Cond); 2301 Dir->setInit(Exprs.Init); 2302 Dir->setInc(Exprs.Inc); 2303 Dir->setIsLastIterVariable(Exprs.IL); 2304 Dir->setLowerBoundVariable(Exprs.LB); 2305 Dir->setUpperBoundVariable(Exprs.UB); 2306 Dir->setStrideVariable(Exprs.ST); 2307 Dir->setEnsureUpperBound(Exprs.EUB); 2308 Dir->setNextLowerBound(Exprs.NLB); 2309 Dir->setNextUpperBound(Exprs.NUB); 2310 Dir->setNumIterations(Exprs.NumIterations); 2311 Dir->setCounters(Exprs.Counters); 2312 Dir->setPrivateCounters(Exprs.PrivateCounters); 2313 Dir->setInits(Exprs.Inits); 2314 Dir->setUpdates(Exprs.Updates); 2315 Dir->setFinals(Exprs.Finals); 2316 Dir->setDependentCounters(Exprs.DependentCounters); 2317 Dir->setDependentInits(Exprs.DependentInits); 2318 Dir->setFinalsConditions(Exprs.FinalsConditions); 2319 Dir->setPreInits(Exprs.PreInits); 2320 return Dir; 2321 } 2322 2323 OMPTargetTeamsDistributeSimdDirective * 2324 OMPTargetTeamsDistributeSimdDirective::CreateEmpty(const ASTContext &C, 2325 unsigned NumClauses, 2326 unsigned CollapsedNum, 2327 EmptyShell) { 2328 return createEmptyDirective<OMPTargetTeamsDistributeSimdDirective>( 2329 C, NumClauses, /*HasAssociatedStmt=*/true, 2330 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd), 2331 CollapsedNum); 2332 } 2333 2334 OMPInteropDirective * 2335 OMPInteropDirective::Create(const ASTContext &C, SourceLocation StartLoc, 2336 SourceLocation EndLoc, 2337 ArrayRef<OMPClause *> Clauses) { 2338 return createDirective<OMPInteropDirective>( 2339 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc, 2340 EndLoc); 2341 } 2342 2343 OMPInteropDirective *OMPInteropDirective::CreateEmpty(const ASTContext &C, 2344 unsigned NumClauses, 2345 EmptyShell) { 2346 return createEmptyDirective<OMPInteropDirective>(C, NumClauses); 2347 } 2348 2349 OMPDispatchDirective *OMPDispatchDirective::Create( 2350 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2351 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2352 SourceLocation TargetCallLoc) { 2353 auto *Dir = createDirective<OMPDispatchDirective>( 2354 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc); 2355 Dir->setTargetCallLoc(TargetCallLoc); 2356 return Dir; 2357 } 2358 2359 OMPDispatchDirective *OMPDispatchDirective::CreateEmpty(const ASTContext &C, 2360 unsigned NumClauses, 2361 EmptyShell) { 2362 return createEmptyDirective<OMPDispatchDirective>(C, NumClauses, 2363 /*HasAssociatedStmt=*/true, 2364 /*NumChildren=*/0); 2365 } 2366 2367 OMPMaskedDirective *OMPMaskedDirective::Create(const ASTContext &C, 2368 SourceLocation StartLoc, 2369 SourceLocation EndLoc, 2370 ArrayRef<OMPClause *> Clauses, 2371 Stmt *AssociatedStmt) { 2372 return createDirective<OMPMaskedDirective>(C, Clauses, AssociatedStmt, 2373 /*NumChildren=*/0, StartLoc, 2374 EndLoc); 2375 } 2376 2377 OMPMaskedDirective *OMPMaskedDirective::CreateEmpty(const ASTContext &C, 2378 unsigned NumClauses, 2379 EmptyShell) { 2380 return createEmptyDirective<OMPMaskedDirective>(C, NumClauses, 2381 /*HasAssociatedStmt=*/true); 2382 } 2383 2384 OMPGenericLoopDirective *OMPGenericLoopDirective::Create( 2385 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2386 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2387 const HelperExprs &Exprs) { 2388 auto *Dir = createDirective<OMPGenericLoopDirective>( 2389 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_loop), 2390 StartLoc, EndLoc, CollapsedNum); 2391 Dir->setIterationVariable(Exprs.IterationVarRef); 2392 Dir->setLastIteration(Exprs.LastIteration); 2393 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2394 Dir->setPreCond(Exprs.PreCond); 2395 Dir->setCond(Exprs.Cond); 2396 Dir->setInit(Exprs.Init); 2397 Dir->setInc(Exprs.Inc); 2398 Dir->setIsLastIterVariable(Exprs.IL); 2399 Dir->setLowerBoundVariable(Exprs.LB); 2400 Dir->setUpperBoundVariable(Exprs.UB); 2401 Dir->setStrideVariable(Exprs.ST); 2402 Dir->setEnsureUpperBound(Exprs.EUB); 2403 Dir->setNextLowerBound(Exprs.NLB); 2404 Dir->setNextUpperBound(Exprs.NUB); 2405 Dir->setNumIterations(Exprs.NumIterations); 2406 Dir->setCounters(Exprs.Counters); 2407 Dir->setPrivateCounters(Exprs.PrivateCounters); 2408 Dir->setInits(Exprs.Inits); 2409 Dir->setUpdates(Exprs.Updates); 2410 Dir->setFinals(Exprs.Finals); 2411 Dir->setDependentCounters(Exprs.DependentCounters); 2412 Dir->setDependentInits(Exprs.DependentInits); 2413 Dir->setFinalsConditions(Exprs.FinalsConditions); 2414 Dir->setPreInits(Exprs.PreInits); 2415 return Dir; 2416 } 2417 2418 OMPGenericLoopDirective * 2419 OMPGenericLoopDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 2420 unsigned CollapsedNum, EmptyShell) { 2421 return createEmptyDirective<OMPGenericLoopDirective>( 2422 C, NumClauses, /*HasAssociatedStmt=*/true, 2423 numLoopChildren(CollapsedNum, OMPD_loop), CollapsedNum); 2424 } 2425 2426 OMPTeamsGenericLoopDirective *OMPTeamsGenericLoopDirective::Create( 2427 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2428 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2429 const HelperExprs &Exprs) { 2430 auto *Dir = createDirective<OMPTeamsGenericLoopDirective>( 2431 C, Clauses, AssociatedStmt, 2432 numLoopChildren(CollapsedNum, OMPD_teams_loop), StartLoc, EndLoc, 2433 CollapsedNum); 2434 Dir->setIterationVariable(Exprs.IterationVarRef); 2435 Dir->setLastIteration(Exprs.LastIteration); 2436 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2437 Dir->setPreCond(Exprs.PreCond); 2438 Dir->setCond(Exprs.Cond); 2439 Dir->setInit(Exprs.Init); 2440 Dir->setInc(Exprs.Inc); 2441 Dir->setIsLastIterVariable(Exprs.IL); 2442 Dir->setLowerBoundVariable(Exprs.LB); 2443 Dir->setUpperBoundVariable(Exprs.UB); 2444 Dir->setStrideVariable(Exprs.ST); 2445 Dir->setEnsureUpperBound(Exprs.EUB); 2446 Dir->setNextLowerBound(Exprs.NLB); 2447 Dir->setNextUpperBound(Exprs.NUB); 2448 Dir->setNumIterations(Exprs.NumIterations); 2449 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 2450 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 2451 Dir->setDistInc(Exprs.DistInc); 2452 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 2453 Dir->setCounters(Exprs.Counters); 2454 Dir->setPrivateCounters(Exprs.PrivateCounters); 2455 Dir->setInits(Exprs.Inits); 2456 Dir->setUpdates(Exprs.Updates); 2457 Dir->setFinals(Exprs.Finals); 2458 Dir->setDependentCounters(Exprs.DependentCounters); 2459 Dir->setDependentInits(Exprs.DependentInits); 2460 Dir->setFinalsConditions(Exprs.FinalsConditions); 2461 Dir->setPreInits(Exprs.PreInits); 2462 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 2463 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 2464 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 2465 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 2466 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 2467 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 2468 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 2469 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 2470 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 2471 return Dir; 2472 } 2473 2474 OMPTeamsGenericLoopDirective * 2475 OMPTeamsGenericLoopDirective::CreateEmpty(const ASTContext &C, 2476 unsigned NumClauses, 2477 unsigned CollapsedNum, EmptyShell) { 2478 return createEmptyDirective<OMPTeamsGenericLoopDirective>( 2479 C, NumClauses, /*HasAssociatedStmt=*/true, 2480 numLoopChildren(CollapsedNum, OMPD_teams_loop), CollapsedNum); 2481 } 2482 2483 OMPTargetTeamsGenericLoopDirective *OMPTargetTeamsGenericLoopDirective::Create( 2484 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2485 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2486 const HelperExprs &Exprs, bool CanBeParallelFor) { 2487 auto *Dir = createDirective<OMPTargetTeamsGenericLoopDirective>( 2488 C, Clauses, AssociatedStmt, 2489 numLoopChildren(CollapsedNum, OMPD_target_teams_loop), StartLoc, EndLoc, 2490 CollapsedNum); 2491 Dir->setIterationVariable(Exprs.IterationVarRef); 2492 Dir->setLastIteration(Exprs.LastIteration); 2493 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2494 Dir->setPreCond(Exprs.PreCond); 2495 Dir->setCond(Exprs.Cond); 2496 Dir->setInit(Exprs.Init); 2497 Dir->setInc(Exprs.Inc); 2498 Dir->setIsLastIterVariable(Exprs.IL); 2499 Dir->setLowerBoundVariable(Exprs.LB); 2500 Dir->setUpperBoundVariable(Exprs.UB); 2501 Dir->setStrideVariable(Exprs.ST); 2502 Dir->setEnsureUpperBound(Exprs.EUB); 2503 Dir->setNextLowerBound(Exprs.NLB); 2504 Dir->setNextUpperBound(Exprs.NUB); 2505 Dir->setNumIterations(Exprs.NumIterations); 2506 Dir->setPrevLowerBoundVariable(Exprs.PrevLB); 2507 Dir->setPrevUpperBoundVariable(Exprs.PrevUB); 2508 Dir->setDistInc(Exprs.DistInc); 2509 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB); 2510 Dir->setCounters(Exprs.Counters); 2511 Dir->setPrivateCounters(Exprs.PrivateCounters); 2512 Dir->setInits(Exprs.Inits); 2513 Dir->setUpdates(Exprs.Updates); 2514 Dir->setFinals(Exprs.Finals); 2515 Dir->setDependentCounters(Exprs.DependentCounters); 2516 Dir->setDependentInits(Exprs.DependentInits); 2517 Dir->setFinalsConditions(Exprs.FinalsConditions); 2518 Dir->setPreInits(Exprs.PreInits); 2519 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB); 2520 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB); 2521 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB); 2522 Dir->setCombinedInit(Exprs.DistCombinedFields.Init); 2523 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); 2524 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); 2525 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); 2526 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond); 2527 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond); 2528 Dir->setCanBeParallelFor(CanBeParallelFor); 2529 return Dir; 2530 } 2531 2532 OMPTargetTeamsGenericLoopDirective * 2533 OMPTargetTeamsGenericLoopDirective::CreateEmpty(const ASTContext &C, 2534 unsigned NumClauses, 2535 unsigned CollapsedNum, 2536 EmptyShell) { 2537 return createEmptyDirective<OMPTargetTeamsGenericLoopDirective>( 2538 C, NumClauses, /*HasAssociatedStmt=*/true, 2539 numLoopChildren(CollapsedNum, OMPD_target_teams_loop), CollapsedNum); 2540 } 2541 2542 OMPParallelGenericLoopDirective *OMPParallelGenericLoopDirective::Create( 2543 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2544 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2545 const HelperExprs &Exprs) { 2546 auto *Dir = createDirective<OMPParallelGenericLoopDirective>( 2547 C, Clauses, AssociatedStmt, 2548 numLoopChildren(CollapsedNum, OMPD_parallel_loop), StartLoc, EndLoc, 2549 CollapsedNum); 2550 Dir->setIterationVariable(Exprs.IterationVarRef); 2551 Dir->setLastIteration(Exprs.LastIteration); 2552 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2553 Dir->setPreCond(Exprs.PreCond); 2554 Dir->setCond(Exprs.Cond); 2555 Dir->setInit(Exprs.Init); 2556 Dir->setInc(Exprs.Inc); 2557 Dir->setIsLastIterVariable(Exprs.IL); 2558 Dir->setLowerBoundVariable(Exprs.LB); 2559 Dir->setUpperBoundVariable(Exprs.UB); 2560 Dir->setStrideVariable(Exprs.ST); 2561 Dir->setEnsureUpperBound(Exprs.EUB); 2562 Dir->setNextLowerBound(Exprs.NLB); 2563 Dir->setNextUpperBound(Exprs.NUB); 2564 Dir->setNumIterations(Exprs.NumIterations); 2565 Dir->setCounters(Exprs.Counters); 2566 Dir->setPrivateCounters(Exprs.PrivateCounters); 2567 Dir->setInits(Exprs.Inits); 2568 Dir->setUpdates(Exprs.Updates); 2569 Dir->setFinals(Exprs.Finals); 2570 Dir->setDependentCounters(Exprs.DependentCounters); 2571 Dir->setDependentInits(Exprs.DependentInits); 2572 Dir->setFinalsConditions(Exprs.FinalsConditions); 2573 Dir->setPreInits(Exprs.PreInits); 2574 return Dir; 2575 } 2576 2577 OMPParallelGenericLoopDirective *OMPParallelGenericLoopDirective::CreateEmpty( 2578 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, 2579 EmptyShell) { 2580 return createEmptyDirective<OMPParallelGenericLoopDirective>( 2581 C, NumClauses, /*HasAssociatedStmt=*/true, 2582 numLoopChildren(CollapsedNum, OMPD_parallel_loop), CollapsedNum); 2583 } 2584 2585 OMPTargetParallelGenericLoopDirective * 2586 OMPTargetParallelGenericLoopDirective::Create( 2587 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 2588 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 2589 const HelperExprs &Exprs) { 2590 auto *Dir = createDirective<OMPTargetParallelGenericLoopDirective>( 2591 C, Clauses, AssociatedStmt, 2592 numLoopChildren(CollapsedNum, OMPD_target_parallel_loop), StartLoc, 2593 EndLoc, CollapsedNum); 2594 Dir->setIterationVariable(Exprs.IterationVarRef); 2595 Dir->setLastIteration(Exprs.LastIteration); 2596 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 2597 Dir->setPreCond(Exprs.PreCond); 2598 Dir->setCond(Exprs.Cond); 2599 Dir->setInit(Exprs.Init); 2600 Dir->setInc(Exprs.Inc); 2601 Dir->setIsLastIterVariable(Exprs.IL); 2602 Dir->setLowerBoundVariable(Exprs.LB); 2603 Dir->setUpperBoundVariable(Exprs.UB); 2604 Dir->setStrideVariable(Exprs.ST); 2605 Dir->setEnsureUpperBound(Exprs.EUB); 2606 Dir->setNextLowerBound(Exprs.NLB); 2607 Dir->setNextUpperBound(Exprs.NUB); 2608 Dir->setNumIterations(Exprs.NumIterations); 2609 Dir->setCounters(Exprs.Counters); 2610 Dir->setPrivateCounters(Exprs.PrivateCounters); 2611 Dir->setInits(Exprs.Inits); 2612 Dir->setUpdates(Exprs.Updates); 2613 Dir->setFinals(Exprs.Finals); 2614 Dir->setDependentCounters(Exprs.DependentCounters); 2615 Dir->setDependentInits(Exprs.DependentInits); 2616 Dir->setFinalsConditions(Exprs.FinalsConditions); 2617 Dir->setPreInits(Exprs.PreInits); 2618 return Dir; 2619 } 2620 2621 OMPTargetParallelGenericLoopDirective * 2622 OMPTargetParallelGenericLoopDirective::CreateEmpty(const ASTContext &C, 2623 unsigned NumClauses, 2624 unsigned CollapsedNum, 2625 EmptyShell) { 2626 return createEmptyDirective<OMPTargetParallelGenericLoopDirective>( 2627 C, NumClauses, /*HasAssociatedStmt=*/true, 2628 numLoopChildren(CollapsedNum, OMPD_target_parallel_loop), CollapsedNum); 2629 } 2630