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
size(unsigned NumClauses,bool HasAssociatedStmt,unsigned NumChildren)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
setClauses(ArrayRef<OMPClause * > Clauses)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
getChildren()33 MutableArrayRef<Stmt *> OMPChildren::getChildren() {
34 return getTrailingObjects<Stmt *>(NumChildren);
35 }
36
Create(void * Mem,ArrayRef<OMPClause * > Clauses)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
Create(void * Mem,ArrayRef<OMPClause * > Clauses,Stmt * S,unsigned NumChildren)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
CreateEmpty(void * Mem,unsigned NumClauses,bool HasAssociatedStmt,unsigned NumChildren)52 OMPChildren *OMPChildren::CreateEmpty(void *Mem, unsigned NumClauses,
53 bool HasAssociatedStmt,
54 unsigned NumChildren) {
55 return new (Mem) OMPChildren(NumClauses, NumChildren, HasAssociatedStmt);
56 }
57
isStandaloneDirective() const58 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
getStructuredBlock()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 *
tryToFindNextInnerLoop(Stmt * CurStmt,bool TryImperfectlyNestedLoops)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
doForAllLoops(Stmt * CurStmt,bool TryImperfectlyNestedLoops,unsigned NumLoops,llvm::function_ref<bool (unsigned,Stmt *)> Callback,llvm::function_ref<void (OMPLoopTransformationDirective *)> OnTransformationCallback)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
doForAllLoopsBodies(Stmt * CurStmt,bool TryImperfectlyNestedLoops,unsigned NumLoops,llvm::function_ref<void (unsigned,Stmt *,Stmt *)> Callback)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
getBody()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
setCounters(ArrayRef<Expr * > A)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
setPrivateCounters(ArrayRef<Expr * > A)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
setInits(ArrayRef<Expr * > A)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
setUpdates(ArrayRef<Expr * > A)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
setFinals(ArrayRef<Expr * > A)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
setDependentCounters(ArrayRef<Expr * > A)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
setDependentInits(ArrayRef<Expr * > A)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
setFinalsConditions(ArrayRef<Expr * > A)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
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Stmt * IfStmt)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
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)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
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)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
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)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 *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)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
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)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
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)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
getTransformedStmt() const372 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
getPreInits() const385 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
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)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 *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,unsigned NumLoops,Stmt * AssociatedStmt,Stmt * TransformedStmt,Stmt * PreInits)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
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned NumLoops)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 OMPStripeDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,unsigned NumLoops,Stmt * AssociatedStmt,Stmt * TransformedStmt,Stmt * PreInits)429 OMPStripeDirective::Create(const ASTContext &C, SourceLocation StartLoc,
430 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
431 unsigned NumLoops, Stmt *AssociatedStmt,
432 Stmt *TransformedStmt, Stmt *PreInits) {
433 OMPStripeDirective *Dir = createDirective<OMPStripeDirective>(
434 C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc,
435 NumLoops);
436 Dir->setTransformedStmt(TransformedStmt);
437 Dir->setPreInits(PreInits);
438 return Dir;
439 }
440
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned NumLoops)441 OMPStripeDirective *OMPStripeDirective::CreateEmpty(const ASTContext &C,
442 unsigned NumClauses,
443 unsigned NumLoops) {
444 return createEmptyDirective<OMPStripeDirective>(
445 C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
446 SourceLocation(), SourceLocation(), NumLoops);
447 }
448
449 OMPUnrollDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,unsigned NumGeneratedLoops,Stmt * TransformedStmt,Stmt * PreInits)450 OMPUnrollDirective::Create(const ASTContext &C, SourceLocation StartLoc,
451 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
452 Stmt *AssociatedStmt, unsigned NumGeneratedLoops,
453 Stmt *TransformedStmt, Stmt *PreInits) {
454 assert(NumGeneratedLoops <= 1 && "Unrolling generates at most one loop");
455
456 auto *Dir = createDirective<OMPUnrollDirective>(
457 C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc);
458 Dir->setNumGeneratedLoops(NumGeneratedLoops);
459 Dir->setTransformedStmt(TransformedStmt);
460 Dir->setPreInits(PreInits);
461 return Dir;
462 }
463
CreateEmpty(const ASTContext & C,unsigned NumClauses)464 OMPUnrollDirective *OMPUnrollDirective::CreateEmpty(const ASTContext &C,
465 unsigned NumClauses) {
466 return createEmptyDirective<OMPUnrollDirective>(
467 C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
468 SourceLocation(), SourceLocation());
469 }
470
471 OMPReverseDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,Stmt * AssociatedStmt,unsigned NumLoops,Stmt * TransformedStmt,Stmt * PreInits)472 OMPReverseDirective::Create(const ASTContext &C, SourceLocation StartLoc,
473 SourceLocation EndLoc, Stmt *AssociatedStmt,
474 unsigned NumLoops, Stmt *TransformedStmt,
475 Stmt *PreInits) {
476 OMPReverseDirective *Dir = createDirective<OMPReverseDirective>(
477 C, {}, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc,
478 NumLoops);
479 Dir->setTransformedStmt(TransformedStmt);
480 Dir->setPreInits(PreInits);
481 return Dir;
482 }
483
CreateEmpty(const ASTContext & C,unsigned NumLoops)484 OMPReverseDirective *OMPReverseDirective::CreateEmpty(const ASTContext &C,
485 unsigned NumLoops) {
486 return createEmptyDirective<OMPReverseDirective>(
487 C, /*NumClauses=*/0, /*HasAssociatedStmt=*/true,
488 TransformedStmtOffset + 1, SourceLocation(), SourceLocation(), NumLoops);
489 }
490
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,unsigned NumLoops,Stmt * AssociatedStmt,Stmt * TransformedStmt,Stmt * PreInits)491 OMPInterchangeDirective *OMPInterchangeDirective::Create(
492 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
493 ArrayRef<OMPClause *> Clauses, unsigned NumLoops, Stmt *AssociatedStmt,
494 Stmt *TransformedStmt, Stmt *PreInits) {
495 OMPInterchangeDirective *Dir = createDirective<OMPInterchangeDirective>(
496 C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc,
497 NumLoops);
498 Dir->setTransformedStmt(TransformedStmt);
499 Dir->setPreInits(PreInits);
500 return Dir;
501 }
502
503 OMPInterchangeDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned NumLoops)504 OMPInterchangeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
505 unsigned NumLoops) {
506 return createEmptyDirective<OMPInterchangeDirective>(
507 C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
508 SourceLocation(), SourceLocation(), NumLoops);
509 }
510
511 OMPForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)512 OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
513 SourceLocation EndLoc, unsigned CollapsedNum,
514 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
515 const HelperExprs &Exprs) {
516 auto *Dir = createDirective<OMPForSimdDirective>(
517 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_for_simd),
518 StartLoc, EndLoc, CollapsedNum);
519 Dir->setIterationVariable(Exprs.IterationVarRef);
520 Dir->setLastIteration(Exprs.LastIteration);
521 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
522 Dir->setPreCond(Exprs.PreCond);
523 Dir->setCond(Exprs.Cond);
524 Dir->setInit(Exprs.Init);
525 Dir->setInc(Exprs.Inc);
526 Dir->setIsLastIterVariable(Exprs.IL);
527 Dir->setLowerBoundVariable(Exprs.LB);
528 Dir->setUpperBoundVariable(Exprs.UB);
529 Dir->setStrideVariable(Exprs.ST);
530 Dir->setEnsureUpperBound(Exprs.EUB);
531 Dir->setNextLowerBound(Exprs.NLB);
532 Dir->setNextUpperBound(Exprs.NUB);
533 Dir->setNumIterations(Exprs.NumIterations);
534 Dir->setCounters(Exprs.Counters);
535 Dir->setPrivateCounters(Exprs.PrivateCounters);
536 Dir->setInits(Exprs.Inits);
537 Dir->setUpdates(Exprs.Updates);
538 Dir->setFinals(Exprs.Finals);
539 Dir->setDependentCounters(Exprs.DependentCounters);
540 Dir->setDependentInits(Exprs.DependentInits);
541 Dir->setFinalsConditions(Exprs.FinalsConditions);
542 Dir->setPreInits(Exprs.PreInits);
543 return Dir;
544 }
545
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)546 OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C,
547 unsigned NumClauses,
548 unsigned CollapsedNum,
549 EmptyShell) {
550 return createEmptyDirective<OMPForSimdDirective>(
551 C, NumClauses, /*HasAssociatedStmt=*/true,
552 numLoopChildren(CollapsedNum, OMPD_for_simd), CollapsedNum);
553 }
554
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)555 OMPSectionsDirective *OMPSectionsDirective::Create(
556 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
557 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
558 bool HasCancel) {
559 auto *Dir = createDirective<OMPSectionsDirective>(C, Clauses, AssociatedStmt,
560 /*NumChildren=*/1, StartLoc,
561 EndLoc);
562 Dir->setTaskReductionRefExpr(TaskRedRef);
563 Dir->setHasCancel(HasCancel);
564 return Dir;
565 }
566
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)567 OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C,
568 unsigned NumClauses,
569 EmptyShell) {
570 return createEmptyDirective<OMPSectionsDirective>(C, NumClauses,
571 /*HasAssociatedStmt=*/true,
572 /*NumChildren=*/1);
573 }
574
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,Stmt * AssociatedStmt,bool HasCancel)575 OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C,
576 SourceLocation StartLoc,
577 SourceLocation EndLoc,
578 Stmt *AssociatedStmt,
579 bool HasCancel) {
580 auto *Dir =
581 createDirective<OMPSectionDirective>(C, {}, AssociatedStmt,
582 /*NumChildren=*/0, StartLoc, EndLoc);
583 Dir->setHasCancel(HasCancel);
584 return Dir;
585 }
586
CreateEmpty(const ASTContext & C,EmptyShell)587 OMPSectionDirective *OMPSectionDirective::CreateEmpty(const ASTContext &C,
588 EmptyShell) {
589 return createEmptyDirective<OMPSectionDirective>(C, /*NumClauses=*/0,
590 /*HasAssociatedStmt=*/true);
591 }
592
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)593 OMPScopeDirective *OMPScopeDirective::Create(const ASTContext &C,
594 SourceLocation StartLoc,
595 SourceLocation EndLoc,
596 ArrayRef<OMPClause *> Clauses,
597 Stmt *AssociatedStmt) {
598 return createDirective<OMPScopeDirective>(C, Clauses, AssociatedStmt,
599 /*NumChildren=*/0, StartLoc,
600 EndLoc);
601 }
602
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)603 OMPScopeDirective *OMPScopeDirective::CreateEmpty(const ASTContext &C,
604 unsigned NumClauses,
605 EmptyShell) {
606 return createEmptyDirective<OMPScopeDirective>(C, NumClauses,
607 /*HasAssociatedStmt=*/true);
608 }
609
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)610 OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C,
611 SourceLocation StartLoc,
612 SourceLocation EndLoc,
613 ArrayRef<OMPClause *> Clauses,
614 Stmt *AssociatedStmt) {
615 return createDirective<OMPSingleDirective>(C, Clauses, AssociatedStmt,
616 /*NumChildren=*/0, StartLoc,
617 EndLoc);
618 }
619
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)620 OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C,
621 unsigned NumClauses,
622 EmptyShell) {
623 return createEmptyDirective<OMPSingleDirective>(C, NumClauses,
624 /*HasAssociatedStmt=*/true);
625 }
626
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,Stmt * AssociatedStmt)627 OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C,
628 SourceLocation StartLoc,
629 SourceLocation EndLoc,
630 Stmt *AssociatedStmt) {
631 return createDirective<OMPMasterDirective>(C, {}, AssociatedStmt,
632 /*NumChildren=*/0, StartLoc,
633 EndLoc);
634 }
635
CreateEmpty(const ASTContext & C,EmptyShell)636 OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C,
637 EmptyShell) {
638 return createEmptyDirective<OMPMasterDirective>(C, /*NumClauses=*/0,
639 /*HasAssociatedStmt=*/true);
640 }
641
Create(const ASTContext & C,const DeclarationNameInfo & Name,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)642 OMPCriticalDirective *OMPCriticalDirective::Create(
643 const ASTContext &C, const DeclarationNameInfo &Name,
644 SourceLocation StartLoc, SourceLocation EndLoc,
645 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
646 return createDirective<OMPCriticalDirective>(C, Clauses, AssociatedStmt,
647 /*NumChildren=*/0, Name,
648 StartLoc, EndLoc);
649 }
650
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)651 OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C,
652 unsigned NumClauses,
653 EmptyShell) {
654 return createEmptyDirective<OMPCriticalDirective>(C, NumClauses,
655 /*HasAssociatedStmt=*/true);
656 }
657
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)658 OMPParallelForDirective *OMPParallelForDirective::Create(
659 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
660 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
661 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
662 auto *Dir = createDirective<OMPParallelForDirective>(
663 C, Clauses, AssociatedStmt,
664 numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, StartLoc, EndLoc,
665 CollapsedNum);
666 Dir->setIterationVariable(Exprs.IterationVarRef);
667 Dir->setLastIteration(Exprs.LastIteration);
668 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
669 Dir->setPreCond(Exprs.PreCond);
670 Dir->setCond(Exprs.Cond);
671 Dir->setInit(Exprs.Init);
672 Dir->setInc(Exprs.Inc);
673 Dir->setIsLastIterVariable(Exprs.IL);
674 Dir->setLowerBoundVariable(Exprs.LB);
675 Dir->setUpperBoundVariable(Exprs.UB);
676 Dir->setStrideVariable(Exprs.ST);
677 Dir->setEnsureUpperBound(Exprs.EUB);
678 Dir->setNextLowerBound(Exprs.NLB);
679 Dir->setNextUpperBound(Exprs.NUB);
680 Dir->setNumIterations(Exprs.NumIterations);
681 Dir->setCounters(Exprs.Counters);
682 Dir->setPrivateCounters(Exprs.PrivateCounters);
683 Dir->setInits(Exprs.Inits);
684 Dir->setUpdates(Exprs.Updates);
685 Dir->setFinals(Exprs.Finals);
686 Dir->setDependentCounters(Exprs.DependentCounters);
687 Dir->setDependentInits(Exprs.DependentInits);
688 Dir->setFinalsConditions(Exprs.FinalsConditions);
689 Dir->setPreInits(Exprs.PreInits);
690 Dir->setTaskReductionRefExpr(TaskRedRef);
691 Dir->setHasCancel(HasCancel);
692 return Dir;
693 }
694
695 OMPParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)696 OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
697 unsigned CollapsedNum, EmptyShell) {
698 return createEmptyDirective<OMPParallelForDirective>(
699 C, NumClauses, /*HasAssociatedStmt=*/true,
700 numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, CollapsedNum);
701 }
702
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)703 OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create(
704 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
705 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
706 const HelperExprs &Exprs) {
707 auto *Dir = createDirective<OMPParallelForSimdDirective>(
708 C, Clauses, AssociatedStmt,
709 numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), StartLoc, EndLoc,
710 CollapsedNum);
711 Dir->setIterationVariable(Exprs.IterationVarRef);
712 Dir->setLastIteration(Exprs.LastIteration);
713 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
714 Dir->setPreCond(Exprs.PreCond);
715 Dir->setCond(Exprs.Cond);
716 Dir->setInit(Exprs.Init);
717 Dir->setInc(Exprs.Inc);
718 Dir->setIsLastIterVariable(Exprs.IL);
719 Dir->setLowerBoundVariable(Exprs.LB);
720 Dir->setUpperBoundVariable(Exprs.UB);
721 Dir->setStrideVariable(Exprs.ST);
722 Dir->setEnsureUpperBound(Exprs.EUB);
723 Dir->setNextLowerBound(Exprs.NLB);
724 Dir->setNextUpperBound(Exprs.NUB);
725 Dir->setNumIterations(Exprs.NumIterations);
726 Dir->setCounters(Exprs.Counters);
727 Dir->setPrivateCounters(Exprs.PrivateCounters);
728 Dir->setInits(Exprs.Inits);
729 Dir->setUpdates(Exprs.Updates);
730 Dir->setFinals(Exprs.Finals);
731 Dir->setDependentCounters(Exprs.DependentCounters);
732 Dir->setDependentInits(Exprs.DependentInits);
733 Dir->setFinalsConditions(Exprs.FinalsConditions);
734 Dir->setPreInits(Exprs.PreInits);
735 return Dir;
736 }
737
738 OMPParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)739 OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C,
740 unsigned NumClauses,
741 unsigned CollapsedNum, EmptyShell) {
742 return createEmptyDirective<OMPParallelForSimdDirective>(
743 C, NumClauses, /*HasAssociatedStmt=*/true,
744 numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), CollapsedNum);
745 }
746
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef)747 OMPParallelMasterDirective *OMPParallelMasterDirective::Create(
748 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
749 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef) {
750 auto *Dir = createDirective<OMPParallelMasterDirective>(
751 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
752 Dir->setTaskReductionRefExpr(TaskRedRef);
753 return Dir;
754 }
755
756 OMPParallelMasterDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)757 OMPParallelMasterDirective::CreateEmpty(const ASTContext &C,
758 unsigned NumClauses, EmptyShell) {
759 return createEmptyDirective<OMPParallelMasterDirective>(
760 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
761 }
762
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef)763 OMPParallelMaskedDirective *OMPParallelMaskedDirective::Create(
764 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
765 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef) {
766 auto *Dir = createDirective<OMPParallelMaskedDirective>(
767 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
768 Dir->setTaskReductionRefExpr(TaskRedRef);
769 return Dir;
770 }
771
772 OMPParallelMaskedDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)773 OMPParallelMaskedDirective::CreateEmpty(const ASTContext &C,
774 unsigned NumClauses, EmptyShell) {
775 return createEmptyDirective<OMPParallelMaskedDirective>(
776 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
777 }
778
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)779 OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
780 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
781 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
782 bool HasCancel) {
783 auto *Dir = createDirective<OMPParallelSectionsDirective>(
784 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
785 Dir->setTaskReductionRefExpr(TaskRedRef);
786 Dir->setHasCancel(HasCancel);
787 return Dir;
788 }
789
790 OMPParallelSectionsDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)791 OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C,
792 unsigned NumClauses, EmptyShell) {
793 return createEmptyDirective<OMPParallelSectionsDirective>(
794 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
795 }
796
797 OMPTaskDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,bool HasCancel)798 OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
799 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
800 Stmt *AssociatedStmt, bool HasCancel) {
801 auto *Dir = createDirective<OMPTaskDirective>(
802 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
803 Dir->setHasCancel(HasCancel);
804 return Dir;
805 }
806
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)807 OMPTaskDirective *OMPTaskDirective::CreateEmpty(const ASTContext &C,
808 unsigned NumClauses,
809 EmptyShell) {
810 return createEmptyDirective<OMPTaskDirective>(C, NumClauses,
811 /*HasAssociatedStmt=*/true);
812 }
813
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc)814 OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C,
815 SourceLocation StartLoc,
816 SourceLocation EndLoc) {
817 return new (C) OMPTaskyieldDirective(StartLoc, EndLoc);
818 }
819
CreateEmpty(const ASTContext & C,EmptyShell)820 OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C,
821 EmptyShell) {
822 return new (C) OMPTaskyieldDirective();
823 }
824
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AStmt)825 OMPAssumeDirective *OMPAssumeDirective::Create(const ASTContext &C,
826 SourceLocation StartLoc,
827 SourceLocation EndLoc,
828 ArrayRef<OMPClause *> Clauses,
829 Stmt *AStmt) {
830 return createDirective<OMPAssumeDirective>(C, Clauses, AStmt,
831 /*NumChildren=*/0, StartLoc,
832 EndLoc);
833 }
834
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)835 OMPAssumeDirective *OMPAssumeDirective::CreateEmpty(const ASTContext &C,
836 unsigned NumClauses,
837 EmptyShell) {
838 return createEmptyDirective<OMPAssumeDirective>(C, NumClauses,
839 /*HasAssociatedStmt=*/true);
840 }
841
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)842 OMPErrorDirective *OMPErrorDirective::Create(const ASTContext &C,
843 SourceLocation StartLoc,
844 SourceLocation EndLoc,
845 ArrayRef<OMPClause *> Clauses) {
846 return createDirective<OMPErrorDirective>(
847 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
848 EndLoc);
849 }
850
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)851 OMPErrorDirective *OMPErrorDirective::CreateEmpty(const ASTContext &C,
852 unsigned NumClauses,
853 EmptyShell) {
854 return createEmptyDirective<OMPErrorDirective>(C, NumClauses);
855 }
856
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc)857 OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C,
858 SourceLocation StartLoc,
859 SourceLocation EndLoc) {
860 return new (C) OMPBarrierDirective(StartLoc, EndLoc);
861 }
862
CreateEmpty(const ASTContext & C,EmptyShell)863 OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C,
864 EmptyShell) {
865 return new (C) OMPBarrierDirective();
866 }
867
868 OMPTaskwaitDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)869 OMPTaskwaitDirective::Create(const ASTContext &C, SourceLocation StartLoc,
870 SourceLocation EndLoc,
871 ArrayRef<OMPClause *> Clauses) {
872 return createDirective<OMPTaskwaitDirective>(
873 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
874 EndLoc);
875 }
876
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)877 OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C,
878 unsigned NumClauses,
879 EmptyShell) {
880 return createEmptyDirective<OMPTaskwaitDirective>(C, NumClauses);
881 }
882
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * ReductionRef)883 OMPTaskgroupDirective *OMPTaskgroupDirective::Create(
884 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
885 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *ReductionRef) {
886 auto *Dir = createDirective<OMPTaskgroupDirective>(
887 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
888 Dir->setReductionRef(ReductionRef);
889 return Dir;
890 }
891
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)892 OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C,
893 unsigned NumClauses,
894 EmptyShell) {
895 return createEmptyDirective<OMPTaskgroupDirective>(
896 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
897 }
898
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,OpenMPDirectiveKind CancelRegion)899 OMPCancellationPointDirective *OMPCancellationPointDirective::Create(
900 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
901 OpenMPDirectiveKind CancelRegion) {
902 auto *Dir = new (C) OMPCancellationPointDirective(StartLoc, EndLoc);
903 Dir->setCancelRegion(CancelRegion);
904 return Dir;
905 }
906
907 OMPCancellationPointDirective *
CreateEmpty(const ASTContext & C,EmptyShell)908 OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) {
909 return new (C) OMPCancellationPointDirective();
910 }
911
912 OMPCancelDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,OpenMPDirectiveKind CancelRegion)913 OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc,
914 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
915 OpenMPDirectiveKind CancelRegion) {
916 auto *Dir = createDirective<OMPCancelDirective>(
917 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
918 EndLoc);
919 Dir->setCancelRegion(CancelRegion);
920 return Dir;
921 }
922
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)923 OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C,
924 unsigned NumClauses,
925 EmptyShell) {
926 return createEmptyDirective<OMPCancelDirective>(C, NumClauses);
927 }
928
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)929 OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C,
930 SourceLocation StartLoc,
931 SourceLocation EndLoc,
932 ArrayRef<OMPClause *> Clauses) {
933 return createDirective<OMPFlushDirective>(
934 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
935 EndLoc);
936 }
937
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)938 OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C,
939 unsigned NumClauses,
940 EmptyShell) {
941 return createEmptyDirective<OMPFlushDirective>(C, NumClauses);
942 }
943
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)944 OMPDepobjDirective *OMPDepobjDirective::Create(const ASTContext &C,
945 SourceLocation StartLoc,
946 SourceLocation EndLoc,
947 ArrayRef<OMPClause *> Clauses) {
948 return createDirective<OMPDepobjDirective>(
949 C, Clauses, /*AssociatedStmt=*/nullptr,
950 /*NumChildren=*/0, StartLoc, EndLoc);
951 }
952
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)953 OMPDepobjDirective *OMPDepobjDirective::CreateEmpty(const ASTContext &C,
954 unsigned NumClauses,
955 EmptyShell) {
956 return createEmptyDirective<OMPDepobjDirective>(C, NumClauses);
957 }
958
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)959 OMPScanDirective *OMPScanDirective::Create(const ASTContext &C,
960 SourceLocation StartLoc,
961 SourceLocation EndLoc,
962 ArrayRef<OMPClause *> Clauses) {
963 return createDirective<OMPScanDirective>(C, Clauses,
964 /*AssociatedStmt=*/nullptr,
965 /*NumChildren=*/0, StartLoc, EndLoc);
966 }
967
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)968 OMPScanDirective *OMPScanDirective::CreateEmpty(const ASTContext &C,
969 unsigned NumClauses,
970 EmptyShell) {
971 return createEmptyDirective<OMPScanDirective>(C, NumClauses);
972 }
973
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)974 OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
975 SourceLocation StartLoc,
976 SourceLocation EndLoc,
977 ArrayRef<OMPClause *> Clauses,
978 Stmt *AssociatedStmt) {
979 return createDirective<OMPOrderedDirective>(
980 C, Clauses, cast_or_null<CapturedStmt>(AssociatedStmt),
981 /*NumChildren=*/0, StartLoc, EndLoc);
982 }
983
CreateEmpty(const ASTContext & C,unsigned NumClauses,bool IsStandalone,EmptyShell)984 OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C,
985 unsigned NumClauses,
986 bool IsStandalone,
987 EmptyShell) {
988 return createEmptyDirective<OMPOrderedDirective>(C, NumClauses,
989 !IsStandalone);
990 }
991
992 OMPAtomicDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expressions Exprs)993 OMPAtomicDirective::Create(const ASTContext &C, SourceLocation StartLoc,
994 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
995 Stmt *AssociatedStmt, Expressions Exprs) {
996 auto *Dir = createDirective<OMPAtomicDirective>(
997 C, Clauses, AssociatedStmt, /*NumChildren=*/7, StartLoc, EndLoc);
998 Dir->setX(Exprs.X);
999 Dir->setV(Exprs.V);
1000 Dir->setR(Exprs.R);
1001 Dir->setExpr(Exprs.E);
1002 Dir->setUpdateExpr(Exprs.UE);
1003 Dir->setD(Exprs.D);
1004 Dir->setCond(Exprs.Cond);
1005 Dir->Flags.IsXLHSInRHSPart = Exprs.IsXLHSInRHSPart ? 1 : 0;
1006 Dir->Flags.IsPostfixUpdate = Exprs.IsPostfixUpdate ? 1 : 0;
1007 Dir->Flags.IsFailOnly = Exprs.IsFailOnly ? 1 : 0;
1008 return Dir;
1009 }
1010
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1011 OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C,
1012 unsigned NumClauses,
1013 EmptyShell) {
1014 return createEmptyDirective<OMPAtomicDirective>(
1015 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/7);
1016 }
1017
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1018 OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C,
1019 SourceLocation StartLoc,
1020 SourceLocation EndLoc,
1021 ArrayRef<OMPClause *> Clauses,
1022 Stmt *AssociatedStmt) {
1023 return createDirective<OMPTargetDirective>(
1024 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
1025 }
1026
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1027 OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C,
1028 unsigned NumClauses,
1029 EmptyShell) {
1030 return createEmptyDirective<OMPTargetDirective>(C, NumClauses,
1031 /*HasAssociatedStmt=*/true);
1032 }
1033
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)1034 OMPTargetParallelDirective *OMPTargetParallelDirective::Create(
1035 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1036 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
1037 bool HasCancel) {
1038 auto *Dir = createDirective<OMPTargetParallelDirective>(
1039 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
1040 Dir->setTaskReductionRefExpr(TaskRedRef);
1041 Dir->setHasCancel(HasCancel);
1042 return Dir;
1043 }
1044
1045 OMPTargetParallelDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1046 OMPTargetParallelDirective::CreateEmpty(const ASTContext &C,
1047 unsigned NumClauses, EmptyShell) {
1048 return createEmptyDirective<OMPTargetParallelDirective>(
1049 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
1050 }
1051
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)1052 OMPTargetParallelForDirective *OMPTargetParallelForDirective::Create(
1053 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1054 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1055 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
1056 auto *Dir = createDirective<OMPTargetParallelForDirective>(
1057 C, Clauses, AssociatedStmt,
1058 numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1, StartLoc,
1059 EndLoc, CollapsedNum);
1060 Dir->setIterationVariable(Exprs.IterationVarRef);
1061 Dir->setLastIteration(Exprs.LastIteration);
1062 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1063 Dir->setPreCond(Exprs.PreCond);
1064 Dir->setCond(Exprs.Cond);
1065 Dir->setInit(Exprs.Init);
1066 Dir->setInc(Exprs.Inc);
1067 Dir->setIsLastIterVariable(Exprs.IL);
1068 Dir->setLowerBoundVariable(Exprs.LB);
1069 Dir->setUpperBoundVariable(Exprs.UB);
1070 Dir->setStrideVariable(Exprs.ST);
1071 Dir->setEnsureUpperBound(Exprs.EUB);
1072 Dir->setNextLowerBound(Exprs.NLB);
1073 Dir->setNextUpperBound(Exprs.NUB);
1074 Dir->setNumIterations(Exprs.NumIterations);
1075 Dir->setCounters(Exprs.Counters);
1076 Dir->setPrivateCounters(Exprs.PrivateCounters);
1077 Dir->setInits(Exprs.Inits);
1078 Dir->setUpdates(Exprs.Updates);
1079 Dir->setFinals(Exprs.Finals);
1080 Dir->setDependentCounters(Exprs.DependentCounters);
1081 Dir->setDependentInits(Exprs.DependentInits);
1082 Dir->setFinalsConditions(Exprs.FinalsConditions);
1083 Dir->setPreInits(Exprs.PreInits);
1084 Dir->setTaskReductionRefExpr(TaskRedRef);
1085 Dir->setHasCancel(HasCancel);
1086 return Dir;
1087 }
1088
1089 OMPTargetParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1090 OMPTargetParallelForDirective::CreateEmpty(const ASTContext &C,
1091 unsigned NumClauses,
1092 unsigned CollapsedNum, EmptyShell) {
1093 return createEmptyDirective<OMPTargetParallelForDirective>(
1094 C, NumClauses, /*HasAssociatedStmt=*/true,
1095 numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1,
1096 CollapsedNum);
1097 }
1098
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1099 OMPTargetDataDirective *OMPTargetDataDirective::Create(
1100 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1101 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1102 return createDirective<OMPTargetDataDirective>(
1103 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
1104 }
1105
CreateEmpty(const ASTContext & C,unsigned N,EmptyShell)1106 OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C,
1107 unsigned N,
1108 EmptyShell) {
1109 return createEmptyDirective<OMPTargetDataDirective>(
1110 C, N, /*HasAssociatedStmt=*/true);
1111 }
1112
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1113 OMPTargetEnterDataDirective *OMPTargetEnterDataDirective::Create(
1114 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1115 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1116 return createDirective<OMPTargetEnterDataDirective>(
1117 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
1118 }
1119
1120 OMPTargetEnterDataDirective *
CreateEmpty(const ASTContext & C,unsigned N,EmptyShell)1121 OMPTargetEnterDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
1122 EmptyShell) {
1123 return createEmptyDirective<OMPTargetEnterDataDirective>(
1124 C, N, /*HasAssociatedStmt=*/true);
1125 }
1126
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1127 OMPTargetExitDataDirective *OMPTargetExitDataDirective::Create(
1128 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1129 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1130 return createDirective<OMPTargetExitDataDirective>(
1131 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
1132 }
1133
1134 OMPTargetExitDataDirective *
CreateEmpty(const ASTContext & C,unsigned N,EmptyShell)1135 OMPTargetExitDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
1136 EmptyShell) {
1137 return createEmptyDirective<OMPTargetExitDataDirective>(
1138 C, N, /*HasAssociatedStmt=*/true);
1139 }
1140
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1141 OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C,
1142 SourceLocation StartLoc,
1143 SourceLocation EndLoc,
1144 ArrayRef<OMPClause *> Clauses,
1145 Stmt *AssociatedStmt) {
1146 return createDirective<OMPTeamsDirective>(
1147 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
1148 }
1149
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1150 OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C,
1151 unsigned NumClauses,
1152 EmptyShell) {
1153 return createEmptyDirective<OMPTeamsDirective>(C, NumClauses,
1154 /*HasAssociatedStmt=*/true);
1155 }
1156
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)1157 OMPTaskLoopDirective *OMPTaskLoopDirective::Create(
1158 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1159 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1160 const HelperExprs &Exprs, bool HasCancel) {
1161 auto *Dir = createDirective<OMPTaskLoopDirective>(
1162 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_taskloop),
1163 StartLoc, EndLoc, CollapsedNum);
1164 Dir->setIterationVariable(Exprs.IterationVarRef);
1165 Dir->setLastIteration(Exprs.LastIteration);
1166 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1167 Dir->setPreCond(Exprs.PreCond);
1168 Dir->setCond(Exprs.Cond);
1169 Dir->setInit(Exprs.Init);
1170 Dir->setInc(Exprs.Inc);
1171 Dir->setIsLastIterVariable(Exprs.IL);
1172 Dir->setLowerBoundVariable(Exprs.LB);
1173 Dir->setUpperBoundVariable(Exprs.UB);
1174 Dir->setStrideVariable(Exprs.ST);
1175 Dir->setEnsureUpperBound(Exprs.EUB);
1176 Dir->setNextLowerBound(Exprs.NLB);
1177 Dir->setNextUpperBound(Exprs.NUB);
1178 Dir->setNumIterations(Exprs.NumIterations);
1179 Dir->setCounters(Exprs.Counters);
1180 Dir->setPrivateCounters(Exprs.PrivateCounters);
1181 Dir->setInits(Exprs.Inits);
1182 Dir->setUpdates(Exprs.Updates);
1183 Dir->setFinals(Exprs.Finals);
1184 Dir->setDependentCounters(Exprs.DependentCounters);
1185 Dir->setDependentInits(Exprs.DependentInits);
1186 Dir->setFinalsConditions(Exprs.FinalsConditions);
1187 Dir->setPreInits(Exprs.PreInits);
1188 Dir->setHasCancel(HasCancel);
1189 return Dir;
1190 }
1191
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1192 OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C,
1193 unsigned NumClauses,
1194 unsigned CollapsedNum,
1195 EmptyShell) {
1196 return createEmptyDirective<OMPTaskLoopDirective>(
1197 C, NumClauses, /*HasAssociatedStmt=*/true,
1198 numLoopChildren(CollapsedNum, OMPD_taskloop), CollapsedNum);
1199 }
1200
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1201 OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create(
1202 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1203 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1204 const HelperExprs &Exprs) {
1205 auto *Dir = createDirective<OMPTaskLoopSimdDirective>(
1206 C, Clauses, AssociatedStmt,
1207 numLoopChildren(CollapsedNum, OMPD_taskloop_simd), StartLoc, EndLoc,
1208 CollapsedNum);
1209 Dir->setIterationVariable(Exprs.IterationVarRef);
1210 Dir->setLastIteration(Exprs.LastIteration);
1211 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1212 Dir->setPreCond(Exprs.PreCond);
1213 Dir->setCond(Exprs.Cond);
1214 Dir->setInit(Exprs.Init);
1215 Dir->setInc(Exprs.Inc);
1216 Dir->setIsLastIterVariable(Exprs.IL);
1217 Dir->setLowerBoundVariable(Exprs.LB);
1218 Dir->setUpperBoundVariable(Exprs.UB);
1219 Dir->setStrideVariable(Exprs.ST);
1220 Dir->setEnsureUpperBound(Exprs.EUB);
1221 Dir->setNextLowerBound(Exprs.NLB);
1222 Dir->setNextUpperBound(Exprs.NUB);
1223 Dir->setNumIterations(Exprs.NumIterations);
1224 Dir->setCounters(Exprs.Counters);
1225 Dir->setPrivateCounters(Exprs.PrivateCounters);
1226 Dir->setInits(Exprs.Inits);
1227 Dir->setUpdates(Exprs.Updates);
1228 Dir->setFinals(Exprs.Finals);
1229 Dir->setDependentCounters(Exprs.DependentCounters);
1230 Dir->setDependentInits(Exprs.DependentInits);
1231 Dir->setFinalsConditions(Exprs.FinalsConditions);
1232 Dir->setPreInits(Exprs.PreInits);
1233 return Dir;
1234 }
1235
1236 OMPTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1237 OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1238 unsigned CollapsedNum, EmptyShell) {
1239 return createEmptyDirective<OMPTaskLoopSimdDirective>(
1240 C, NumClauses, /*HasAssociatedStmt=*/true,
1241 numLoopChildren(CollapsedNum, OMPD_taskloop_simd), CollapsedNum);
1242 }
1243
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)1244 OMPMasterTaskLoopDirective *OMPMasterTaskLoopDirective::Create(
1245 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1246 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1247 const HelperExprs &Exprs, bool HasCancel) {
1248 auto *Dir = createDirective<OMPMasterTaskLoopDirective>(
1249 C, Clauses, AssociatedStmt,
1250 numLoopChildren(CollapsedNum, OMPD_master_taskloop), StartLoc, EndLoc,
1251 CollapsedNum);
1252 Dir->setIterationVariable(Exprs.IterationVarRef);
1253 Dir->setLastIteration(Exprs.LastIteration);
1254 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1255 Dir->setPreCond(Exprs.PreCond);
1256 Dir->setCond(Exprs.Cond);
1257 Dir->setInit(Exprs.Init);
1258 Dir->setInc(Exprs.Inc);
1259 Dir->setIsLastIterVariable(Exprs.IL);
1260 Dir->setLowerBoundVariable(Exprs.LB);
1261 Dir->setUpperBoundVariable(Exprs.UB);
1262 Dir->setStrideVariable(Exprs.ST);
1263 Dir->setEnsureUpperBound(Exprs.EUB);
1264 Dir->setNextLowerBound(Exprs.NLB);
1265 Dir->setNextUpperBound(Exprs.NUB);
1266 Dir->setNumIterations(Exprs.NumIterations);
1267 Dir->setCounters(Exprs.Counters);
1268 Dir->setPrivateCounters(Exprs.PrivateCounters);
1269 Dir->setInits(Exprs.Inits);
1270 Dir->setUpdates(Exprs.Updates);
1271 Dir->setFinals(Exprs.Finals);
1272 Dir->setDependentCounters(Exprs.DependentCounters);
1273 Dir->setDependentInits(Exprs.DependentInits);
1274 Dir->setFinalsConditions(Exprs.FinalsConditions);
1275 Dir->setPreInits(Exprs.PreInits);
1276 Dir->setHasCancel(HasCancel);
1277 return Dir;
1278 }
1279
1280 OMPMasterTaskLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1281 OMPMasterTaskLoopDirective::CreateEmpty(const ASTContext &C,
1282 unsigned NumClauses,
1283 unsigned CollapsedNum, EmptyShell) {
1284 return createEmptyDirective<OMPMasterTaskLoopDirective>(
1285 C, NumClauses, /*HasAssociatedStmt=*/true,
1286 numLoopChildren(CollapsedNum, OMPD_master_taskloop), CollapsedNum);
1287 }
1288
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)1289 OMPMaskedTaskLoopDirective *OMPMaskedTaskLoopDirective::Create(
1290 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1291 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1292 const HelperExprs &Exprs, bool HasCancel) {
1293 auto *Dir = createDirective<OMPMaskedTaskLoopDirective>(
1294 C, Clauses, AssociatedStmt,
1295 numLoopChildren(CollapsedNum, OMPD_masked_taskloop), StartLoc, EndLoc,
1296 CollapsedNum);
1297 Dir->setIterationVariable(Exprs.IterationVarRef);
1298 Dir->setLastIteration(Exprs.LastIteration);
1299 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1300 Dir->setPreCond(Exprs.PreCond);
1301 Dir->setCond(Exprs.Cond);
1302 Dir->setInit(Exprs.Init);
1303 Dir->setInc(Exprs.Inc);
1304 Dir->setIsLastIterVariable(Exprs.IL);
1305 Dir->setLowerBoundVariable(Exprs.LB);
1306 Dir->setUpperBoundVariable(Exprs.UB);
1307 Dir->setStrideVariable(Exprs.ST);
1308 Dir->setEnsureUpperBound(Exprs.EUB);
1309 Dir->setNextLowerBound(Exprs.NLB);
1310 Dir->setNextUpperBound(Exprs.NUB);
1311 Dir->setNumIterations(Exprs.NumIterations);
1312 Dir->setCounters(Exprs.Counters);
1313 Dir->setPrivateCounters(Exprs.PrivateCounters);
1314 Dir->setInits(Exprs.Inits);
1315 Dir->setUpdates(Exprs.Updates);
1316 Dir->setFinals(Exprs.Finals);
1317 Dir->setDependentCounters(Exprs.DependentCounters);
1318 Dir->setDependentInits(Exprs.DependentInits);
1319 Dir->setFinalsConditions(Exprs.FinalsConditions);
1320 Dir->setPreInits(Exprs.PreInits);
1321 Dir->setHasCancel(HasCancel);
1322 return Dir;
1323 }
1324
1325 OMPMaskedTaskLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1326 OMPMaskedTaskLoopDirective::CreateEmpty(const ASTContext &C,
1327 unsigned NumClauses,
1328 unsigned CollapsedNum, EmptyShell) {
1329 return createEmptyDirective<OMPMaskedTaskLoopDirective>(
1330 C, NumClauses, /*HasAssociatedStmt=*/true,
1331 numLoopChildren(CollapsedNum, OMPD_masked_taskloop), CollapsedNum);
1332 }
1333
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1334 OMPMasterTaskLoopSimdDirective *OMPMasterTaskLoopSimdDirective::Create(
1335 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1336 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1337 const HelperExprs &Exprs) {
1338 auto *Dir = createDirective<OMPMasterTaskLoopSimdDirective>(
1339 C, Clauses, AssociatedStmt,
1340 numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), StartLoc,
1341 EndLoc, CollapsedNum);
1342 Dir->setIterationVariable(Exprs.IterationVarRef);
1343 Dir->setLastIteration(Exprs.LastIteration);
1344 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1345 Dir->setPreCond(Exprs.PreCond);
1346 Dir->setCond(Exprs.Cond);
1347 Dir->setInit(Exprs.Init);
1348 Dir->setInc(Exprs.Inc);
1349 Dir->setIsLastIterVariable(Exprs.IL);
1350 Dir->setLowerBoundVariable(Exprs.LB);
1351 Dir->setUpperBoundVariable(Exprs.UB);
1352 Dir->setStrideVariable(Exprs.ST);
1353 Dir->setEnsureUpperBound(Exprs.EUB);
1354 Dir->setNextLowerBound(Exprs.NLB);
1355 Dir->setNextUpperBound(Exprs.NUB);
1356 Dir->setNumIterations(Exprs.NumIterations);
1357 Dir->setCounters(Exprs.Counters);
1358 Dir->setPrivateCounters(Exprs.PrivateCounters);
1359 Dir->setInits(Exprs.Inits);
1360 Dir->setUpdates(Exprs.Updates);
1361 Dir->setFinals(Exprs.Finals);
1362 Dir->setDependentCounters(Exprs.DependentCounters);
1363 Dir->setDependentInits(Exprs.DependentInits);
1364 Dir->setFinalsConditions(Exprs.FinalsConditions);
1365 Dir->setPreInits(Exprs.PreInits);
1366 return Dir;
1367 }
1368
1369 OMPMasterTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1370 OMPMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
1371 unsigned NumClauses,
1372 unsigned CollapsedNum, EmptyShell) {
1373 return createEmptyDirective<OMPMasterTaskLoopSimdDirective>(
1374 C, NumClauses, /*HasAssociatedStmt=*/true,
1375 numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), CollapsedNum);
1376 }
1377
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1378 OMPMaskedTaskLoopSimdDirective *OMPMaskedTaskLoopSimdDirective::Create(
1379 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1380 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1381 const HelperExprs &Exprs) {
1382 auto *Dir = createDirective<OMPMaskedTaskLoopSimdDirective>(
1383 C, Clauses, AssociatedStmt,
1384 numLoopChildren(CollapsedNum, OMPD_masked_taskloop_simd), StartLoc,
1385 EndLoc, CollapsedNum);
1386 Dir->setIterationVariable(Exprs.IterationVarRef);
1387 Dir->setLastIteration(Exprs.LastIteration);
1388 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1389 Dir->setPreCond(Exprs.PreCond);
1390 Dir->setCond(Exprs.Cond);
1391 Dir->setInit(Exprs.Init);
1392 Dir->setInc(Exprs.Inc);
1393 Dir->setIsLastIterVariable(Exprs.IL);
1394 Dir->setLowerBoundVariable(Exprs.LB);
1395 Dir->setUpperBoundVariable(Exprs.UB);
1396 Dir->setStrideVariable(Exprs.ST);
1397 Dir->setEnsureUpperBound(Exprs.EUB);
1398 Dir->setNextLowerBound(Exprs.NLB);
1399 Dir->setNextUpperBound(Exprs.NUB);
1400 Dir->setNumIterations(Exprs.NumIterations);
1401 Dir->setCounters(Exprs.Counters);
1402 Dir->setPrivateCounters(Exprs.PrivateCounters);
1403 Dir->setInits(Exprs.Inits);
1404 Dir->setUpdates(Exprs.Updates);
1405 Dir->setFinals(Exprs.Finals);
1406 Dir->setDependentCounters(Exprs.DependentCounters);
1407 Dir->setDependentInits(Exprs.DependentInits);
1408 Dir->setFinalsConditions(Exprs.FinalsConditions);
1409 Dir->setPreInits(Exprs.PreInits);
1410 return Dir;
1411 }
1412
1413 OMPMaskedTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1414 OMPMaskedTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
1415 unsigned NumClauses,
1416 unsigned CollapsedNum, EmptyShell) {
1417 return createEmptyDirective<OMPMaskedTaskLoopSimdDirective>(
1418 C, NumClauses, /*HasAssociatedStmt=*/true,
1419 numLoopChildren(CollapsedNum, OMPD_masked_taskloop_simd), CollapsedNum);
1420 }
1421
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)1422 OMPParallelMasterTaskLoopDirective *OMPParallelMasterTaskLoopDirective::Create(
1423 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1424 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1425 const HelperExprs &Exprs, bool HasCancel) {
1426 auto *Dir = createDirective<OMPParallelMasterTaskLoopDirective>(
1427 C, Clauses, AssociatedStmt,
1428 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop), StartLoc,
1429 EndLoc, CollapsedNum);
1430 Dir->setIterationVariable(Exprs.IterationVarRef);
1431 Dir->setLastIteration(Exprs.LastIteration);
1432 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1433 Dir->setPreCond(Exprs.PreCond);
1434 Dir->setCond(Exprs.Cond);
1435 Dir->setInit(Exprs.Init);
1436 Dir->setInc(Exprs.Inc);
1437 Dir->setIsLastIterVariable(Exprs.IL);
1438 Dir->setLowerBoundVariable(Exprs.LB);
1439 Dir->setUpperBoundVariable(Exprs.UB);
1440 Dir->setStrideVariable(Exprs.ST);
1441 Dir->setEnsureUpperBound(Exprs.EUB);
1442 Dir->setNextLowerBound(Exprs.NLB);
1443 Dir->setNextUpperBound(Exprs.NUB);
1444 Dir->setNumIterations(Exprs.NumIterations);
1445 Dir->setCounters(Exprs.Counters);
1446 Dir->setPrivateCounters(Exprs.PrivateCounters);
1447 Dir->setInits(Exprs.Inits);
1448 Dir->setUpdates(Exprs.Updates);
1449 Dir->setFinals(Exprs.Finals);
1450 Dir->setDependentCounters(Exprs.DependentCounters);
1451 Dir->setDependentInits(Exprs.DependentInits);
1452 Dir->setFinalsConditions(Exprs.FinalsConditions);
1453 Dir->setPreInits(Exprs.PreInits);
1454 Dir->setHasCancel(HasCancel);
1455 return Dir;
1456 }
1457
1458 OMPParallelMasterTaskLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1459 OMPParallelMasterTaskLoopDirective::CreateEmpty(const ASTContext &C,
1460 unsigned NumClauses,
1461 unsigned CollapsedNum,
1462 EmptyShell) {
1463 return createEmptyDirective<OMPParallelMasterTaskLoopDirective>(
1464 C, NumClauses, /*HasAssociatedStmt=*/true,
1465 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop),
1466 CollapsedNum);
1467 }
1468
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)1469 OMPParallelMaskedTaskLoopDirective *OMPParallelMaskedTaskLoopDirective::Create(
1470 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1471 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1472 const HelperExprs &Exprs, bool HasCancel) {
1473 auto *Dir = createDirective<OMPParallelMaskedTaskLoopDirective>(
1474 C, Clauses, AssociatedStmt,
1475 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop), StartLoc,
1476 EndLoc, CollapsedNum);
1477 Dir->setIterationVariable(Exprs.IterationVarRef);
1478 Dir->setLastIteration(Exprs.LastIteration);
1479 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1480 Dir->setPreCond(Exprs.PreCond);
1481 Dir->setCond(Exprs.Cond);
1482 Dir->setInit(Exprs.Init);
1483 Dir->setInc(Exprs.Inc);
1484 Dir->setIsLastIterVariable(Exprs.IL);
1485 Dir->setLowerBoundVariable(Exprs.LB);
1486 Dir->setUpperBoundVariable(Exprs.UB);
1487 Dir->setStrideVariable(Exprs.ST);
1488 Dir->setEnsureUpperBound(Exprs.EUB);
1489 Dir->setNextLowerBound(Exprs.NLB);
1490 Dir->setNextUpperBound(Exprs.NUB);
1491 Dir->setNumIterations(Exprs.NumIterations);
1492 Dir->setCounters(Exprs.Counters);
1493 Dir->setPrivateCounters(Exprs.PrivateCounters);
1494 Dir->setInits(Exprs.Inits);
1495 Dir->setUpdates(Exprs.Updates);
1496 Dir->setFinals(Exprs.Finals);
1497 Dir->setDependentCounters(Exprs.DependentCounters);
1498 Dir->setDependentInits(Exprs.DependentInits);
1499 Dir->setFinalsConditions(Exprs.FinalsConditions);
1500 Dir->setPreInits(Exprs.PreInits);
1501 Dir->setHasCancel(HasCancel);
1502 return Dir;
1503 }
1504
1505 OMPParallelMaskedTaskLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1506 OMPParallelMaskedTaskLoopDirective::CreateEmpty(const ASTContext &C,
1507 unsigned NumClauses,
1508 unsigned CollapsedNum,
1509 EmptyShell) {
1510 return createEmptyDirective<OMPParallelMaskedTaskLoopDirective>(
1511 C, NumClauses, /*HasAssociatedStmt=*/true,
1512 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop),
1513 CollapsedNum);
1514 }
1515
1516 OMPParallelMasterTaskLoopSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1517 OMPParallelMasterTaskLoopSimdDirective::Create(
1518 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1519 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1520 const HelperExprs &Exprs) {
1521 auto *Dir = createDirective<OMPParallelMasterTaskLoopSimdDirective>(
1522 C, Clauses, AssociatedStmt,
1523 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd),
1524 StartLoc, EndLoc, CollapsedNum);
1525 Dir->setIterationVariable(Exprs.IterationVarRef);
1526 Dir->setLastIteration(Exprs.LastIteration);
1527 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1528 Dir->setPreCond(Exprs.PreCond);
1529 Dir->setCond(Exprs.Cond);
1530 Dir->setInit(Exprs.Init);
1531 Dir->setInc(Exprs.Inc);
1532 Dir->setIsLastIterVariable(Exprs.IL);
1533 Dir->setLowerBoundVariable(Exprs.LB);
1534 Dir->setUpperBoundVariable(Exprs.UB);
1535 Dir->setStrideVariable(Exprs.ST);
1536 Dir->setEnsureUpperBound(Exprs.EUB);
1537 Dir->setNextLowerBound(Exprs.NLB);
1538 Dir->setNextUpperBound(Exprs.NUB);
1539 Dir->setNumIterations(Exprs.NumIterations);
1540 Dir->setCounters(Exprs.Counters);
1541 Dir->setPrivateCounters(Exprs.PrivateCounters);
1542 Dir->setInits(Exprs.Inits);
1543 Dir->setUpdates(Exprs.Updates);
1544 Dir->setFinals(Exprs.Finals);
1545 Dir->setDependentCounters(Exprs.DependentCounters);
1546 Dir->setDependentInits(Exprs.DependentInits);
1547 Dir->setFinalsConditions(Exprs.FinalsConditions);
1548 Dir->setPreInits(Exprs.PreInits);
1549 return Dir;
1550 }
1551
1552 OMPParallelMasterTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1553 OMPParallelMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
1554 unsigned NumClauses,
1555 unsigned CollapsedNum,
1556 EmptyShell) {
1557 return createEmptyDirective<OMPParallelMasterTaskLoopSimdDirective>(
1558 C, NumClauses, /*HasAssociatedStmt=*/true,
1559 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd),
1560 CollapsedNum);
1561 }
1562
1563 OMPParallelMaskedTaskLoopSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1564 OMPParallelMaskedTaskLoopSimdDirective::Create(
1565 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1566 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1567 const HelperExprs &Exprs) {
1568 auto *Dir = createDirective<OMPParallelMaskedTaskLoopSimdDirective>(
1569 C, Clauses, AssociatedStmt,
1570 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop_simd),
1571 StartLoc, EndLoc, CollapsedNum);
1572 Dir->setIterationVariable(Exprs.IterationVarRef);
1573 Dir->setLastIteration(Exprs.LastIteration);
1574 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1575 Dir->setPreCond(Exprs.PreCond);
1576 Dir->setCond(Exprs.Cond);
1577 Dir->setInit(Exprs.Init);
1578 Dir->setInc(Exprs.Inc);
1579 Dir->setIsLastIterVariable(Exprs.IL);
1580 Dir->setLowerBoundVariable(Exprs.LB);
1581 Dir->setUpperBoundVariable(Exprs.UB);
1582 Dir->setStrideVariable(Exprs.ST);
1583 Dir->setEnsureUpperBound(Exprs.EUB);
1584 Dir->setNextLowerBound(Exprs.NLB);
1585 Dir->setNextUpperBound(Exprs.NUB);
1586 Dir->setNumIterations(Exprs.NumIterations);
1587 Dir->setCounters(Exprs.Counters);
1588 Dir->setPrivateCounters(Exprs.PrivateCounters);
1589 Dir->setInits(Exprs.Inits);
1590 Dir->setUpdates(Exprs.Updates);
1591 Dir->setFinals(Exprs.Finals);
1592 Dir->setDependentCounters(Exprs.DependentCounters);
1593 Dir->setDependentInits(Exprs.DependentInits);
1594 Dir->setFinalsConditions(Exprs.FinalsConditions);
1595 Dir->setPreInits(Exprs.PreInits);
1596 return Dir;
1597 }
1598
1599 OMPParallelMaskedTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1600 OMPParallelMaskedTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
1601 unsigned NumClauses,
1602 unsigned CollapsedNum,
1603 EmptyShell) {
1604 return createEmptyDirective<OMPParallelMaskedTaskLoopSimdDirective>(
1605 C, NumClauses, /*HasAssociatedStmt=*/true,
1606 numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop_simd),
1607 CollapsedNum);
1608 }
1609
1610 OMPDistributeDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1611 OMPDistributeDirective::Create(const ASTContext &C, SourceLocation StartLoc,
1612 SourceLocation EndLoc, unsigned CollapsedNum,
1613 ArrayRef<OMPClause *> Clauses,
1614 Stmt *AssociatedStmt, const HelperExprs &Exprs) {
1615 auto *Dir = createDirective<OMPDistributeDirective>(
1616 C, Clauses, AssociatedStmt,
1617 numLoopChildren(CollapsedNum, OMPD_distribute), StartLoc, EndLoc,
1618 CollapsedNum);
1619 Dir->setIterationVariable(Exprs.IterationVarRef);
1620 Dir->setLastIteration(Exprs.LastIteration);
1621 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1622 Dir->setPreCond(Exprs.PreCond);
1623 Dir->setCond(Exprs.Cond);
1624 Dir->setInit(Exprs.Init);
1625 Dir->setInc(Exprs.Inc);
1626 Dir->setIsLastIterVariable(Exprs.IL);
1627 Dir->setLowerBoundVariable(Exprs.LB);
1628 Dir->setUpperBoundVariable(Exprs.UB);
1629 Dir->setStrideVariable(Exprs.ST);
1630 Dir->setEnsureUpperBound(Exprs.EUB);
1631 Dir->setNextLowerBound(Exprs.NLB);
1632 Dir->setNextUpperBound(Exprs.NUB);
1633 Dir->setNumIterations(Exprs.NumIterations);
1634 Dir->setCounters(Exprs.Counters);
1635 Dir->setPrivateCounters(Exprs.PrivateCounters);
1636 Dir->setInits(Exprs.Inits);
1637 Dir->setUpdates(Exprs.Updates);
1638 Dir->setFinals(Exprs.Finals);
1639 Dir->setDependentCounters(Exprs.DependentCounters);
1640 Dir->setDependentInits(Exprs.DependentInits);
1641 Dir->setFinalsConditions(Exprs.FinalsConditions);
1642 Dir->setPreInits(Exprs.PreInits);
1643 return Dir;
1644 }
1645
1646 OMPDistributeDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1647 OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1648 unsigned CollapsedNum, EmptyShell) {
1649 return createEmptyDirective<OMPDistributeDirective>(
1650 C, NumClauses, /*HasAssociatedStmt=*/true,
1651 numLoopChildren(CollapsedNum, OMPD_distribute), CollapsedNum);
1652 }
1653
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1654 OMPTargetUpdateDirective *OMPTargetUpdateDirective::Create(
1655 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1656 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1657 return createDirective<OMPTargetUpdateDirective>(C, Clauses, AssociatedStmt,
1658 /*NumChildren=*/0, StartLoc,
1659 EndLoc);
1660 }
1661
1662 OMPTargetUpdateDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1663 OMPTargetUpdateDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1664 EmptyShell) {
1665 return createEmptyDirective<OMPTargetUpdateDirective>(
1666 C, NumClauses, /*HasAssociatedStmt=*/true);
1667 }
1668
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)1669 OMPDistributeParallelForDirective *OMPDistributeParallelForDirective::Create(
1670 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1671 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1672 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
1673 auto *Dir = createDirective<OMPDistributeParallelForDirective>(
1674 C, Clauses, AssociatedStmt,
1675 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1, StartLoc,
1676 EndLoc, CollapsedNum);
1677 Dir->setIterationVariable(Exprs.IterationVarRef);
1678 Dir->setLastIteration(Exprs.LastIteration);
1679 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1680 Dir->setPreCond(Exprs.PreCond);
1681 Dir->setCond(Exprs.Cond);
1682 Dir->setInit(Exprs.Init);
1683 Dir->setInc(Exprs.Inc);
1684 Dir->setIsLastIterVariable(Exprs.IL);
1685 Dir->setLowerBoundVariable(Exprs.LB);
1686 Dir->setUpperBoundVariable(Exprs.UB);
1687 Dir->setStrideVariable(Exprs.ST);
1688 Dir->setEnsureUpperBound(Exprs.EUB);
1689 Dir->setNextLowerBound(Exprs.NLB);
1690 Dir->setNextUpperBound(Exprs.NUB);
1691 Dir->setNumIterations(Exprs.NumIterations);
1692 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1693 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1694 Dir->setDistInc(Exprs.DistInc);
1695 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1696 Dir->setCounters(Exprs.Counters);
1697 Dir->setPrivateCounters(Exprs.PrivateCounters);
1698 Dir->setInits(Exprs.Inits);
1699 Dir->setUpdates(Exprs.Updates);
1700 Dir->setFinals(Exprs.Finals);
1701 Dir->setDependentCounters(Exprs.DependentCounters);
1702 Dir->setDependentInits(Exprs.DependentInits);
1703 Dir->setFinalsConditions(Exprs.FinalsConditions);
1704 Dir->setPreInits(Exprs.PreInits);
1705 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1706 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1707 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1708 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1709 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1710 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1711 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1712 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1713 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1714 Dir->setTaskReductionRefExpr(TaskRedRef);
1715 Dir->HasCancel = HasCancel;
1716 return Dir;
1717 }
1718
1719 OMPDistributeParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1720 OMPDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
1721 unsigned NumClauses,
1722 unsigned CollapsedNum,
1723 EmptyShell) {
1724 return createEmptyDirective<OMPDistributeParallelForDirective>(
1725 C, NumClauses, /*HasAssociatedStmt=*/true,
1726 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1,
1727 CollapsedNum);
1728 }
1729
1730 OMPDistributeParallelForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1731 OMPDistributeParallelForSimdDirective::Create(
1732 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1733 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1734 const HelperExprs &Exprs) {
1735 auto *Dir = createDirective<OMPDistributeParallelForSimdDirective>(
1736 C, Clauses, AssociatedStmt,
1737 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd),
1738 StartLoc, EndLoc, CollapsedNum);
1739 Dir->setIterationVariable(Exprs.IterationVarRef);
1740 Dir->setLastIteration(Exprs.LastIteration);
1741 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1742 Dir->setPreCond(Exprs.PreCond);
1743 Dir->setCond(Exprs.Cond);
1744 Dir->setInit(Exprs.Init);
1745 Dir->setInc(Exprs.Inc);
1746 Dir->setIsLastIterVariable(Exprs.IL);
1747 Dir->setLowerBoundVariable(Exprs.LB);
1748 Dir->setUpperBoundVariable(Exprs.UB);
1749 Dir->setStrideVariable(Exprs.ST);
1750 Dir->setEnsureUpperBound(Exprs.EUB);
1751 Dir->setNextLowerBound(Exprs.NLB);
1752 Dir->setNextUpperBound(Exprs.NUB);
1753 Dir->setNumIterations(Exprs.NumIterations);
1754 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1755 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1756 Dir->setDistInc(Exprs.DistInc);
1757 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1758 Dir->setCounters(Exprs.Counters);
1759 Dir->setPrivateCounters(Exprs.PrivateCounters);
1760 Dir->setInits(Exprs.Inits);
1761 Dir->setUpdates(Exprs.Updates);
1762 Dir->setFinals(Exprs.Finals);
1763 Dir->setDependentCounters(Exprs.DependentCounters);
1764 Dir->setDependentInits(Exprs.DependentInits);
1765 Dir->setFinalsConditions(Exprs.FinalsConditions);
1766 Dir->setPreInits(Exprs.PreInits);
1767 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1768 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1769 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1770 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1771 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1772 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1773 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1774 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1775 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1776 return Dir;
1777 }
1778
1779 OMPDistributeParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1780 OMPDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1781 unsigned NumClauses,
1782 unsigned CollapsedNum,
1783 EmptyShell) {
1784 return createEmptyDirective<OMPDistributeParallelForSimdDirective>(
1785 C, NumClauses, /*HasAssociatedStmt=*/true,
1786 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd),
1787 CollapsedNum);
1788 }
1789
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1790 OMPDistributeSimdDirective *OMPDistributeSimdDirective::Create(
1791 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1792 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1793 const HelperExprs &Exprs) {
1794 auto *Dir = createDirective<OMPDistributeSimdDirective>(
1795 C, Clauses, AssociatedStmt,
1796 numLoopChildren(CollapsedNum, OMPD_distribute_simd), StartLoc, EndLoc,
1797 CollapsedNum);
1798 Dir->setIterationVariable(Exprs.IterationVarRef);
1799 Dir->setLastIteration(Exprs.LastIteration);
1800 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1801 Dir->setPreCond(Exprs.PreCond);
1802 Dir->setCond(Exprs.Cond);
1803 Dir->setInit(Exprs.Init);
1804 Dir->setInc(Exprs.Inc);
1805 Dir->setIsLastIterVariable(Exprs.IL);
1806 Dir->setLowerBoundVariable(Exprs.LB);
1807 Dir->setUpperBoundVariable(Exprs.UB);
1808 Dir->setStrideVariable(Exprs.ST);
1809 Dir->setEnsureUpperBound(Exprs.EUB);
1810 Dir->setNextLowerBound(Exprs.NLB);
1811 Dir->setNextUpperBound(Exprs.NUB);
1812 Dir->setNumIterations(Exprs.NumIterations);
1813 Dir->setCounters(Exprs.Counters);
1814 Dir->setPrivateCounters(Exprs.PrivateCounters);
1815 Dir->setInits(Exprs.Inits);
1816 Dir->setUpdates(Exprs.Updates);
1817 Dir->setFinals(Exprs.Finals);
1818 Dir->setDependentCounters(Exprs.DependentCounters);
1819 Dir->setDependentInits(Exprs.DependentInits);
1820 Dir->setFinalsConditions(Exprs.FinalsConditions);
1821 Dir->setPreInits(Exprs.PreInits);
1822 return Dir;
1823 }
1824
1825 OMPDistributeSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1826 OMPDistributeSimdDirective::CreateEmpty(const ASTContext &C,
1827 unsigned NumClauses,
1828 unsigned CollapsedNum, EmptyShell) {
1829 return createEmptyDirective<OMPDistributeSimdDirective>(
1830 C, NumClauses, /*HasAssociatedStmt=*/true,
1831 numLoopChildren(CollapsedNum, OMPD_distribute_simd), CollapsedNum);
1832 }
1833
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1834 OMPTargetParallelForSimdDirective *OMPTargetParallelForSimdDirective::Create(
1835 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1836 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1837 const HelperExprs &Exprs) {
1838 auto *Dir = createDirective<OMPTargetParallelForSimdDirective>(
1839 C, Clauses, AssociatedStmt,
1840 numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd), StartLoc,
1841 EndLoc, CollapsedNum);
1842 Dir->setIterationVariable(Exprs.IterationVarRef);
1843 Dir->setLastIteration(Exprs.LastIteration);
1844 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1845 Dir->setPreCond(Exprs.PreCond);
1846 Dir->setCond(Exprs.Cond);
1847 Dir->setInit(Exprs.Init);
1848 Dir->setInc(Exprs.Inc);
1849 Dir->setIsLastIterVariable(Exprs.IL);
1850 Dir->setLowerBoundVariable(Exprs.LB);
1851 Dir->setUpperBoundVariable(Exprs.UB);
1852 Dir->setStrideVariable(Exprs.ST);
1853 Dir->setEnsureUpperBound(Exprs.EUB);
1854 Dir->setNextLowerBound(Exprs.NLB);
1855 Dir->setNextUpperBound(Exprs.NUB);
1856 Dir->setNumIterations(Exprs.NumIterations);
1857 Dir->setCounters(Exprs.Counters);
1858 Dir->setPrivateCounters(Exprs.PrivateCounters);
1859 Dir->setInits(Exprs.Inits);
1860 Dir->setUpdates(Exprs.Updates);
1861 Dir->setFinals(Exprs.Finals);
1862 Dir->setDependentCounters(Exprs.DependentCounters);
1863 Dir->setDependentInits(Exprs.DependentInits);
1864 Dir->setFinalsConditions(Exprs.FinalsConditions);
1865 Dir->setPreInits(Exprs.PreInits);
1866 return Dir;
1867 }
1868
1869 OMPTargetParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1870 OMPTargetParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1871 unsigned NumClauses,
1872 unsigned CollapsedNum,
1873 EmptyShell) {
1874 return createEmptyDirective<OMPTargetParallelForSimdDirective>(
1875 C, NumClauses, /*HasAssociatedStmt=*/true,
1876 numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd),
1877 CollapsedNum);
1878 }
1879
1880 OMPTargetSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1881 OMPTargetSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
1882 SourceLocation EndLoc, unsigned CollapsedNum,
1883 ArrayRef<OMPClause *> Clauses,
1884 Stmt *AssociatedStmt, const HelperExprs &Exprs) {
1885 auto *Dir = createDirective<OMPTargetSimdDirective>(
1886 C, Clauses, AssociatedStmt,
1887 numLoopChildren(CollapsedNum, OMPD_target_simd), StartLoc, EndLoc,
1888 CollapsedNum);
1889 Dir->setIterationVariable(Exprs.IterationVarRef);
1890 Dir->setLastIteration(Exprs.LastIteration);
1891 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1892 Dir->setPreCond(Exprs.PreCond);
1893 Dir->setCond(Exprs.Cond);
1894 Dir->setInit(Exprs.Init);
1895 Dir->setInc(Exprs.Inc);
1896 Dir->setCounters(Exprs.Counters);
1897 Dir->setPrivateCounters(Exprs.PrivateCounters);
1898 Dir->setInits(Exprs.Inits);
1899 Dir->setUpdates(Exprs.Updates);
1900 Dir->setFinals(Exprs.Finals);
1901 Dir->setDependentCounters(Exprs.DependentCounters);
1902 Dir->setDependentInits(Exprs.DependentInits);
1903 Dir->setFinalsConditions(Exprs.FinalsConditions);
1904 Dir->setPreInits(Exprs.PreInits);
1905 return Dir;
1906 }
1907
1908 OMPTargetSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1909 OMPTargetSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1910 unsigned CollapsedNum, EmptyShell) {
1911 return createEmptyDirective<OMPTargetSimdDirective>(
1912 C, NumClauses, /*HasAssociatedStmt=*/true,
1913 numLoopChildren(CollapsedNum, OMPD_target_simd), CollapsedNum);
1914 }
1915
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1916 OMPTeamsDistributeDirective *OMPTeamsDistributeDirective::Create(
1917 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1918 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1919 const HelperExprs &Exprs) {
1920 auto *Dir = createDirective<OMPTeamsDistributeDirective>(
1921 C, Clauses, AssociatedStmt,
1922 numLoopChildren(CollapsedNum, OMPD_teams_distribute), StartLoc, EndLoc,
1923 CollapsedNum);
1924 Dir->setIterationVariable(Exprs.IterationVarRef);
1925 Dir->setLastIteration(Exprs.LastIteration);
1926 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1927 Dir->setPreCond(Exprs.PreCond);
1928 Dir->setCond(Exprs.Cond);
1929 Dir->setInit(Exprs.Init);
1930 Dir->setInc(Exprs.Inc);
1931 Dir->setIsLastIterVariable(Exprs.IL);
1932 Dir->setLowerBoundVariable(Exprs.LB);
1933 Dir->setUpperBoundVariable(Exprs.UB);
1934 Dir->setStrideVariable(Exprs.ST);
1935 Dir->setEnsureUpperBound(Exprs.EUB);
1936 Dir->setNextLowerBound(Exprs.NLB);
1937 Dir->setNextUpperBound(Exprs.NUB);
1938 Dir->setNumIterations(Exprs.NumIterations);
1939 Dir->setCounters(Exprs.Counters);
1940 Dir->setPrivateCounters(Exprs.PrivateCounters);
1941 Dir->setInits(Exprs.Inits);
1942 Dir->setUpdates(Exprs.Updates);
1943 Dir->setFinals(Exprs.Finals);
1944 Dir->setDependentCounters(Exprs.DependentCounters);
1945 Dir->setDependentInits(Exprs.DependentInits);
1946 Dir->setFinalsConditions(Exprs.FinalsConditions);
1947 Dir->setPreInits(Exprs.PreInits);
1948 return Dir;
1949 }
1950
1951 OMPTeamsDistributeDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1952 OMPTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
1953 unsigned NumClauses,
1954 unsigned CollapsedNum, EmptyShell) {
1955 return createEmptyDirective<OMPTeamsDistributeDirective>(
1956 C, NumClauses, /*HasAssociatedStmt=*/true,
1957 numLoopChildren(CollapsedNum, OMPD_teams_distribute), CollapsedNum);
1958 }
1959
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1960 OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::Create(
1961 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1962 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1963 const HelperExprs &Exprs) {
1964 auto *Dir = createDirective<OMPTeamsDistributeSimdDirective>(
1965 C, Clauses, AssociatedStmt,
1966 numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), StartLoc,
1967 EndLoc, CollapsedNum);
1968 Dir->setIterationVariable(Exprs.IterationVarRef);
1969 Dir->setLastIteration(Exprs.LastIteration);
1970 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1971 Dir->setPreCond(Exprs.PreCond);
1972 Dir->setCond(Exprs.Cond);
1973 Dir->setInit(Exprs.Init);
1974 Dir->setInc(Exprs.Inc);
1975 Dir->setIsLastIterVariable(Exprs.IL);
1976 Dir->setLowerBoundVariable(Exprs.LB);
1977 Dir->setUpperBoundVariable(Exprs.UB);
1978 Dir->setStrideVariable(Exprs.ST);
1979 Dir->setEnsureUpperBound(Exprs.EUB);
1980 Dir->setNextLowerBound(Exprs.NLB);
1981 Dir->setNextUpperBound(Exprs.NUB);
1982 Dir->setNumIterations(Exprs.NumIterations);
1983 Dir->setCounters(Exprs.Counters);
1984 Dir->setPrivateCounters(Exprs.PrivateCounters);
1985 Dir->setInits(Exprs.Inits);
1986 Dir->setUpdates(Exprs.Updates);
1987 Dir->setFinals(Exprs.Finals);
1988 Dir->setDependentCounters(Exprs.DependentCounters);
1989 Dir->setDependentInits(Exprs.DependentInits);
1990 Dir->setFinalsConditions(Exprs.FinalsConditions);
1991 Dir->setPreInits(Exprs.PreInits);
1992 return Dir;
1993 }
1994
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1995 OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::CreateEmpty(
1996 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
1997 EmptyShell) {
1998 return createEmptyDirective<OMPTeamsDistributeSimdDirective>(
1999 C, NumClauses, /*HasAssociatedStmt=*/true,
2000 numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), CollapsedNum);
2001 }
2002
2003 OMPTeamsDistributeParallelForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2004 OMPTeamsDistributeParallelForSimdDirective::Create(
2005 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2006 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2007 const HelperExprs &Exprs) {
2008 auto *Dir = createDirective<OMPTeamsDistributeParallelForSimdDirective>(
2009 C, Clauses, AssociatedStmt,
2010 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd),
2011 StartLoc, EndLoc, CollapsedNum);
2012 Dir->setIterationVariable(Exprs.IterationVarRef);
2013 Dir->setLastIteration(Exprs.LastIteration);
2014 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2015 Dir->setPreCond(Exprs.PreCond);
2016 Dir->setCond(Exprs.Cond);
2017 Dir->setInit(Exprs.Init);
2018 Dir->setInc(Exprs.Inc);
2019 Dir->setIsLastIterVariable(Exprs.IL);
2020 Dir->setLowerBoundVariable(Exprs.LB);
2021 Dir->setUpperBoundVariable(Exprs.UB);
2022 Dir->setStrideVariable(Exprs.ST);
2023 Dir->setEnsureUpperBound(Exprs.EUB);
2024 Dir->setNextLowerBound(Exprs.NLB);
2025 Dir->setNextUpperBound(Exprs.NUB);
2026 Dir->setNumIterations(Exprs.NumIterations);
2027 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
2028 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
2029 Dir->setDistInc(Exprs.DistInc);
2030 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
2031 Dir->setCounters(Exprs.Counters);
2032 Dir->setPrivateCounters(Exprs.PrivateCounters);
2033 Dir->setInits(Exprs.Inits);
2034 Dir->setUpdates(Exprs.Updates);
2035 Dir->setFinals(Exprs.Finals);
2036 Dir->setDependentCounters(Exprs.DependentCounters);
2037 Dir->setDependentInits(Exprs.DependentInits);
2038 Dir->setFinalsConditions(Exprs.FinalsConditions);
2039 Dir->setPreInits(Exprs.PreInits);
2040 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
2041 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
2042 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
2043 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
2044 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
2045 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
2046 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
2047 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
2048 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
2049 return Dir;
2050 }
2051
2052 OMPTeamsDistributeParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2053 OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
2054 unsigned NumClauses,
2055 unsigned CollapsedNum,
2056 EmptyShell) {
2057 return createEmptyDirective<OMPTeamsDistributeParallelForSimdDirective>(
2058 C, NumClauses, /*HasAssociatedStmt=*/true,
2059 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd),
2060 CollapsedNum);
2061 }
2062
2063 OMPTeamsDistributeParallelForDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)2064 OMPTeamsDistributeParallelForDirective::Create(
2065 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2066 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2067 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
2068 auto *Dir = createDirective<OMPTeamsDistributeParallelForDirective>(
2069 C, Clauses, AssociatedStmt,
2070 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1,
2071 StartLoc, EndLoc, CollapsedNum);
2072 Dir->setIterationVariable(Exprs.IterationVarRef);
2073 Dir->setLastIteration(Exprs.LastIteration);
2074 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2075 Dir->setPreCond(Exprs.PreCond);
2076 Dir->setCond(Exprs.Cond);
2077 Dir->setInit(Exprs.Init);
2078 Dir->setInc(Exprs.Inc);
2079 Dir->setIsLastIterVariable(Exprs.IL);
2080 Dir->setLowerBoundVariable(Exprs.LB);
2081 Dir->setUpperBoundVariable(Exprs.UB);
2082 Dir->setStrideVariable(Exprs.ST);
2083 Dir->setEnsureUpperBound(Exprs.EUB);
2084 Dir->setNextLowerBound(Exprs.NLB);
2085 Dir->setNextUpperBound(Exprs.NUB);
2086 Dir->setNumIterations(Exprs.NumIterations);
2087 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
2088 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
2089 Dir->setDistInc(Exprs.DistInc);
2090 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
2091 Dir->setCounters(Exprs.Counters);
2092 Dir->setPrivateCounters(Exprs.PrivateCounters);
2093 Dir->setInits(Exprs.Inits);
2094 Dir->setUpdates(Exprs.Updates);
2095 Dir->setFinals(Exprs.Finals);
2096 Dir->setDependentCounters(Exprs.DependentCounters);
2097 Dir->setDependentInits(Exprs.DependentInits);
2098 Dir->setFinalsConditions(Exprs.FinalsConditions);
2099 Dir->setPreInits(Exprs.PreInits);
2100 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
2101 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
2102 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
2103 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
2104 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
2105 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
2106 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
2107 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
2108 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
2109 Dir->setTaskReductionRefExpr(TaskRedRef);
2110 Dir->HasCancel = HasCancel;
2111 return Dir;
2112 }
2113
2114 OMPTeamsDistributeParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2115 OMPTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
2116 unsigned NumClauses,
2117 unsigned CollapsedNum,
2118 EmptyShell) {
2119 return createEmptyDirective<OMPTeamsDistributeParallelForDirective>(
2120 C, NumClauses, /*HasAssociatedStmt=*/true,
2121 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1,
2122 CollapsedNum);
2123 }
2124
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)2125 OMPTargetTeamsDirective *OMPTargetTeamsDirective::Create(
2126 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2127 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
2128 return createDirective<OMPTargetTeamsDirective>(C, Clauses, AssociatedStmt,
2129 /*NumChildren=*/0, StartLoc,
2130 EndLoc);
2131 }
2132
2133 OMPTargetTeamsDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)2134 OMPTargetTeamsDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
2135 EmptyShell) {
2136 return createEmptyDirective<OMPTargetTeamsDirective>(
2137 C, NumClauses, /*HasAssociatedStmt=*/true);
2138 }
2139
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2140 OMPTargetTeamsDistributeDirective *OMPTargetTeamsDistributeDirective::Create(
2141 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2142 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2143 const HelperExprs &Exprs) {
2144 auto *Dir = createDirective<OMPTargetTeamsDistributeDirective>(
2145 C, Clauses, AssociatedStmt,
2146 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute), StartLoc,
2147 EndLoc, CollapsedNum);
2148 Dir->setIterationVariable(Exprs.IterationVarRef);
2149 Dir->setLastIteration(Exprs.LastIteration);
2150 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2151 Dir->setPreCond(Exprs.PreCond);
2152 Dir->setCond(Exprs.Cond);
2153 Dir->setInit(Exprs.Init);
2154 Dir->setInc(Exprs.Inc);
2155 Dir->setIsLastIterVariable(Exprs.IL);
2156 Dir->setLowerBoundVariable(Exprs.LB);
2157 Dir->setUpperBoundVariable(Exprs.UB);
2158 Dir->setStrideVariable(Exprs.ST);
2159 Dir->setEnsureUpperBound(Exprs.EUB);
2160 Dir->setNextLowerBound(Exprs.NLB);
2161 Dir->setNextUpperBound(Exprs.NUB);
2162 Dir->setNumIterations(Exprs.NumIterations);
2163 Dir->setCounters(Exprs.Counters);
2164 Dir->setPrivateCounters(Exprs.PrivateCounters);
2165 Dir->setInits(Exprs.Inits);
2166 Dir->setUpdates(Exprs.Updates);
2167 Dir->setFinals(Exprs.Finals);
2168 Dir->setDependentCounters(Exprs.DependentCounters);
2169 Dir->setDependentInits(Exprs.DependentInits);
2170 Dir->setFinalsConditions(Exprs.FinalsConditions);
2171 Dir->setPreInits(Exprs.PreInits);
2172 return Dir;
2173 }
2174
2175 OMPTargetTeamsDistributeDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2176 OMPTargetTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
2177 unsigned NumClauses,
2178 unsigned CollapsedNum,
2179 EmptyShell) {
2180 return createEmptyDirective<OMPTargetTeamsDistributeDirective>(
2181 C, NumClauses, /*HasAssociatedStmt=*/true,
2182 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute),
2183 CollapsedNum);
2184 }
2185
2186 OMPTargetTeamsDistributeParallelForDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)2187 OMPTargetTeamsDistributeParallelForDirective::Create(
2188 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2189 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2190 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
2191 auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForDirective>(
2192 C, Clauses, AssociatedStmt,
2193 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) +
2194 1,
2195 StartLoc, EndLoc, CollapsedNum);
2196 Dir->setIterationVariable(Exprs.IterationVarRef);
2197 Dir->setLastIteration(Exprs.LastIteration);
2198 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2199 Dir->setPreCond(Exprs.PreCond);
2200 Dir->setCond(Exprs.Cond);
2201 Dir->setInit(Exprs.Init);
2202 Dir->setInc(Exprs.Inc);
2203 Dir->setIsLastIterVariable(Exprs.IL);
2204 Dir->setLowerBoundVariable(Exprs.LB);
2205 Dir->setUpperBoundVariable(Exprs.UB);
2206 Dir->setStrideVariable(Exprs.ST);
2207 Dir->setEnsureUpperBound(Exprs.EUB);
2208 Dir->setNextLowerBound(Exprs.NLB);
2209 Dir->setNextUpperBound(Exprs.NUB);
2210 Dir->setNumIterations(Exprs.NumIterations);
2211 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
2212 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
2213 Dir->setDistInc(Exprs.DistInc);
2214 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
2215 Dir->setCounters(Exprs.Counters);
2216 Dir->setPrivateCounters(Exprs.PrivateCounters);
2217 Dir->setInits(Exprs.Inits);
2218 Dir->setUpdates(Exprs.Updates);
2219 Dir->setFinals(Exprs.Finals);
2220 Dir->setDependentCounters(Exprs.DependentCounters);
2221 Dir->setDependentInits(Exprs.DependentInits);
2222 Dir->setFinalsConditions(Exprs.FinalsConditions);
2223 Dir->setPreInits(Exprs.PreInits);
2224 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
2225 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
2226 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
2227 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
2228 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
2229 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
2230 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
2231 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
2232 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
2233 Dir->setTaskReductionRefExpr(TaskRedRef);
2234 Dir->HasCancel = HasCancel;
2235 return Dir;
2236 }
2237
2238 OMPTargetTeamsDistributeParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2239 OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
2240 unsigned NumClauses,
2241 unsigned CollapsedNum,
2242 EmptyShell) {
2243 return createEmptyDirective<OMPTargetTeamsDistributeParallelForDirective>(
2244 C, NumClauses, /*HasAssociatedStmt=*/true,
2245 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) +
2246 1,
2247 CollapsedNum);
2248 }
2249
2250 OMPTargetTeamsDistributeParallelForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2251 OMPTargetTeamsDistributeParallelForSimdDirective::Create(
2252 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2253 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2254 const HelperExprs &Exprs) {
2255 auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForSimdDirective>(
2256 C, Clauses, AssociatedStmt,
2257 numLoopChildren(CollapsedNum,
2258 OMPD_target_teams_distribute_parallel_for_simd),
2259 StartLoc, EndLoc, CollapsedNum);
2260 Dir->setIterationVariable(Exprs.IterationVarRef);
2261 Dir->setLastIteration(Exprs.LastIteration);
2262 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2263 Dir->setPreCond(Exprs.PreCond);
2264 Dir->setCond(Exprs.Cond);
2265 Dir->setInit(Exprs.Init);
2266 Dir->setInc(Exprs.Inc);
2267 Dir->setIsLastIterVariable(Exprs.IL);
2268 Dir->setLowerBoundVariable(Exprs.LB);
2269 Dir->setUpperBoundVariable(Exprs.UB);
2270 Dir->setStrideVariable(Exprs.ST);
2271 Dir->setEnsureUpperBound(Exprs.EUB);
2272 Dir->setNextLowerBound(Exprs.NLB);
2273 Dir->setNextUpperBound(Exprs.NUB);
2274 Dir->setNumIterations(Exprs.NumIterations);
2275 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
2276 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
2277 Dir->setDistInc(Exprs.DistInc);
2278 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
2279 Dir->setCounters(Exprs.Counters);
2280 Dir->setPrivateCounters(Exprs.PrivateCounters);
2281 Dir->setInits(Exprs.Inits);
2282 Dir->setUpdates(Exprs.Updates);
2283 Dir->setFinals(Exprs.Finals);
2284 Dir->setDependentCounters(Exprs.DependentCounters);
2285 Dir->setDependentInits(Exprs.DependentInits);
2286 Dir->setFinalsConditions(Exprs.FinalsConditions);
2287 Dir->setPreInits(Exprs.PreInits);
2288 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
2289 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
2290 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
2291 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
2292 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
2293 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
2294 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
2295 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
2296 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
2297 return Dir;
2298 }
2299
2300 OMPTargetTeamsDistributeParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2301 OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty(
2302 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
2303 EmptyShell) {
2304 return createEmptyDirective<OMPTargetTeamsDistributeParallelForSimdDirective>(
2305 C, NumClauses, /*HasAssociatedStmt=*/true,
2306 numLoopChildren(CollapsedNum,
2307 OMPD_target_teams_distribute_parallel_for_simd),
2308 CollapsedNum);
2309 }
2310
2311 OMPTargetTeamsDistributeSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2312 OMPTargetTeamsDistributeSimdDirective::Create(
2313 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2314 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2315 const HelperExprs &Exprs) {
2316 auto *Dir = createDirective<OMPTargetTeamsDistributeSimdDirective>(
2317 C, Clauses, AssociatedStmt,
2318 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd),
2319 StartLoc, EndLoc, CollapsedNum);
2320 Dir->setIterationVariable(Exprs.IterationVarRef);
2321 Dir->setLastIteration(Exprs.LastIteration);
2322 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2323 Dir->setPreCond(Exprs.PreCond);
2324 Dir->setCond(Exprs.Cond);
2325 Dir->setInit(Exprs.Init);
2326 Dir->setInc(Exprs.Inc);
2327 Dir->setIsLastIterVariable(Exprs.IL);
2328 Dir->setLowerBoundVariable(Exprs.LB);
2329 Dir->setUpperBoundVariable(Exprs.UB);
2330 Dir->setStrideVariable(Exprs.ST);
2331 Dir->setEnsureUpperBound(Exprs.EUB);
2332 Dir->setNextLowerBound(Exprs.NLB);
2333 Dir->setNextUpperBound(Exprs.NUB);
2334 Dir->setNumIterations(Exprs.NumIterations);
2335 Dir->setCounters(Exprs.Counters);
2336 Dir->setPrivateCounters(Exprs.PrivateCounters);
2337 Dir->setInits(Exprs.Inits);
2338 Dir->setUpdates(Exprs.Updates);
2339 Dir->setFinals(Exprs.Finals);
2340 Dir->setDependentCounters(Exprs.DependentCounters);
2341 Dir->setDependentInits(Exprs.DependentInits);
2342 Dir->setFinalsConditions(Exprs.FinalsConditions);
2343 Dir->setPreInits(Exprs.PreInits);
2344 return Dir;
2345 }
2346
2347 OMPTargetTeamsDistributeSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2348 OMPTargetTeamsDistributeSimdDirective::CreateEmpty(const ASTContext &C,
2349 unsigned NumClauses,
2350 unsigned CollapsedNum,
2351 EmptyShell) {
2352 return createEmptyDirective<OMPTargetTeamsDistributeSimdDirective>(
2353 C, NumClauses, /*HasAssociatedStmt=*/true,
2354 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd),
2355 CollapsedNum);
2356 }
2357
2358 OMPInteropDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)2359 OMPInteropDirective::Create(const ASTContext &C, SourceLocation StartLoc,
2360 SourceLocation EndLoc,
2361 ArrayRef<OMPClause *> Clauses) {
2362 return createDirective<OMPInteropDirective>(
2363 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
2364 EndLoc);
2365 }
2366
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)2367 OMPInteropDirective *OMPInteropDirective::CreateEmpty(const ASTContext &C,
2368 unsigned NumClauses,
2369 EmptyShell) {
2370 return createEmptyDirective<OMPInteropDirective>(C, NumClauses);
2371 }
2372
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,SourceLocation TargetCallLoc)2373 OMPDispatchDirective *OMPDispatchDirective::Create(
2374 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2375 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2376 SourceLocation TargetCallLoc) {
2377 auto *Dir = createDirective<OMPDispatchDirective>(
2378 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
2379 Dir->setTargetCallLoc(TargetCallLoc);
2380 return Dir;
2381 }
2382
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)2383 OMPDispatchDirective *OMPDispatchDirective::CreateEmpty(const ASTContext &C,
2384 unsigned NumClauses,
2385 EmptyShell) {
2386 return createEmptyDirective<OMPDispatchDirective>(C, NumClauses,
2387 /*HasAssociatedStmt=*/true,
2388 /*NumChildren=*/0);
2389 }
2390
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)2391 OMPMaskedDirective *OMPMaskedDirective::Create(const ASTContext &C,
2392 SourceLocation StartLoc,
2393 SourceLocation EndLoc,
2394 ArrayRef<OMPClause *> Clauses,
2395 Stmt *AssociatedStmt) {
2396 return createDirective<OMPMaskedDirective>(C, Clauses, AssociatedStmt,
2397 /*NumChildren=*/0, StartLoc,
2398 EndLoc);
2399 }
2400
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)2401 OMPMaskedDirective *OMPMaskedDirective::CreateEmpty(const ASTContext &C,
2402 unsigned NumClauses,
2403 EmptyShell) {
2404 return createEmptyDirective<OMPMaskedDirective>(C, NumClauses,
2405 /*HasAssociatedStmt=*/true);
2406 }
2407
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2408 OMPGenericLoopDirective *OMPGenericLoopDirective::Create(
2409 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2410 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2411 const HelperExprs &Exprs) {
2412 auto *Dir = createDirective<OMPGenericLoopDirective>(
2413 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_loop),
2414 StartLoc, EndLoc, CollapsedNum);
2415 Dir->setIterationVariable(Exprs.IterationVarRef);
2416 Dir->setLastIteration(Exprs.LastIteration);
2417 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2418 Dir->setPreCond(Exprs.PreCond);
2419 Dir->setCond(Exprs.Cond);
2420 Dir->setInit(Exprs.Init);
2421 Dir->setInc(Exprs.Inc);
2422 Dir->setIsLastIterVariable(Exprs.IL);
2423 Dir->setLowerBoundVariable(Exprs.LB);
2424 Dir->setUpperBoundVariable(Exprs.UB);
2425 Dir->setStrideVariable(Exprs.ST);
2426 Dir->setEnsureUpperBound(Exprs.EUB);
2427 Dir->setNextLowerBound(Exprs.NLB);
2428 Dir->setNextUpperBound(Exprs.NUB);
2429 Dir->setNumIterations(Exprs.NumIterations);
2430 Dir->setCounters(Exprs.Counters);
2431 Dir->setPrivateCounters(Exprs.PrivateCounters);
2432 Dir->setInits(Exprs.Inits);
2433 Dir->setUpdates(Exprs.Updates);
2434 Dir->setFinals(Exprs.Finals);
2435 Dir->setDependentCounters(Exprs.DependentCounters);
2436 Dir->setDependentInits(Exprs.DependentInits);
2437 Dir->setFinalsConditions(Exprs.FinalsConditions);
2438 Dir->setPreInits(Exprs.PreInits);
2439 return Dir;
2440 }
2441
2442 OMPGenericLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2443 OMPGenericLoopDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
2444 unsigned CollapsedNum, EmptyShell) {
2445 return createEmptyDirective<OMPGenericLoopDirective>(
2446 C, NumClauses, /*HasAssociatedStmt=*/true,
2447 numLoopChildren(CollapsedNum, OMPD_loop), CollapsedNum);
2448 }
2449
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2450 OMPTeamsGenericLoopDirective *OMPTeamsGenericLoopDirective::Create(
2451 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2452 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2453 const HelperExprs &Exprs) {
2454 auto *Dir = createDirective<OMPTeamsGenericLoopDirective>(
2455 C, Clauses, AssociatedStmt,
2456 numLoopChildren(CollapsedNum, OMPD_teams_loop), StartLoc, EndLoc,
2457 CollapsedNum);
2458 Dir->setIterationVariable(Exprs.IterationVarRef);
2459 Dir->setLastIteration(Exprs.LastIteration);
2460 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2461 Dir->setPreCond(Exprs.PreCond);
2462 Dir->setCond(Exprs.Cond);
2463 Dir->setInit(Exprs.Init);
2464 Dir->setInc(Exprs.Inc);
2465 Dir->setIsLastIterVariable(Exprs.IL);
2466 Dir->setLowerBoundVariable(Exprs.LB);
2467 Dir->setUpperBoundVariable(Exprs.UB);
2468 Dir->setStrideVariable(Exprs.ST);
2469 Dir->setEnsureUpperBound(Exprs.EUB);
2470 Dir->setNextLowerBound(Exprs.NLB);
2471 Dir->setNextUpperBound(Exprs.NUB);
2472 Dir->setNumIterations(Exprs.NumIterations);
2473 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
2474 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
2475 Dir->setDistInc(Exprs.DistInc);
2476 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
2477 Dir->setCounters(Exprs.Counters);
2478 Dir->setPrivateCounters(Exprs.PrivateCounters);
2479 Dir->setInits(Exprs.Inits);
2480 Dir->setUpdates(Exprs.Updates);
2481 Dir->setFinals(Exprs.Finals);
2482 Dir->setDependentCounters(Exprs.DependentCounters);
2483 Dir->setDependentInits(Exprs.DependentInits);
2484 Dir->setFinalsConditions(Exprs.FinalsConditions);
2485 Dir->setPreInits(Exprs.PreInits);
2486 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
2487 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
2488 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
2489 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
2490 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
2491 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
2492 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
2493 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
2494 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
2495 return Dir;
2496 }
2497
2498 OMPTeamsGenericLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2499 OMPTeamsGenericLoopDirective::CreateEmpty(const ASTContext &C,
2500 unsigned NumClauses,
2501 unsigned CollapsedNum, EmptyShell) {
2502 return createEmptyDirective<OMPTeamsGenericLoopDirective>(
2503 C, NumClauses, /*HasAssociatedStmt=*/true,
2504 numLoopChildren(CollapsedNum, OMPD_teams_loop), CollapsedNum);
2505 }
2506
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool CanBeParallelFor)2507 OMPTargetTeamsGenericLoopDirective *OMPTargetTeamsGenericLoopDirective::Create(
2508 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2509 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2510 const HelperExprs &Exprs, bool CanBeParallelFor) {
2511 auto *Dir = createDirective<OMPTargetTeamsGenericLoopDirective>(
2512 C, Clauses, AssociatedStmt,
2513 numLoopChildren(CollapsedNum, OMPD_target_teams_loop), StartLoc, EndLoc,
2514 CollapsedNum);
2515 Dir->setIterationVariable(Exprs.IterationVarRef);
2516 Dir->setLastIteration(Exprs.LastIteration);
2517 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2518 Dir->setPreCond(Exprs.PreCond);
2519 Dir->setCond(Exprs.Cond);
2520 Dir->setInit(Exprs.Init);
2521 Dir->setInc(Exprs.Inc);
2522 Dir->setIsLastIterVariable(Exprs.IL);
2523 Dir->setLowerBoundVariable(Exprs.LB);
2524 Dir->setUpperBoundVariable(Exprs.UB);
2525 Dir->setStrideVariable(Exprs.ST);
2526 Dir->setEnsureUpperBound(Exprs.EUB);
2527 Dir->setNextLowerBound(Exprs.NLB);
2528 Dir->setNextUpperBound(Exprs.NUB);
2529 Dir->setNumIterations(Exprs.NumIterations);
2530 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
2531 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
2532 Dir->setDistInc(Exprs.DistInc);
2533 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
2534 Dir->setCounters(Exprs.Counters);
2535 Dir->setPrivateCounters(Exprs.PrivateCounters);
2536 Dir->setInits(Exprs.Inits);
2537 Dir->setUpdates(Exprs.Updates);
2538 Dir->setFinals(Exprs.Finals);
2539 Dir->setDependentCounters(Exprs.DependentCounters);
2540 Dir->setDependentInits(Exprs.DependentInits);
2541 Dir->setFinalsConditions(Exprs.FinalsConditions);
2542 Dir->setPreInits(Exprs.PreInits);
2543 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
2544 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
2545 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
2546 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
2547 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
2548 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
2549 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
2550 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
2551 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
2552 Dir->setCanBeParallelFor(CanBeParallelFor);
2553 return Dir;
2554 }
2555
2556 OMPTargetTeamsGenericLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2557 OMPTargetTeamsGenericLoopDirective::CreateEmpty(const ASTContext &C,
2558 unsigned NumClauses,
2559 unsigned CollapsedNum,
2560 EmptyShell) {
2561 return createEmptyDirective<OMPTargetTeamsGenericLoopDirective>(
2562 C, NumClauses, /*HasAssociatedStmt=*/true,
2563 numLoopChildren(CollapsedNum, OMPD_target_teams_loop), CollapsedNum);
2564 }
2565
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2566 OMPParallelGenericLoopDirective *OMPParallelGenericLoopDirective::Create(
2567 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2568 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2569 const HelperExprs &Exprs) {
2570 auto *Dir = createDirective<OMPParallelGenericLoopDirective>(
2571 C, Clauses, AssociatedStmt,
2572 numLoopChildren(CollapsedNum, OMPD_parallel_loop), StartLoc, EndLoc,
2573 CollapsedNum);
2574 Dir->setIterationVariable(Exprs.IterationVarRef);
2575 Dir->setLastIteration(Exprs.LastIteration);
2576 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2577 Dir->setPreCond(Exprs.PreCond);
2578 Dir->setCond(Exprs.Cond);
2579 Dir->setInit(Exprs.Init);
2580 Dir->setInc(Exprs.Inc);
2581 Dir->setIsLastIterVariable(Exprs.IL);
2582 Dir->setLowerBoundVariable(Exprs.LB);
2583 Dir->setUpperBoundVariable(Exprs.UB);
2584 Dir->setStrideVariable(Exprs.ST);
2585 Dir->setEnsureUpperBound(Exprs.EUB);
2586 Dir->setNextLowerBound(Exprs.NLB);
2587 Dir->setNextUpperBound(Exprs.NUB);
2588 Dir->setNumIterations(Exprs.NumIterations);
2589 Dir->setCounters(Exprs.Counters);
2590 Dir->setPrivateCounters(Exprs.PrivateCounters);
2591 Dir->setInits(Exprs.Inits);
2592 Dir->setUpdates(Exprs.Updates);
2593 Dir->setFinals(Exprs.Finals);
2594 Dir->setDependentCounters(Exprs.DependentCounters);
2595 Dir->setDependentInits(Exprs.DependentInits);
2596 Dir->setFinalsConditions(Exprs.FinalsConditions);
2597 Dir->setPreInits(Exprs.PreInits);
2598 return Dir;
2599 }
2600
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2601 OMPParallelGenericLoopDirective *OMPParallelGenericLoopDirective::CreateEmpty(
2602 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
2603 EmptyShell) {
2604 return createEmptyDirective<OMPParallelGenericLoopDirective>(
2605 C, NumClauses, /*HasAssociatedStmt=*/true,
2606 numLoopChildren(CollapsedNum, OMPD_parallel_loop), CollapsedNum);
2607 }
2608
2609 OMPTargetParallelGenericLoopDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)2610 OMPTargetParallelGenericLoopDirective::Create(
2611 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
2612 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
2613 const HelperExprs &Exprs) {
2614 auto *Dir = createDirective<OMPTargetParallelGenericLoopDirective>(
2615 C, Clauses, AssociatedStmt,
2616 numLoopChildren(CollapsedNum, OMPD_target_parallel_loop), StartLoc,
2617 EndLoc, CollapsedNum);
2618 Dir->setIterationVariable(Exprs.IterationVarRef);
2619 Dir->setLastIteration(Exprs.LastIteration);
2620 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
2621 Dir->setPreCond(Exprs.PreCond);
2622 Dir->setCond(Exprs.Cond);
2623 Dir->setInit(Exprs.Init);
2624 Dir->setInc(Exprs.Inc);
2625 Dir->setIsLastIterVariable(Exprs.IL);
2626 Dir->setLowerBoundVariable(Exprs.LB);
2627 Dir->setUpperBoundVariable(Exprs.UB);
2628 Dir->setStrideVariable(Exprs.ST);
2629 Dir->setEnsureUpperBound(Exprs.EUB);
2630 Dir->setNextLowerBound(Exprs.NLB);
2631 Dir->setNextUpperBound(Exprs.NUB);
2632 Dir->setNumIterations(Exprs.NumIterations);
2633 Dir->setCounters(Exprs.Counters);
2634 Dir->setPrivateCounters(Exprs.PrivateCounters);
2635 Dir->setInits(Exprs.Inits);
2636 Dir->setUpdates(Exprs.Updates);
2637 Dir->setFinals(Exprs.Finals);
2638 Dir->setDependentCounters(Exprs.DependentCounters);
2639 Dir->setDependentInits(Exprs.DependentInits);
2640 Dir->setFinalsConditions(Exprs.FinalsConditions);
2641 Dir->setPreInits(Exprs.PreInits);
2642 return Dir;
2643 }
2644
2645 OMPTargetParallelGenericLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)2646 OMPTargetParallelGenericLoopDirective::CreateEmpty(const ASTContext &C,
2647 unsigned NumClauses,
2648 unsigned CollapsedNum,
2649 EmptyShell) {
2650 return createEmptyDirective<OMPTargetParallelGenericLoopDirective>(
2651 C, NumClauses, /*HasAssociatedStmt=*/true,
2652 numLoopChildren(CollapsedNum, OMPD_target_parallel_loop), CollapsedNum);
2653 }
2654