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 subclesses 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 llvm::makeMutableArrayRef(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)125 bool OMPLoopBasedDirective::doForAllLoops(
126 Stmt *CurStmt, bool TryImperfectlyNestedLoops, unsigned NumLoops,
127 llvm::function_ref<bool(unsigned, Stmt *)> Callback) {
128 CurStmt = CurStmt->IgnoreContainers();
129 for (unsigned Cnt = 0; Cnt < NumLoops; ++Cnt) {
130 if (auto *Dir = dyn_cast<OMPTileDirective>(CurStmt))
131 CurStmt = Dir->getTransformedStmt();
132 if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(CurStmt))
133 CurStmt = CanonLoop->getLoopStmt();
134 if (Callback(Cnt, CurStmt))
135 return false;
136 // Move on to the next nested for loop, or to the loop body.
137 // OpenMP [2.8.1, simd construct, Restrictions]
138 // All loops associated with the construct must be perfectly nested; that
139 // is, there must be no intervening code nor any OpenMP directive between
140 // any two loops.
141 if (auto *For = dyn_cast<ForStmt>(CurStmt)) {
142 CurStmt = For->getBody();
143 } else {
144 assert(isa<CXXForRangeStmt>(CurStmt) &&
145 "Expected canonical for or range-based for loops.");
146 CurStmt = cast<CXXForRangeStmt>(CurStmt)->getBody();
147 }
148 CurStmt = OMPLoopBasedDirective::tryToFindNextInnerLoop(
149 CurStmt, TryImperfectlyNestedLoops);
150 }
151 return true;
152 }
153
doForAllLoopsBodies(Stmt * CurStmt,bool TryImperfectlyNestedLoops,unsigned NumLoops,llvm::function_ref<void (unsigned,Stmt *,Stmt *)> Callback)154 void OMPLoopBasedDirective::doForAllLoopsBodies(
155 Stmt *CurStmt, bool TryImperfectlyNestedLoops, unsigned NumLoops,
156 llvm::function_ref<void(unsigned, Stmt *, Stmt *)> Callback) {
157 bool Res = OMPLoopBasedDirective::doForAllLoops(
158 CurStmt, TryImperfectlyNestedLoops, NumLoops,
159 [Callback](unsigned Cnt, Stmt *Loop) {
160 Stmt *Body = nullptr;
161 if (auto *For = dyn_cast<ForStmt>(Loop)) {
162 Body = For->getBody();
163 } else {
164 assert(isa<CXXForRangeStmt>(Loop) &&
165 "Expected canonical for or range-based for loops.");
166 Body = cast<CXXForRangeStmt>(Loop)->getBody();
167 }
168 if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(Body))
169 Body = CanonLoop->getLoopStmt();
170 Callback(Cnt, Loop, Body);
171 return false;
172 });
173 assert(Res && "Expected only loops");
174 (void)Res;
175 }
176
getBody()177 Stmt *OMPLoopDirective::getBody() {
178 // This relies on the loop form is already checked by Sema.
179 Stmt *Body = nullptr;
180 OMPLoopBasedDirective::doForAllLoopsBodies(
181 Data->getRawStmt(), /*TryImperfectlyNestedLoops=*/true,
182 NumAssociatedLoops,
183 [&Body](unsigned, Stmt *, Stmt *BodyStmt) { Body = BodyStmt; });
184 return Body;
185 }
186
setCounters(ArrayRef<Expr * > A)187 void OMPLoopDirective::setCounters(ArrayRef<Expr *> A) {
188 assert(A.size() == getLoopsNumber() &&
189 "Number of loop counters is not the same as the collapsed number");
190 llvm::copy(A, getCounters().begin());
191 }
192
setPrivateCounters(ArrayRef<Expr * > A)193 void OMPLoopDirective::setPrivateCounters(ArrayRef<Expr *> A) {
194 assert(A.size() == getLoopsNumber() && "Number of loop private counters "
195 "is not the same as the collapsed "
196 "number");
197 llvm::copy(A, getPrivateCounters().begin());
198 }
199
setInits(ArrayRef<Expr * > A)200 void OMPLoopDirective::setInits(ArrayRef<Expr *> A) {
201 assert(A.size() == getLoopsNumber() &&
202 "Number of counter inits is not the same as the collapsed number");
203 llvm::copy(A, getInits().begin());
204 }
205
setUpdates(ArrayRef<Expr * > A)206 void OMPLoopDirective::setUpdates(ArrayRef<Expr *> A) {
207 assert(A.size() == getLoopsNumber() &&
208 "Number of counter updates is not the same as the collapsed number");
209 llvm::copy(A, getUpdates().begin());
210 }
211
setFinals(ArrayRef<Expr * > A)212 void OMPLoopDirective::setFinals(ArrayRef<Expr *> A) {
213 assert(A.size() == getLoopsNumber() &&
214 "Number of counter finals is not the same as the collapsed number");
215 llvm::copy(A, getFinals().begin());
216 }
217
setDependentCounters(ArrayRef<Expr * > A)218 void OMPLoopDirective::setDependentCounters(ArrayRef<Expr *> A) {
219 assert(
220 A.size() == getLoopsNumber() &&
221 "Number of dependent counters is not the same as the collapsed number");
222 llvm::copy(A, getDependentCounters().begin());
223 }
224
setDependentInits(ArrayRef<Expr * > A)225 void OMPLoopDirective::setDependentInits(ArrayRef<Expr *> A) {
226 assert(A.size() == getLoopsNumber() &&
227 "Number of dependent inits is not the same as the collapsed number");
228 llvm::copy(A, getDependentInits().begin());
229 }
230
setFinalsConditions(ArrayRef<Expr * > A)231 void OMPLoopDirective::setFinalsConditions(ArrayRef<Expr *> A) {
232 assert(A.size() == getLoopsNumber() &&
233 "Number of finals conditions is not the same as the collapsed number");
234 llvm::copy(A, getFinalsConditions().begin());
235 }
236
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)237 OMPParallelDirective *OMPParallelDirective::Create(
238 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
239 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
240 bool HasCancel) {
241 auto *Dir = createDirective<OMPParallelDirective>(
242 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
243 Dir->setTaskReductionRefExpr(TaskRedRef);
244 Dir->setHasCancel(HasCancel);
245 return Dir;
246 }
247
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)248 OMPParallelDirective *OMPParallelDirective::CreateEmpty(const ASTContext &C,
249 unsigned NumClauses,
250 EmptyShell) {
251 return createEmptyDirective<OMPParallelDirective>(C, NumClauses,
252 /*HasAssociatedStmt=*/true,
253 /*NumChildren=*/1);
254 }
255
256 OMPSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)257 OMPSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
258 SourceLocation EndLoc, unsigned CollapsedNum,
259 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
260 const HelperExprs &Exprs) {
261 auto *Dir = createDirective<OMPSimdDirective>(
262 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_simd),
263 StartLoc, EndLoc, CollapsedNum);
264 Dir->setIterationVariable(Exprs.IterationVarRef);
265 Dir->setLastIteration(Exprs.LastIteration);
266 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
267 Dir->setPreCond(Exprs.PreCond);
268 Dir->setCond(Exprs.Cond);
269 Dir->setInit(Exprs.Init);
270 Dir->setInc(Exprs.Inc);
271 Dir->setCounters(Exprs.Counters);
272 Dir->setPrivateCounters(Exprs.PrivateCounters);
273 Dir->setInits(Exprs.Inits);
274 Dir->setUpdates(Exprs.Updates);
275 Dir->setFinals(Exprs.Finals);
276 Dir->setDependentCounters(Exprs.DependentCounters);
277 Dir->setDependentInits(Exprs.DependentInits);
278 Dir->setFinalsConditions(Exprs.FinalsConditions);
279 Dir->setPreInits(Exprs.PreInits);
280 return Dir;
281 }
282
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)283 OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C,
284 unsigned NumClauses,
285 unsigned CollapsedNum,
286 EmptyShell) {
287 return createEmptyDirective<OMPSimdDirective>(
288 C, NumClauses, /*HasAssociatedStmt=*/true,
289 numLoopChildren(CollapsedNum, OMPD_simd), CollapsedNum);
290 }
291
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)292 OMPForDirective *OMPForDirective::Create(
293 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
294 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
295 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
296 auto *Dir = createDirective<OMPForDirective>(
297 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_for) + 1,
298 StartLoc, EndLoc, CollapsedNum);
299 Dir->setIterationVariable(Exprs.IterationVarRef);
300 Dir->setLastIteration(Exprs.LastIteration);
301 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
302 Dir->setPreCond(Exprs.PreCond);
303 Dir->setCond(Exprs.Cond);
304 Dir->setInit(Exprs.Init);
305 Dir->setInc(Exprs.Inc);
306 Dir->setIsLastIterVariable(Exprs.IL);
307 Dir->setLowerBoundVariable(Exprs.LB);
308 Dir->setUpperBoundVariable(Exprs.UB);
309 Dir->setStrideVariable(Exprs.ST);
310 Dir->setEnsureUpperBound(Exprs.EUB);
311 Dir->setNextLowerBound(Exprs.NLB);
312 Dir->setNextUpperBound(Exprs.NUB);
313 Dir->setNumIterations(Exprs.NumIterations);
314 Dir->setCounters(Exprs.Counters);
315 Dir->setPrivateCounters(Exprs.PrivateCounters);
316 Dir->setInits(Exprs.Inits);
317 Dir->setUpdates(Exprs.Updates);
318 Dir->setFinals(Exprs.Finals);
319 Dir->setDependentCounters(Exprs.DependentCounters);
320 Dir->setDependentInits(Exprs.DependentInits);
321 Dir->setFinalsConditions(Exprs.FinalsConditions);
322 Dir->setPreInits(Exprs.PreInits);
323 Dir->setTaskReductionRefExpr(TaskRedRef);
324 Dir->setHasCancel(HasCancel);
325 return Dir;
326 }
327
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)328 OMPForDirective *OMPForDirective::CreateEmpty(const ASTContext &C,
329 unsigned NumClauses,
330 unsigned CollapsedNum,
331 EmptyShell) {
332 return createEmptyDirective<OMPForDirective>(
333 C, NumClauses, /*HasAssociatedStmt=*/true,
334 numLoopChildren(CollapsedNum, OMPD_for) + 1, CollapsedNum);
335 }
336
337 OMPTileDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,unsigned NumLoops,Stmt * AssociatedStmt,Stmt * TransformedStmt,Stmt * PreInits)338 OMPTileDirective::Create(const ASTContext &C, SourceLocation StartLoc,
339 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
340 unsigned NumLoops, Stmt *AssociatedStmt,
341 Stmt *TransformedStmt, Stmt *PreInits) {
342 OMPTileDirective *Dir = createDirective<OMPTileDirective>(
343 C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc,
344 NumLoops);
345 Dir->setTransformedStmt(TransformedStmt);
346 Dir->setPreInits(PreInits);
347 return Dir;
348 }
349
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned NumLoops)350 OMPTileDirective *OMPTileDirective::CreateEmpty(const ASTContext &C,
351 unsigned NumClauses,
352 unsigned NumLoops) {
353 return createEmptyDirective<OMPTileDirective>(
354 C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
355 SourceLocation(), SourceLocation(), NumLoops);
356 }
357
358 OMPForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)359 OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
360 SourceLocation EndLoc, unsigned CollapsedNum,
361 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
362 const HelperExprs &Exprs) {
363 auto *Dir = createDirective<OMPForSimdDirective>(
364 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_for_simd),
365 StartLoc, EndLoc, CollapsedNum);
366 Dir->setIterationVariable(Exprs.IterationVarRef);
367 Dir->setLastIteration(Exprs.LastIteration);
368 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
369 Dir->setPreCond(Exprs.PreCond);
370 Dir->setCond(Exprs.Cond);
371 Dir->setInit(Exprs.Init);
372 Dir->setInc(Exprs.Inc);
373 Dir->setIsLastIterVariable(Exprs.IL);
374 Dir->setLowerBoundVariable(Exprs.LB);
375 Dir->setUpperBoundVariable(Exprs.UB);
376 Dir->setStrideVariable(Exprs.ST);
377 Dir->setEnsureUpperBound(Exprs.EUB);
378 Dir->setNextLowerBound(Exprs.NLB);
379 Dir->setNextUpperBound(Exprs.NUB);
380 Dir->setNumIterations(Exprs.NumIterations);
381 Dir->setCounters(Exprs.Counters);
382 Dir->setPrivateCounters(Exprs.PrivateCounters);
383 Dir->setInits(Exprs.Inits);
384 Dir->setUpdates(Exprs.Updates);
385 Dir->setFinals(Exprs.Finals);
386 Dir->setDependentCounters(Exprs.DependentCounters);
387 Dir->setDependentInits(Exprs.DependentInits);
388 Dir->setFinalsConditions(Exprs.FinalsConditions);
389 Dir->setPreInits(Exprs.PreInits);
390 return Dir;
391 }
392
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)393 OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C,
394 unsigned NumClauses,
395 unsigned CollapsedNum,
396 EmptyShell) {
397 return createEmptyDirective<OMPForSimdDirective>(
398 C, NumClauses, /*HasAssociatedStmt=*/true,
399 numLoopChildren(CollapsedNum, OMPD_for_simd), CollapsedNum);
400 }
401
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)402 OMPSectionsDirective *OMPSectionsDirective::Create(
403 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
404 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
405 bool HasCancel) {
406 auto *Dir = createDirective<OMPSectionsDirective>(C, Clauses, AssociatedStmt,
407 /*NumChildren=*/1, StartLoc,
408 EndLoc);
409 Dir->setTaskReductionRefExpr(TaskRedRef);
410 Dir->setHasCancel(HasCancel);
411 return Dir;
412 }
413
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)414 OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C,
415 unsigned NumClauses,
416 EmptyShell) {
417 return createEmptyDirective<OMPSectionsDirective>(C, NumClauses,
418 /*HasAssociatedStmt=*/true,
419 /*NumChildren=*/1);
420 }
421
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,Stmt * AssociatedStmt,bool HasCancel)422 OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C,
423 SourceLocation StartLoc,
424 SourceLocation EndLoc,
425 Stmt *AssociatedStmt,
426 bool HasCancel) {
427 auto *Dir =
428 createDirective<OMPSectionDirective>(C, llvm::None, AssociatedStmt,
429 /*NumChildre=*/0, StartLoc, EndLoc);
430 Dir->setHasCancel(HasCancel);
431 return Dir;
432 }
433
CreateEmpty(const ASTContext & C,EmptyShell)434 OMPSectionDirective *OMPSectionDirective::CreateEmpty(const ASTContext &C,
435 EmptyShell) {
436 return createEmptyDirective<OMPSectionDirective>(C, /*NumClauses=*/0,
437 /*HasAssociatedStmt=*/true);
438 }
439
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)440 OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C,
441 SourceLocation StartLoc,
442 SourceLocation EndLoc,
443 ArrayRef<OMPClause *> Clauses,
444 Stmt *AssociatedStmt) {
445 return createDirective<OMPSingleDirective>(C, Clauses, AssociatedStmt,
446 /*NumChildren=*/0, StartLoc,
447 EndLoc);
448 }
449
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)450 OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C,
451 unsigned NumClauses,
452 EmptyShell) {
453 return createEmptyDirective<OMPSingleDirective>(C, NumClauses,
454 /*HasAssociatedStmt=*/true);
455 }
456
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,Stmt * AssociatedStmt)457 OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C,
458 SourceLocation StartLoc,
459 SourceLocation EndLoc,
460 Stmt *AssociatedStmt) {
461 return createDirective<OMPMasterDirective>(C, llvm::None, AssociatedStmt,
462 /*NumChildren=*/0, StartLoc,
463 EndLoc);
464 }
465
CreateEmpty(const ASTContext & C,EmptyShell)466 OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C,
467 EmptyShell) {
468 return createEmptyDirective<OMPMasterDirective>(C, /*NumClauses=*/0,
469 /*HasAssociatedStmt=*/true);
470 }
471
Create(const ASTContext & C,const DeclarationNameInfo & Name,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)472 OMPCriticalDirective *OMPCriticalDirective::Create(
473 const ASTContext &C, const DeclarationNameInfo &Name,
474 SourceLocation StartLoc, SourceLocation EndLoc,
475 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
476 return createDirective<OMPCriticalDirective>(C, Clauses, AssociatedStmt,
477 /*NumChildren=*/0, Name,
478 StartLoc, EndLoc);
479 }
480
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)481 OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C,
482 unsigned NumClauses,
483 EmptyShell) {
484 return createEmptyDirective<OMPCriticalDirective>(C, NumClauses,
485 /*HasAssociatedStmt=*/true);
486 }
487
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)488 OMPParallelForDirective *OMPParallelForDirective::Create(
489 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
490 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
491 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
492 auto *Dir = createDirective<OMPParallelForDirective>(
493 C, Clauses, AssociatedStmt,
494 numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, StartLoc, EndLoc,
495 CollapsedNum);
496 Dir->setIterationVariable(Exprs.IterationVarRef);
497 Dir->setLastIteration(Exprs.LastIteration);
498 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
499 Dir->setPreCond(Exprs.PreCond);
500 Dir->setCond(Exprs.Cond);
501 Dir->setInit(Exprs.Init);
502 Dir->setInc(Exprs.Inc);
503 Dir->setIsLastIterVariable(Exprs.IL);
504 Dir->setLowerBoundVariable(Exprs.LB);
505 Dir->setUpperBoundVariable(Exprs.UB);
506 Dir->setStrideVariable(Exprs.ST);
507 Dir->setEnsureUpperBound(Exprs.EUB);
508 Dir->setNextLowerBound(Exprs.NLB);
509 Dir->setNextUpperBound(Exprs.NUB);
510 Dir->setNumIterations(Exprs.NumIterations);
511 Dir->setCounters(Exprs.Counters);
512 Dir->setPrivateCounters(Exprs.PrivateCounters);
513 Dir->setInits(Exprs.Inits);
514 Dir->setUpdates(Exprs.Updates);
515 Dir->setFinals(Exprs.Finals);
516 Dir->setDependentCounters(Exprs.DependentCounters);
517 Dir->setDependentInits(Exprs.DependentInits);
518 Dir->setFinalsConditions(Exprs.FinalsConditions);
519 Dir->setPreInits(Exprs.PreInits);
520 Dir->setTaskReductionRefExpr(TaskRedRef);
521 Dir->setHasCancel(HasCancel);
522 return Dir;
523 }
524
525 OMPParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)526 OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
527 unsigned CollapsedNum, EmptyShell) {
528 return createEmptyDirective<OMPParallelForDirective>(
529 C, NumClauses, /*HasAssociatedStmt=*/true,
530 numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, CollapsedNum);
531 }
532
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)533 OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create(
534 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
535 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
536 const HelperExprs &Exprs) {
537 auto *Dir = createDirective<OMPParallelForSimdDirective>(
538 C, Clauses, AssociatedStmt,
539 numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), StartLoc, EndLoc,
540 CollapsedNum);
541 Dir->setIterationVariable(Exprs.IterationVarRef);
542 Dir->setLastIteration(Exprs.LastIteration);
543 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
544 Dir->setPreCond(Exprs.PreCond);
545 Dir->setCond(Exprs.Cond);
546 Dir->setInit(Exprs.Init);
547 Dir->setInc(Exprs.Inc);
548 Dir->setIsLastIterVariable(Exprs.IL);
549 Dir->setLowerBoundVariable(Exprs.LB);
550 Dir->setUpperBoundVariable(Exprs.UB);
551 Dir->setStrideVariable(Exprs.ST);
552 Dir->setEnsureUpperBound(Exprs.EUB);
553 Dir->setNextLowerBound(Exprs.NLB);
554 Dir->setNextUpperBound(Exprs.NUB);
555 Dir->setNumIterations(Exprs.NumIterations);
556 Dir->setCounters(Exprs.Counters);
557 Dir->setPrivateCounters(Exprs.PrivateCounters);
558 Dir->setInits(Exprs.Inits);
559 Dir->setUpdates(Exprs.Updates);
560 Dir->setFinals(Exprs.Finals);
561 Dir->setDependentCounters(Exprs.DependentCounters);
562 Dir->setDependentInits(Exprs.DependentInits);
563 Dir->setFinalsConditions(Exprs.FinalsConditions);
564 Dir->setPreInits(Exprs.PreInits);
565 return Dir;
566 }
567
568 OMPParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)569 OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C,
570 unsigned NumClauses,
571 unsigned CollapsedNum, EmptyShell) {
572 return createEmptyDirective<OMPParallelForSimdDirective>(
573 C, NumClauses, /*HasAssociatedStmt=*/true,
574 numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), CollapsedNum);
575 }
576
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef)577 OMPParallelMasterDirective *OMPParallelMasterDirective::Create(
578 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
579 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef) {
580 auto *Dir = createDirective<OMPParallelMasterDirective>(
581 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
582 Dir->setTaskReductionRefExpr(TaskRedRef);
583 return Dir;
584 }
585
586 OMPParallelMasterDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)587 OMPParallelMasterDirective::CreateEmpty(const ASTContext &C,
588 unsigned NumClauses, EmptyShell) {
589 return createEmptyDirective<OMPParallelMasterDirective>(
590 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
591 }
592
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)593 OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
594 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
595 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
596 bool HasCancel) {
597 auto *Dir = createDirective<OMPParallelSectionsDirective>(
598 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
599 Dir->setTaskReductionRefExpr(TaskRedRef);
600 Dir->setHasCancel(HasCancel);
601 return Dir;
602 }
603
604 OMPParallelSectionsDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)605 OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C,
606 unsigned NumClauses, EmptyShell) {
607 return createEmptyDirective<OMPParallelSectionsDirective>(
608 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
609 }
610
611 OMPTaskDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,bool HasCancel)612 OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
613 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
614 Stmt *AssociatedStmt, bool HasCancel) {
615 auto *Dir = createDirective<OMPTaskDirective>(
616 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
617 Dir->setHasCancel(HasCancel);
618 return Dir;
619 }
620
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)621 OMPTaskDirective *OMPTaskDirective::CreateEmpty(const ASTContext &C,
622 unsigned NumClauses,
623 EmptyShell) {
624 return createEmptyDirective<OMPTaskDirective>(C, NumClauses,
625 /*HasAssociatedStmt=*/true);
626 }
627
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc)628 OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C,
629 SourceLocation StartLoc,
630 SourceLocation EndLoc) {
631 return new (C) OMPTaskyieldDirective(StartLoc, EndLoc);
632 }
633
CreateEmpty(const ASTContext & C,EmptyShell)634 OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C,
635 EmptyShell) {
636 return new (C) OMPTaskyieldDirective();
637 }
638
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc)639 OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C,
640 SourceLocation StartLoc,
641 SourceLocation EndLoc) {
642 return new (C) OMPBarrierDirective(StartLoc, EndLoc);
643 }
644
CreateEmpty(const ASTContext & C,EmptyShell)645 OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C,
646 EmptyShell) {
647 return new (C) OMPBarrierDirective();
648 }
649
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc)650 OMPTaskwaitDirective *OMPTaskwaitDirective::Create(const ASTContext &C,
651 SourceLocation StartLoc,
652 SourceLocation EndLoc) {
653 return new (C) OMPTaskwaitDirective(StartLoc, EndLoc);
654 }
655
CreateEmpty(const ASTContext & C,EmptyShell)656 OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C,
657 EmptyShell) {
658 return new (C) OMPTaskwaitDirective();
659 }
660
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * ReductionRef)661 OMPTaskgroupDirective *OMPTaskgroupDirective::Create(
662 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
663 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *ReductionRef) {
664 auto *Dir = createDirective<OMPTaskgroupDirective>(
665 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
666 Dir->setReductionRef(ReductionRef);
667 return Dir;
668 }
669
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)670 OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C,
671 unsigned NumClauses,
672 EmptyShell) {
673 return createEmptyDirective<OMPTaskgroupDirective>(
674 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
675 }
676
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,OpenMPDirectiveKind CancelRegion)677 OMPCancellationPointDirective *OMPCancellationPointDirective::Create(
678 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
679 OpenMPDirectiveKind CancelRegion) {
680 auto *Dir = new (C) OMPCancellationPointDirective(StartLoc, EndLoc);
681 Dir->setCancelRegion(CancelRegion);
682 return Dir;
683 }
684
685 OMPCancellationPointDirective *
CreateEmpty(const ASTContext & C,EmptyShell)686 OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) {
687 return new (C) OMPCancellationPointDirective();
688 }
689
690 OMPCancelDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,OpenMPDirectiveKind CancelRegion)691 OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc,
692 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
693 OpenMPDirectiveKind CancelRegion) {
694 auto *Dir = createDirective<OMPCancelDirective>(
695 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
696 EndLoc);
697 Dir->setCancelRegion(CancelRegion);
698 return Dir;
699 }
700
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)701 OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C,
702 unsigned NumClauses,
703 EmptyShell) {
704 return createEmptyDirective<OMPCancelDirective>(C, NumClauses);
705 }
706
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)707 OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C,
708 SourceLocation StartLoc,
709 SourceLocation EndLoc,
710 ArrayRef<OMPClause *> Clauses) {
711 return createDirective<OMPFlushDirective>(
712 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
713 EndLoc);
714 }
715
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)716 OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C,
717 unsigned NumClauses,
718 EmptyShell) {
719 return createEmptyDirective<OMPFlushDirective>(C, NumClauses);
720 }
721
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)722 OMPDepobjDirective *OMPDepobjDirective::Create(const ASTContext &C,
723 SourceLocation StartLoc,
724 SourceLocation EndLoc,
725 ArrayRef<OMPClause *> Clauses) {
726 return createDirective<OMPDepobjDirective>(
727 C, Clauses, /*AssociatedStmt=*/nullptr,
728 /*NumChildren=*/0, StartLoc, EndLoc);
729 }
730
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)731 OMPDepobjDirective *OMPDepobjDirective::CreateEmpty(const ASTContext &C,
732 unsigned NumClauses,
733 EmptyShell) {
734 return createEmptyDirective<OMPDepobjDirective>(C, NumClauses);
735 }
736
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)737 OMPScanDirective *OMPScanDirective::Create(const ASTContext &C,
738 SourceLocation StartLoc,
739 SourceLocation EndLoc,
740 ArrayRef<OMPClause *> Clauses) {
741 return createDirective<OMPScanDirective>(C, Clauses,
742 /*AssociatedStmt=*/nullptr,
743 /*NumChildren=*/0, StartLoc, EndLoc);
744 }
745
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)746 OMPScanDirective *OMPScanDirective::CreateEmpty(const ASTContext &C,
747 unsigned NumClauses,
748 EmptyShell) {
749 return createEmptyDirective<OMPScanDirective>(C, NumClauses);
750 }
751
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)752 OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
753 SourceLocation StartLoc,
754 SourceLocation EndLoc,
755 ArrayRef<OMPClause *> Clauses,
756 Stmt *AssociatedStmt) {
757 return createDirective<OMPOrderedDirective>(
758 C, Clauses, cast_or_null<CapturedStmt>(AssociatedStmt),
759 /*NumChildren=*/0, StartLoc, EndLoc);
760 }
761
CreateEmpty(const ASTContext & C,unsigned NumClauses,bool IsStandalone,EmptyShell)762 OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C,
763 unsigned NumClauses,
764 bool IsStandalone,
765 EmptyShell) {
766 return createEmptyDirective<OMPOrderedDirective>(C, NumClauses,
767 !IsStandalone);
768 }
769
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * X,Expr * V,Expr * E,Expr * UE,bool IsXLHSInRHSPart,bool IsPostfixUpdate)770 OMPAtomicDirective *OMPAtomicDirective::Create(
771 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
772 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *X, Expr *V,
773 Expr *E, Expr *UE, bool IsXLHSInRHSPart, bool IsPostfixUpdate) {
774 auto *Dir = createDirective<OMPAtomicDirective>(
775 C, Clauses, AssociatedStmt, /*NumChildren=*/4, StartLoc, EndLoc);
776 Dir->setX(X);
777 Dir->setV(V);
778 Dir->setExpr(E);
779 Dir->setUpdateExpr(UE);
780 Dir->IsXLHSInRHSPart = IsXLHSInRHSPart;
781 Dir->IsPostfixUpdate = IsPostfixUpdate;
782 return Dir;
783 }
784
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)785 OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C,
786 unsigned NumClauses,
787 EmptyShell) {
788 return createEmptyDirective<OMPAtomicDirective>(
789 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/4);
790 }
791
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)792 OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C,
793 SourceLocation StartLoc,
794 SourceLocation EndLoc,
795 ArrayRef<OMPClause *> Clauses,
796 Stmt *AssociatedStmt) {
797 return createDirective<OMPTargetDirective>(
798 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
799 }
800
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)801 OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C,
802 unsigned NumClauses,
803 EmptyShell) {
804 return createEmptyDirective<OMPTargetDirective>(C, NumClauses,
805 /*HasAssociatedStmt=*/true);
806 }
807
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,Expr * TaskRedRef,bool HasCancel)808 OMPTargetParallelDirective *OMPTargetParallelDirective::Create(
809 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
810 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
811 bool HasCancel) {
812 auto *Dir = createDirective<OMPTargetParallelDirective>(
813 C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
814 Dir->setTaskReductionRefExpr(TaskRedRef);
815 Dir->setHasCancel(HasCancel);
816 return Dir;
817 }
818
819 OMPTargetParallelDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)820 OMPTargetParallelDirective::CreateEmpty(const ASTContext &C,
821 unsigned NumClauses, EmptyShell) {
822 return createEmptyDirective<OMPTargetParallelDirective>(
823 C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
824 }
825
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)826 OMPTargetParallelForDirective *OMPTargetParallelForDirective::Create(
827 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
828 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
829 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
830 auto *Dir = createDirective<OMPTargetParallelForDirective>(
831 C, Clauses, AssociatedStmt,
832 numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1, StartLoc,
833 EndLoc, CollapsedNum);
834 Dir->setIterationVariable(Exprs.IterationVarRef);
835 Dir->setLastIteration(Exprs.LastIteration);
836 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
837 Dir->setPreCond(Exprs.PreCond);
838 Dir->setCond(Exprs.Cond);
839 Dir->setInit(Exprs.Init);
840 Dir->setInc(Exprs.Inc);
841 Dir->setIsLastIterVariable(Exprs.IL);
842 Dir->setLowerBoundVariable(Exprs.LB);
843 Dir->setUpperBoundVariable(Exprs.UB);
844 Dir->setStrideVariable(Exprs.ST);
845 Dir->setEnsureUpperBound(Exprs.EUB);
846 Dir->setNextLowerBound(Exprs.NLB);
847 Dir->setNextUpperBound(Exprs.NUB);
848 Dir->setNumIterations(Exprs.NumIterations);
849 Dir->setCounters(Exprs.Counters);
850 Dir->setPrivateCounters(Exprs.PrivateCounters);
851 Dir->setInits(Exprs.Inits);
852 Dir->setUpdates(Exprs.Updates);
853 Dir->setFinals(Exprs.Finals);
854 Dir->setDependentCounters(Exprs.DependentCounters);
855 Dir->setDependentInits(Exprs.DependentInits);
856 Dir->setFinalsConditions(Exprs.FinalsConditions);
857 Dir->setPreInits(Exprs.PreInits);
858 Dir->setTaskReductionRefExpr(TaskRedRef);
859 Dir->setHasCancel(HasCancel);
860 return Dir;
861 }
862
863 OMPTargetParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)864 OMPTargetParallelForDirective::CreateEmpty(const ASTContext &C,
865 unsigned NumClauses,
866 unsigned CollapsedNum, EmptyShell) {
867 return createEmptyDirective<OMPTargetParallelForDirective>(
868 C, NumClauses, /*HasAssociatedStmt=*/true,
869 numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1,
870 CollapsedNum);
871 }
872
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)873 OMPTargetDataDirective *OMPTargetDataDirective::Create(
874 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
875 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
876 return createDirective<OMPTargetDataDirective>(
877 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
878 }
879
CreateEmpty(const ASTContext & C,unsigned N,EmptyShell)880 OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C,
881 unsigned N,
882 EmptyShell) {
883 return createEmptyDirective<OMPTargetDataDirective>(
884 C, N, /*HasAssociatedStmt=*/true);
885 }
886
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)887 OMPTargetEnterDataDirective *OMPTargetEnterDataDirective::Create(
888 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
889 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
890 return createDirective<OMPTargetEnterDataDirective>(
891 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
892 }
893
894 OMPTargetEnterDataDirective *
CreateEmpty(const ASTContext & C,unsigned N,EmptyShell)895 OMPTargetEnterDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
896 EmptyShell) {
897 return createEmptyDirective<OMPTargetEnterDataDirective>(
898 C, N, /*HasAssociatedStmt=*/true);
899 }
900
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)901 OMPTargetExitDataDirective *OMPTargetExitDataDirective::Create(
902 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
903 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
904 return createDirective<OMPTargetExitDataDirective>(
905 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
906 }
907
908 OMPTargetExitDataDirective *
CreateEmpty(const ASTContext & C,unsigned N,EmptyShell)909 OMPTargetExitDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
910 EmptyShell) {
911 return createEmptyDirective<OMPTargetExitDataDirective>(
912 C, N, /*HasAssociatedStmt=*/true);
913 }
914
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)915 OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C,
916 SourceLocation StartLoc,
917 SourceLocation EndLoc,
918 ArrayRef<OMPClause *> Clauses,
919 Stmt *AssociatedStmt) {
920 return createDirective<OMPTeamsDirective>(
921 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
922 }
923
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)924 OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C,
925 unsigned NumClauses,
926 EmptyShell) {
927 return createEmptyDirective<OMPTeamsDirective>(C, NumClauses,
928 /*HasAssociatedStmt=*/true);
929 }
930
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)931 OMPTaskLoopDirective *OMPTaskLoopDirective::Create(
932 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
933 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
934 const HelperExprs &Exprs, bool HasCancel) {
935 auto *Dir = createDirective<OMPTaskLoopDirective>(
936 C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_taskloop),
937 StartLoc, EndLoc, CollapsedNum);
938 Dir->setIterationVariable(Exprs.IterationVarRef);
939 Dir->setLastIteration(Exprs.LastIteration);
940 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
941 Dir->setPreCond(Exprs.PreCond);
942 Dir->setCond(Exprs.Cond);
943 Dir->setInit(Exprs.Init);
944 Dir->setInc(Exprs.Inc);
945 Dir->setIsLastIterVariable(Exprs.IL);
946 Dir->setLowerBoundVariable(Exprs.LB);
947 Dir->setUpperBoundVariable(Exprs.UB);
948 Dir->setStrideVariable(Exprs.ST);
949 Dir->setEnsureUpperBound(Exprs.EUB);
950 Dir->setNextLowerBound(Exprs.NLB);
951 Dir->setNextUpperBound(Exprs.NUB);
952 Dir->setNumIterations(Exprs.NumIterations);
953 Dir->setCounters(Exprs.Counters);
954 Dir->setPrivateCounters(Exprs.PrivateCounters);
955 Dir->setInits(Exprs.Inits);
956 Dir->setUpdates(Exprs.Updates);
957 Dir->setFinals(Exprs.Finals);
958 Dir->setDependentCounters(Exprs.DependentCounters);
959 Dir->setDependentInits(Exprs.DependentInits);
960 Dir->setFinalsConditions(Exprs.FinalsConditions);
961 Dir->setPreInits(Exprs.PreInits);
962 Dir->setHasCancel(HasCancel);
963 return Dir;
964 }
965
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)966 OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C,
967 unsigned NumClauses,
968 unsigned CollapsedNum,
969 EmptyShell) {
970 return createEmptyDirective<OMPTaskLoopDirective>(
971 C, NumClauses, /*HasAssociatedStmt=*/true,
972 numLoopChildren(CollapsedNum, OMPD_taskloop), CollapsedNum);
973 }
974
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)975 OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create(
976 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
977 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
978 const HelperExprs &Exprs) {
979 auto *Dir = createDirective<OMPTaskLoopSimdDirective>(
980 C, Clauses, AssociatedStmt,
981 numLoopChildren(CollapsedNum, OMPD_taskloop_simd), StartLoc, EndLoc,
982 CollapsedNum);
983 Dir->setIterationVariable(Exprs.IterationVarRef);
984 Dir->setLastIteration(Exprs.LastIteration);
985 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
986 Dir->setPreCond(Exprs.PreCond);
987 Dir->setCond(Exprs.Cond);
988 Dir->setInit(Exprs.Init);
989 Dir->setInc(Exprs.Inc);
990 Dir->setIsLastIterVariable(Exprs.IL);
991 Dir->setLowerBoundVariable(Exprs.LB);
992 Dir->setUpperBoundVariable(Exprs.UB);
993 Dir->setStrideVariable(Exprs.ST);
994 Dir->setEnsureUpperBound(Exprs.EUB);
995 Dir->setNextLowerBound(Exprs.NLB);
996 Dir->setNextUpperBound(Exprs.NUB);
997 Dir->setNumIterations(Exprs.NumIterations);
998 Dir->setCounters(Exprs.Counters);
999 Dir->setPrivateCounters(Exprs.PrivateCounters);
1000 Dir->setInits(Exprs.Inits);
1001 Dir->setUpdates(Exprs.Updates);
1002 Dir->setFinals(Exprs.Finals);
1003 Dir->setDependentCounters(Exprs.DependentCounters);
1004 Dir->setDependentInits(Exprs.DependentInits);
1005 Dir->setFinalsConditions(Exprs.FinalsConditions);
1006 Dir->setPreInits(Exprs.PreInits);
1007 return Dir;
1008 }
1009
1010 OMPTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1011 OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1012 unsigned CollapsedNum, EmptyShell) {
1013 return createEmptyDirective<OMPTaskLoopSimdDirective>(
1014 C, NumClauses, /*HasAssociatedStmt=*/true,
1015 numLoopChildren(CollapsedNum, OMPD_taskloop_simd), CollapsedNum);
1016 }
1017
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)1018 OMPMasterTaskLoopDirective *OMPMasterTaskLoopDirective::Create(
1019 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1020 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1021 const HelperExprs &Exprs, bool HasCancel) {
1022 auto *Dir = createDirective<OMPMasterTaskLoopDirective>(
1023 C, Clauses, AssociatedStmt,
1024 numLoopChildren(CollapsedNum, OMPD_master_taskloop), StartLoc, EndLoc,
1025 CollapsedNum);
1026 Dir->setIterationVariable(Exprs.IterationVarRef);
1027 Dir->setLastIteration(Exprs.LastIteration);
1028 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1029 Dir->setPreCond(Exprs.PreCond);
1030 Dir->setCond(Exprs.Cond);
1031 Dir->setInit(Exprs.Init);
1032 Dir->setInc(Exprs.Inc);
1033 Dir->setIsLastIterVariable(Exprs.IL);
1034 Dir->setLowerBoundVariable(Exprs.LB);
1035 Dir->setUpperBoundVariable(Exprs.UB);
1036 Dir->setStrideVariable(Exprs.ST);
1037 Dir->setEnsureUpperBound(Exprs.EUB);
1038 Dir->setNextLowerBound(Exprs.NLB);
1039 Dir->setNextUpperBound(Exprs.NUB);
1040 Dir->setNumIterations(Exprs.NumIterations);
1041 Dir->setCounters(Exprs.Counters);
1042 Dir->setPrivateCounters(Exprs.PrivateCounters);
1043 Dir->setInits(Exprs.Inits);
1044 Dir->setUpdates(Exprs.Updates);
1045 Dir->setFinals(Exprs.Finals);
1046 Dir->setDependentCounters(Exprs.DependentCounters);
1047 Dir->setDependentInits(Exprs.DependentInits);
1048 Dir->setFinalsConditions(Exprs.FinalsConditions);
1049 Dir->setPreInits(Exprs.PreInits);
1050 Dir->setHasCancel(HasCancel);
1051 return Dir;
1052 }
1053
1054 OMPMasterTaskLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1055 OMPMasterTaskLoopDirective::CreateEmpty(const ASTContext &C,
1056 unsigned NumClauses,
1057 unsigned CollapsedNum, EmptyShell) {
1058 return createEmptyDirective<OMPMasterTaskLoopDirective>(
1059 C, NumClauses, /*HasAssociatedStmt=*/true,
1060 numLoopChildren(CollapsedNum, OMPD_master_taskloop), CollapsedNum);
1061 }
1062
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1063 OMPMasterTaskLoopSimdDirective *OMPMasterTaskLoopSimdDirective::Create(
1064 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1065 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1066 const HelperExprs &Exprs) {
1067 auto *Dir = createDirective<OMPMasterTaskLoopSimdDirective>(
1068 C, Clauses, AssociatedStmt,
1069 numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), StartLoc,
1070 EndLoc, CollapsedNum);
1071 Dir->setIterationVariable(Exprs.IterationVarRef);
1072 Dir->setLastIteration(Exprs.LastIteration);
1073 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1074 Dir->setPreCond(Exprs.PreCond);
1075 Dir->setCond(Exprs.Cond);
1076 Dir->setInit(Exprs.Init);
1077 Dir->setInc(Exprs.Inc);
1078 Dir->setIsLastIterVariable(Exprs.IL);
1079 Dir->setLowerBoundVariable(Exprs.LB);
1080 Dir->setUpperBoundVariable(Exprs.UB);
1081 Dir->setStrideVariable(Exprs.ST);
1082 Dir->setEnsureUpperBound(Exprs.EUB);
1083 Dir->setNextLowerBound(Exprs.NLB);
1084 Dir->setNextUpperBound(Exprs.NUB);
1085 Dir->setNumIterations(Exprs.NumIterations);
1086 Dir->setCounters(Exprs.Counters);
1087 Dir->setPrivateCounters(Exprs.PrivateCounters);
1088 Dir->setInits(Exprs.Inits);
1089 Dir->setUpdates(Exprs.Updates);
1090 Dir->setFinals(Exprs.Finals);
1091 Dir->setDependentCounters(Exprs.DependentCounters);
1092 Dir->setDependentInits(Exprs.DependentInits);
1093 Dir->setFinalsConditions(Exprs.FinalsConditions);
1094 Dir->setPreInits(Exprs.PreInits);
1095 return Dir;
1096 }
1097
1098 OMPMasterTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1099 OMPMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
1100 unsigned NumClauses,
1101 unsigned CollapsedNum, EmptyShell) {
1102 return createEmptyDirective<OMPMasterTaskLoopSimdDirective>(
1103 C, NumClauses, /*HasAssociatedStmt=*/true,
1104 numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), CollapsedNum);
1105 }
1106
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,bool HasCancel)1107 OMPParallelMasterTaskLoopDirective *OMPParallelMasterTaskLoopDirective::Create(
1108 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1109 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1110 const HelperExprs &Exprs, bool HasCancel) {
1111 auto *Dir = createDirective<OMPParallelMasterTaskLoopDirective>(
1112 C, Clauses, AssociatedStmt,
1113 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop), StartLoc,
1114 EndLoc, CollapsedNum);
1115 Dir->setIterationVariable(Exprs.IterationVarRef);
1116 Dir->setLastIteration(Exprs.LastIteration);
1117 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1118 Dir->setPreCond(Exprs.PreCond);
1119 Dir->setCond(Exprs.Cond);
1120 Dir->setInit(Exprs.Init);
1121 Dir->setInc(Exprs.Inc);
1122 Dir->setIsLastIterVariable(Exprs.IL);
1123 Dir->setLowerBoundVariable(Exprs.LB);
1124 Dir->setUpperBoundVariable(Exprs.UB);
1125 Dir->setStrideVariable(Exprs.ST);
1126 Dir->setEnsureUpperBound(Exprs.EUB);
1127 Dir->setNextLowerBound(Exprs.NLB);
1128 Dir->setNextUpperBound(Exprs.NUB);
1129 Dir->setNumIterations(Exprs.NumIterations);
1130 Dir->setCounters(Exprs.Counters);
1131 Dir->setPrivateCounters(Exprs.PrivateCounters);
1132 Dir->setInits(Exprs.Inits);
1133 Dir->setUpdates(Exprs.Updates);
1134 Dir->setFinals(Exprs.Finals);
1135 Dir->setDependentCounters(Exprs.DependentCounters);
1136 Dir->setDependentInits(Exprs.DependentInits);
1137 Dir->setFinalsConditions(Exprs.FinalsConditions);
1138 Dir->setPreInits(Exprs.PreInits);
1139 Dir->setHasCancel(HasCancel);
1140 return Dir;
1141 }
1142
1143 OMPParallelMasterTaskLoopDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1144 OMPParallelMasterTaskLoopDirective::CreateEmpty(const ASTContext &C,
1145 unsigned NumClauses,
1146 unsigned CollapsedNum,
1147 EmptyShell) {
1148 return createEmptyDirective<OMPParallelMasterTaskLoopDirective>(
1149 C, NumClauses, /*HasAssociatedStmt=*/true,
1150 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop),
1151 CollapsedNum);
1152 }
1153
1154 OMPParallelMasterTaskLoopSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1155 OMPParallelMasterTaskLoopSimdDirective::Create(
1156 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1157 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1158 const HelperExprs &Exprs) {
1159 auto *Dir = createDirective<OMPParallelMasterTaskLoopSimdDirective>(
1160 C, Clauses, AssociatedStmt,
1161 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd),
1162 StartLoc, EndLoc, CollapsedNum);
1163 Dir->setIterationVariable(Exprs.IterationVarRef);
1164 Dir->setLastIteration(Exprs.LastIteration);
1165 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1166 Dir->setPreCond(Exprs.PreCond);
1167 Dir->setCond(Exprs.Cond);
1168 Dir->setInit(Exprs.Init);
1169 Dir->setInc(Exprs.Inc);
1170 Dir->setIsLastIterVariable(Exprs.IL);
1171 Dir->setLowerBoundVariable(Exprs.LB);
1172 Dir->setUpperBoundVariable(Exprs.UB);
1173 Dir->setStrideVariable(Exprs.ST);
1174 Dir->setEnsureUpperBound(Exprs.EUB);
1175 Dir->setNextLowerBound(Exprs.NLB);
1176 Dir->setNextUpperBound(Exprs.NUB);
1177 Dir->setNumIterations(Exprs.NumIterations);
1178 Dir->setCounters(Exprs.Counters);
1179 Dir->setPrivateCounters(Exprs.PrivateCounters);
1180 Dir->setInits(Exprs.Inits);
1181 Dir->setUpdates(Exprs.Updates);
1182 Dir->setFinals(Exprs.Finals);
1183 Dir->setDependentCounters(Exprs.DependentCounters);
1184 Dir->setDependentInits(Exprs.DependentInits);
1185 Dir->setFinalsConditions(Exprs.FinalsConditions);
1186 Dir->setPreInits(Exprs.PreInits);
1187 return Dir;
1188 }
1189
1190 OMPParallelMasterTaskLoopSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1191 OMPParallelMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
1192 unsigned NumClauses,
1193 unsigned CollapsedNum,
1194 EmptyShell) {
1195 return createEmptyDirective<OMPParallelMasterTaskLoopSimdDirective>(
1196 C, NumClauses, /*HasAssociatedStmt=*/true,
1197 numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd),
1198 CollapsedNum);
1199 }
1200
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1201 OMPDistributeDirective *OMPDistributeDirective::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<OMPDistributeDirective>(
1206 C, Clauses, AssociatedStmt,
1207 numLoopChildren(CollapsedNum, OMPD_distribute), 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 OMPDistributeDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1237 OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1238 unsigned CollapsedNum, EmptyShell) {
1239 return createEmptyDirective<OMPDistributeDirective>(
1240 C, NumClauses, /*HasAssociatedStmt=*/true,
1241 numLoopChildren(CollapsedNum, OMPD_distribute), CollapsedNum);
1242 }
1243
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1244 OMPTargetUpdateDirective *OMPTargetUpdateDirective::Create(
1245 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1246 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1247 return createDirective<OMPTargetUpdateDirective>(C, Clauses, AssociatedStmt,
1248 /*NumChildren=*/0, StartLoc,
1249 EndLoc);
1250 }
1251
1252 OMPTargetUpdateDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1253 OMPTargetUpdateDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1254 EmptyShell) {
1255 return createEmptyDirective<OMPTargetUpdateDirective>(
1256 C, NumClauses, /*HasAssociatedStmt=*/true);
1257 }
1258
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)1259 OMPDistributeParallelForDirective *OMPDistributeParallelForDirective::Create(
1260 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1261 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1262 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
1263 auto *Dir = createDirective<OMPDistributeParallelForDirective>(
1264 C, Clauses, AssociatedStmt,
1265 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1, StartLoc,
1266 EndLoc, CollapsedNum);
1267 Dir->setIterationVariable(Exprs.IterationVarRef);
1268 Dir->setLastIteration(Exprs.LastIteration);
1269 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1270 Dir->setPreCond(Exprs.PreCond);
1271 Dir->setCond(Exprs.Cond);
1272 Dir->setInit(Exprs.Init);
1273 Dir->setInc(Exprs.Inc);
1274 Dir->setIsLastIterVariable(Exprs.IL);
1275 Dir->setLowerBoundVariable(Exprs.LB);
1276 Dir->setUpperBoundVariable(Exprs.UB);
1277 Dir->setStrideVariable(Exprs.ST);
1278 Dir->setEnsureUpperBound(Exprs.EUB);
1279 Dir->setNextLowerBound(Exprs.NLB);
1280 Dir->setNextUpperBound(Exprs.NUB);
1281 Dir->setNumIterations(Exprs.NumIterations);
1282 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1283 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1284 Dir->setDistInc(Exprs.DistInc);
1285 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1286 Dir->setCounters(Exprs.Counters);
1287 Dir->setPrivateCounters(Exprs.PrivateCounters);
1288 Dir->setInits(Exprs.Inits);
1289 Dir->setUpdates(Exprs.Updates);
1290 Dir->setFinals(Exprs.Finals);
1291 Dir->setDependentCounters(Exprs.DependentCounters);
1292 Dir->setDependentInits(Exprs.DependentInits);
1293 Dir->setFinalsConditions(Exprs.FinalsConditions);
1294 Dir->setPreInits(Exprs.PreInits);
1295 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1296 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1297 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1298 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1299 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1300 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1301 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1302 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1303 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1304 Dir->setTaskReductionRefExpr(TaskRedRef);
1305 Dir->HasCancel = HasCancel;
1306 return Dir;
1307 }
1308
1309 OMPDistributeParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1310 OMPDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
1311 unsigned NumClauses,
1312 unsigned CollapsedNum,
1313 EmptyShell) {
1314 return createEmptyDirective<OMPDistributeParallelForDirective>(
1315 C, NumClauses, /*HasAssociatedStmt=*/true,
1316 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1,
1317 CollapsedNum);
1318 }
1319
1320 OMPDistributeParallelForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1321 OMPDistributeParallelForSimdDirective::Create(
1322 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1323 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1324 const HelperExprs &Exprs) {
1325 auto *Dir = createDirective<OMPDistributeParallelForSimdDirective>(
1326 C, Clauses, AssociatedStmt,
1327 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd),
1328 StartLoc, EndLoc, CollapsedNum);
1329 Dir->setIterationVariable(Exprs.IterationVarRef);
1330 Dir->setLastIteration(Exprs.LastIteration);
1331 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1332 Dir->setPreCond(Exprs.PreCond);
1333 Dir->setCond(Exprs.Cond);
1334 Dir->setInit(Exprs.Init);
1335 Dir->setInc(Exprs.Inc);
1336 Dir->setIsLastIterVariable(Exprs.IL);
1337 Dir->setLowerBoundVariable(Exprs.LB);
1338 Dir->setUpperBoundVariable(Exprs.UB);
1339 Dir->setStrideVariable(Exprs.ST);
1340 Dir->setEnsureUpperBound(Exprs.EUB);
1341 Dir->setNextLowerBound(Exprs.NLB);
1342 Dir->setNextUpperBound(Exprs.NUB);
1343 Dir->setNumIterations(Exprs.NumIterations);
1344 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1345 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1346 Dir->setDistInc(Exprs.DistInc);
1347 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1348 Dir->setCounters(Exprs.Counters);
1349 Dir->setPrivateCounters(Exprs.PrivateCounters);
1350 Dir->setInits(Exprs.Inits);
1351 Dir->setUpdates(Exprs.Updates);
1352 Dir->setFinals(Exprs.Finals);
1353 Dir->setDependentCounters(Exprs.DependentCounters);
1354 Dir->setDependentInits(Exprs.DependentInits);
1355 Dir->setFinalsConditions(Exprs.FinalsConditions);
1356 Dir->setPreInits(Exprs.PreInits);
1357 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1358 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1359 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1360 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1361 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1362 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1363 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1364 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1365 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1366 return Dir;
1367 }
1368
1369 OMPDistributeParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1370 OMPDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1371 unsigned NumClauses,
1372 unsigned CollapsedNum,
1373 EmptyShell) {
1374 return createEmptyDirective<OMPDistributeParallelForSimdDirective>(
1375 C, NumClauses, /*HasAssociatedStmt=*/true,
1376 numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd),
1377 CollapsedNum);
1378 }
1379
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1380 OMPDistributeSimdDirective *OMPDistributeSimdDirective::Create(
1381 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1382 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1383 const HelperExprs &Exprs) {
1384 auto *Dir = createDirective<OMPDistributeSimdDirective>(
1385 C, Clauses, AssociatedStmt,
1386 numLoopChildren(CollapsedNum, OMPD_distribute_simd), StartLoc, EndLoc,
1387 CollapsedNum);
1388 Dir->setIterationVariable(Exprs.IterationVarRef);
1389 Dir->setLastIteration(Exprs.LastIteration);
1390 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1391 Dir->setPreCond(Exprs.PreCond);
1392 Dir->setCond(Exprs.Cond);
1393 Dir->setInit(Exprs.Init);
1394 Dir->setInc(Exprs.Inc);
1395 Dir->setIsLastIterVariable(Exprs.IL);
1396 Dir->setLowerBoundVariable(Exprs.LB);
1397 Dir->setUpperBoundVariable(Exprs.UB);
1398 Dir->setStrideVariable(Exprs.ST);
1399 Dir->setEnsureUpperBound(Exprs.EUB);
1400 Dir->setNextLowerBound(Exprs.NLB);
1401 Dir->setNextUpperBound(Exprs.NUB);
1402 Dir->setNumIterations(Exprs.NumIterations);
1403 Dir->setCounters(Exprs.Counters);
1404 Dir->setPrivateCounters(Exprs.PrivateCounters);
1405 Dir->setInits(Exprs.Inits);
1406 Dir->setUpdates(Exprs.Updates);
1407 Dir->setFinals(Exprs.Finals);
1408 Dir->setDependentCounters(Exprs.DependentCounters);
1409 Dir->setDependentInits(Exprs.DependentInits);
1410 Dir->setFinalsConditions(Exprs.FinalsConditions);
1411 Dir->setPreInits(Exprs.PreInits);
1412 return Dir;
1413 }
1414
1415 OMPDistributeSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1416 OMPDistributeSimdDirective::CreateEmpty(const ASTContext &C,
1417 unsigned NumClauses,
1418 unsigned CollapsedNum, EmptyShell) {
1419 return createEmptyDirective<OMPDistributeSimdDirective>(
1420 C, NumClauses, /*HasAssociatedStmt=*/true,
1421 numLoopChildren(CollapsedNum, OMPD_distribute_simd), CollapsedNum);
1422 }
1423
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1424 OMPTargetParallelForSimdDirective *OMPTargetParallelForSimdDirective::Create(
1425 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1426 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1427 const HelperExprs &Exprs) {
1428 auto *Dir = createDirective<OMPTargetParallelForSimdDirective>(
1429 C, Clauses, AssociatedStmt,
1430 numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd), StartLoc,
1431 EndLoc, CollapsedNum);
1432 Dir->setIterationVariable(Exprs.IterationVarRef);
1433 Dir->setLastIteration(Exprs.LastIteration);
1434 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1435 Dir->setPreCond(Exprs.PreCond);
1436 Dir->setCond(Exprs.Cond);
1437 Dir->setInit(Exprs.Init);
1438 Dir->setInc(Exprs.Inc);
1439 Dir->setIsLastIterVariable(Exprs.IL);
1440 Dir->setLowerBoundVariable(Exprs.LB);
1441 Dir->setUpperBoundVariable(Exprs.UB);
1442 Dir->setStrideVariable(Exprs.ST);
1443 Dir->setEnsureUpperBound(Exprs.EUB);
1444 Dir->setNextLowerBound(Exprs.NLB);
1445 Dir->setNextUpperBound(Exprs.NUB);
1446 Dir->setNumIterations(Exprs.NumIterations);
1447 Dir->setCounters(Exprs.Counters);
1448 Dir->setPrivateCounters(Exprs.PrivateCounters);
1449 Dir->setInits(Exprs.Inits);
1450 Dir->setUpdates(Exprs.Updates);
1451 Dir->setFinals(Exprs.Finals);
1452 Dir->setDependentCounters(Exprs.DependentCounters);
1453 Dir->setDependentInits(Exprs.DependentInits);
1454 Dir->setFinalsConditions(Exprs.FinalsConditions);
1455 Dir->setPreInits(Exprs.PreInits);
1456 return Dir;
1457 }
1458
1459 OMPTargetParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1460 OMPTargetParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1461 unsigned NumClauses,
1462 unsigned CollapsedNum,
1463 EmptyShell) {
1464 return createEmptyDirective<OMPTargetParallelForSimdDirective>(
1465 C, NumClauses, /*HasAssociatedStmt=*/true,
1466 numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd),
1467 CollapsedNum);
1468 }
1469
1470 OMPTargetSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1471 OMPTargetSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
1472 SourceLocation EndLoc, unsigned CollapsedNum,
1473 ArrayRef<OMPClause *> Clauses,
1474 Stmt *AssociatedStmt, const HelperExprs &Exprs) {
1475 auto *Dir = createDirective<OMPTargetSimdDirective>(
1476 C, Clauses, AssociatedStmt,
1477 numLoopChildren(CollapsedNum, OMPD_target_simd), StartLoc, EndLoc,
1478 CollapsedNum);
1479 Dir->setIterationVariable(Exprs.IterationVarRef);
1480 Dir->setLastIteration(Exprs.LastIteration);
1481 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1482 Dir->setPreCond(Exprs.PreCond);
1483 Dir->setCond(Exprs.Cond);
1484 Dir->setInit(Exprs.Init);
1485 Dir->setInc(Exprs.Inc);
1486 Dir->setCounters(Exprs.Counters);
1487 Dir->setPrivateCounters(Exprs.PrivateCounters);
1488 Dir->setInits(Exprs.Inits);
1489 Dir->setUpdates(Exprs.Updates);
1490 Dir->setFinals(Exprs.Finals);
1491 Dir->setDependentCounters(Exprs.DependentCounters);
1492 Dir->setDependentInits(Exprs.DependentInits);
1493 Dir->setFinalsConditions(Exprs.FinalsConditions);
1494 Dir->setPreInits(Exprs.PreInits);
1495 return Dir;
1496 }
1497
1498 OMPTargetSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1499 OMPTargetSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1500 unsigned CollapsedNum, EmptyShell) {
1501 return createEmptyDirective<OMPTargetSimdDirective>(
1502 C, NumClauses, /*HasAssociatedStmt=*/true,
1503 numLoopChildren(CollapsedNum, OMPD_target_simd), CollapsedNum);
1504 }
1505
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1506 OMPTeamsDistributeDirective *OMPTeamsDistributeDirective::Create(
1507 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1508 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1509 const HelperExprs &Exprs) {
1510 auto *Dir = createDirective<OMPTeamsDistributeDirective>(
1511 C, Clauses, AssociatedStmt,
1512 numLoopChildren(CollapsedNum, OMPD_teams_distribute), StartLoc, EndLoc,
1513 CollapsedNum);
1514 Dir->setIterationVariable(Exprs.IterationVarRef);
1515 Dir->setLastIteration(Exprs.LastIteration);
1516 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1517 Dir->setPreCond(Exprs.PreCond);
1518 Dir->setCond(Exprs.Cond);
1519 Dir->setInit(Exprs.Init);
1520 Dir->setInc(Exprs.Inc);
1521 Dir->setIsLastIterVariable(Exprs.IL);
1522 Dir->setLowerBoundVariable(Exprs.LB);
1523 Dir->setUpperBoundVariable(Exprs.UB);
1524 Dir->setStrideVariable(Exprs.ST);
1525 Dir->setEnsureUpperBound(Exprs.EUB);
1526 Dir->setNextLowerBound(Exprs.NLB);
1527 Dir->setNextUpperBound(Exprs.NUB);
1528 Dir->setNumIterations(Exprs.NumIterations);
1529 Dir->setCounters(Exprs.Counters);
1530 Dir->setPrivateCounters(Exprs.PrivateCounters);
1531 Dir->setInits(Exprs.Inits);
1532 Dir->setUpdates(Exprs.Updates);
1533 Dir->setFinals(Exprs.Finals);
1534 Dir->setDependentCounters(Exprs.DependentCounters);
1535 Dir->setDependentInits(Exprs.DependentInits);
1536 Dir->setFinalsConditions(Exprs.FinalsConditions);
1537 Dir->setPreInits(Exprs.PreInits);
1538 return Dir;
1539 }
1540
1541 OMPTeamsDistributeDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1542 OMPTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
1543 unsigned NumClauses,
1544 unsigned CollapsedNum, EmptyShell) {
1545 return createEmptyDirective<OMPTeamsDistributeDirective>(
1546 C, NumClauses, /*HasAssociatedStmt=*/true,
1547 numLoopChildren(CollapsedNum, OMPD_teams_distribute), CollapsedNum);
1548 }
1549
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1550 OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::Create(
1551 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1552 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1553 const HelperExprs &Exprs) {
1554 auto *Dir = createDirective<OMPTeamsDistributeSimdDirective>(
1555 C, Clauses, AssociatedStmt,
1556 numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), StartLoc,
1557 EndLoc, CollapsedNum);
1558 Dir->setIterationVariable(Exprs.IterationVarRef);
1559 Dir->setLastIteration(Exprs.LastIteration);
1560 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1561 Dir->setPreCond(Exprs.PreCond);
1562 Dir->setCond(Exprs.Cond);
1563 Dir->setInit(Exprs.Init);
1564 Dir->setInc(Exprs.Inc);
1565 Dir->setIsLastIterVariable(Exprs.IL);
1566 Dir->setLowerBoundVariable(Exprs.LB);
1567 Dir->setUpperBoundVariable(Exprs.UB);
1568 Dir->setStrideVariable(Exprs.ST);
1569 Dir->setEnsureUpperBound(Exprs.EUB);
1570 Dir->setNextLowerBound(Exprs.NLB);
1571 Dir->setNextUpperBound(Exprs.NUB);
1572 Dir->setNumIterations(Exprs.NumIterations);
1573 Dir->setCounters(Exprs.Counters);
1574 Dir->setPrivateCounters(Exprs.PrivateCounters);
1575 Dir->setInits(Exprs.Inits);
1576 Dir->setUpdates(Exprs.Updates);
1577 Dir->setFinals(Exprs.Finals);
1578 Dir->setDependentCounters(Exprs.DependentCounters);
1579 Dir->setDependentInits(Exprs.DependentInits);
1580 Dir->setFinalsConditions(Exprs.FinalsConditions);
1581 Dir->setPreInits(Exprs.PreInits);
1582 return Dir;
1583 }
1584
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1585 OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::CreateEmpty(
1586 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
1587 EmptyShell) {
1588 return createEmptyDirective<OMPTeamsDistributeSimdDirective>(
1589 C, NumClauses, /*HasAssociatedStmt=*/true,
1590 numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), CollapsedNum);
1591 }
1592
1593 OMPTeamsDistributeParallelForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1594 OMPTeamsDistributeParallelForSimdDirective::Create(
1595 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1596 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1597 const HelperExprs &Exprs) {
1598 auto *Dir = createDirective<OMPTeamsDistributeParallelForSimdDirective>(
1599 C, Clauses, AssociatedStmt,
1600 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd),
1601 StartLoc, EndLoc, CollapsedNum);
1602 Dir->setIterationVariable(Exprs.IterationVarRef);
1603 Dir->setLastIteration(Exprs.LastIteration);
1604 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1605 Dir->setPreCond(Exprs.PreCond);
1606 Dir->setCond(Exprs.Cond);
1607 Dir->setInit(Exprs.Init);
1608 Dir->setInc(Exprs.Inc);
1609 Dir->setIsLastIterVariable(Exprs.IL);
1610 Dir->setLowerBoundVariable(Exprs.LB);
1611 Dir->setUpperBoundVariable(Exprs.UB);
1612 Dir->setStrideVariable(Exprs.ST);
1613 Dir->setEnsureUpperBound(Exprs.EUB);
1614 Dir->setNextLowerBound(Exprs.NLB);
1615 Dir->setNextUpperBound(Exprs.NUB);
1616 Dir->setNumIterations(Exprs.NumIterations);
1617 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1618 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1619 Dir->setDistInc(Exprs.DistInc);
1620 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1621 Dir->setCounters(Exprs.Counters);
1622 Dir->setPrivateCounters(Exprs.PrivateCounters);
1623 Dir->setInits(Exprs.Inits);
1624 Dir->setUpdates(Exprs.Updates);
1625 Dir->setFinals(Exprs.Finals);
1626 Dir->setDependentCounters(Exprs.DependentCounters);
1627 Dir->setDependentInits(Exprs.DependentInits);
1628 Dir->setFinalsConditions(Exprs.FinalsConditions);
1629 Dir->setPreInits(Exprs.PreInits);
1630 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1631 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1632 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1633 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1634 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1635 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1636 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1637 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1638 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1639 return Dir;
1640 }
1641
1642 OMPTeamsDistributeParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1643 OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1644 unsigned NumClauses,
1645 unsigned CollapsedNum,
1646 EmptyShell) {
1647 return createEmptyDirective<OMPTeamsDistributeParallelForSimdDirective>(
1648 C, NumClauses, /*HasAssociatedStmt=*/true,
1649 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd),
1650 CollapsedNum);
1651 }
1652
1653 OMPTeamsDistributeParallelForDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)1654 OMPTeamsDistributeParallelForDirective::Create(
1655 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1656 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1657 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
1658 auto *Dir = createDirective<OMPTeamsDistributeParallelForDirective>(
1659 C, Clauses, AssociatedStmt,
1660 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1,
1661 StartLoc, EndLoc, CollapsedNum);
1662 Dir->setIterationVariable(Exprs.IterationVarRef);
1663 Dir->setLastIteration(Exprs.LastIteration);
1664 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1665 Dir->setPreCond(Exprs.PreCond);
1666 Dir->setCond(Exprs.Cond);
1667 Dir->setInit(Exprs.Init);
1668 Dir->setInc(Exprs.Inc);
1669 Dir->setIsLastIterVariable(Exprs.IL);
1670 Dir->setLowerBoundVariable(Exprs.LB);
1671 Dir->setUpperBoundVariable(Exprs.UB);
1672 Dir->setStrideVariable(Exprs.ST);
1673 Dir->setEnsureUpperBound(Exprs.EUB);
1674 Dir->setNextLowerBound(Exprs.NLB);
1675 Dir->setNextUpperBound(Exprs.NUB);
1676 Dir->setNumIterations(Exprs.NumIterations);
1677 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1678 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1679 Dir->setDistInc(Exprs.DistInc);
1680 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1681 Dir->setCounters(Exprs.Counters);
1682 Dir->setPrivateCounters(Exprs.PrivateCounters);
1683 Dir->setInits(Exprs.Inits);
1684 Dir->setUpdates(Exprs.Updates);
1685 Dir->setFinals(Exprs.Finals);
1686 Dir->setDependentCounters(Exprs.DependentCounters);
1687 Dir->setDependentInits(Exprs.DependentInits);
1688 Dir->setFinalsConditions(Exprs.FinalsConditions);
1689 Dir->setPreInits(Exprs.PreInits);
1690 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1691 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1692 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1693 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1694 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1695 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1696 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1697 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1698 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1699 Dir->setTaskReductionRefExpr(TaskRedRef);
1700 Dir->HasCancel = HasCancel;
1701 return Dir;
1702 }
1703
1704 OMPTeamsDistributeParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1705 OMPTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
1706 unsigned NumClauses,
1707 unsigned CollapsedNum,
1708 EmptyShell) {
1709 return createEmptyDirective<OMPTeamsDistributeParallelForDirective>(
1710 C, NumClauses, /*HasAssociatedStmt=*/true,
1711 numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1,
1712 CollapsedNum);
1713 }
1714
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1715 OMPTargetTeamsDirective *OMPTargetTeamsDirective::Create(
1716 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1717 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1718 return createDirective<OMPTargetTeamsDirective>(C, Clauses, AssociatedStmt,
1719 /*NumChildren=*/0, StartLoc,
1720 EndLoc);
1721 }
1722
1723 OMPTargetTeamsDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1724 OMPTargetTeamsDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1725 EmptyShell) {
1726 return createEmptyDirective<OMPTargetTeamsDirective>(
1727 C, NumClauses, /*HasAssociatedStmt=*/true);
1728 }
1729
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1730 OMPTargetTeamsDistributeDirective *OMPTargetTeamsDistributeDirective::Create(
1731 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1732 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1733 const HelperExprs &Exprs) {
1734 auto *Dir = createDirective<OMPTargetTeamsDistributeDirective>(
1735 C, Clauses, AssociatedStmt,
1736 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute), StartLoc,
1737 EndLoc, CollapsedNum);
1738 Dir->setIterationVariable(Exprs.IterationVarRef);
1739 Dir->setLastIteration(Exprs.LastIteration);
1740 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1741 Dir->setPreCond(Exprs.PreCond);
1742 Dir->setCond(Exprs.Cond);
1743 Dir->setInit(Exprs.Init);
1744 Dir->setInc(Exprs.Inc);
1745 Dir->setIsLastIterVariable(Exprs.IL);
1746 Dir->setLowerBoundVariable(Exprs.LB);
1747 Dir->setUpperBoundVariable(Exprs.UB);
1748 Dir->setStrideVariable(Exprs.ST);
1749 Dir->setEnsureUpperBound(Exprs.EUB);
1750 Dir->setNextLowerBound(Exprs.NLB);
1751 Dir->setNextUpperBound(Exprs.NUB);
1752 Dir->setNumIterations(Exprs.NumIterations);
1753 Dir->setCounters(Exprs.Counters);
1754 Dir->setPrivateCounters(Exprs.PrivateCounters);
1755 Dir->setInits(Exprs.Inits);
1756 Dir->setUpdates(Exprs.Updates);
1757 Dir->setFinals(Exprs.Finals);
1758 Dir->setDependentCounters(Exprs.DependentCounters);
1759 Dir->setDependentInits(Exprs.DependentInits);
1760 Dir->setFinalsConditions(Exprs.FinalsConditions);
1761 Dir->setPreInits(Exprs.PreInits);
1762 return Dir;
1763 }
1764
1765 OMPTargetTeamsDistributeDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1766 OMPTargetTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
1767 unsigned NumClauses,
1768 unsigned CollapsedNum,
1769 EmptyShell) {
1770 return createEmptyDirective<OMPTargetTeamsDistributeDirective>(
1771 C, NumClauses, /*HasAssociatedStmt=*/true,
1772 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute),
1773 CollapsedNum);
1774 }
1775
1776 OMPTargetTeamsDistributeParallelForDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs,Expr * TaskRedRef,bool HasCancel)1777 OMPTargetTeamsDistributeParallelForDirective::Create(
1778 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1779 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1780 const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
1781 auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForDirective>(
1782 C, Clauses, AssociatedStmt,
1783 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) +
1784 1,
1785 StartLoc, EndLoc, CollapsedNum);
1786 Dir->setIterationVariable(Exprs.IterationVarRef);
1787 Dir->setLastIteration(Exprs.LastIteration);
1788 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1789 Dir->setPreCond(Exprs.PreCond);
1790 Dir->setCond(Exprs.Cond);
1791 Dir->setInit(Exprs.Init);
1792 Dir->setInc(Exprs.Inc);
1793 Dir->setIsLastIterVariable(Exprs.IL);
1794 Dir->setLowerBoundVariable(Exprs.LB);
1795 Dir->setUpperBoundVariable(Exprs.UB);
1796 Dir->setStrideVariable(Exprs.ST);
1797 Dir->setEnsureUpperBound(Exprs.EUB);
1798 Dir->setNextLowerBound(Exprs.NLB);
1799 Dir->setNextUpperBound(Exprs.NUB);
1800 Dir->setNumIterations(Exprs.NumIterations);
1801 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1802 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1803 Dir->setDistInc(Exprs.DistInc);
1804 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1805 Dir->setCounters(Exprs.Counters);
1806 Dir->setPrivateCounters(Exprs.PrivateCounters);
1807 Dir->setInits(Exprs.Inits);
1808 Dir->setUpdates(Exprs.Updates);
1809 Dir->setFinals(Exprs.Finals);
1810 Dir->setDependentCounters(Exprs.DependentCounters);
1811 Dir->setDependentInits(Exprs.DependentInits);
1812 Dir->setFinalsConditions(Exprs.FinalsConditions);
1813 Dir->setPreInits(Exprs.PreInits);
1814 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1815 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1816 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1817 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1818 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1819 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1820 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1821 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1822 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1823 Dir->setTaskReductionRefExpr(TaskRedRef);
1824 Dir->HasCancel = HasCancel;
1825 return Dir;
1826 }
1827
1828 OMPTargetTeamsDistributeParallelForDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1829 OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
1830 unsigned NumClauses,
1831 unsigned CollapsedNum,
1832 EmptyShell) {
1833 return createEmptyDirective<OMPTargetTeamsDistributeParallelForDirective>(
1834 C, NumClauses, /*HasAssociatedStmt=*/true,
1835 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) +
1836 1,
1837 CollapsedNum);
1838 }
1839
1840 OMPTargetTeamsDistributeParallelForSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1841 OMPTargetTeamsDistributeParallelForSimdDirective::Create(
1842 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1843 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1844 const HelperExprs &Exprs) {
1845 auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForSimdDirective>(
1846 C, Clauses, AssociatedStmt,
1847 numLoopChildren(CollapsedNum,
1848 OMPD_target_teams_distribute_parallel_for_simd),
1849 StartLoc, EndLoc, CollapsedNum);
1850 Dir->setIterationVariable(Exprs.IterationVarRef);
1851 Dir->setLastIteration(Exprs.LastIteration);
1852 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1853 Dir->setPreCond(Exprs.PreCond);
1854 Dir->setCond(Exprs.Cond);
1855 Dir->setInit(Exprs.Init);
1856 Dir->setInc(Exprs.Inc);
1857 Dir->setIsLastIterVariable(Exprs.IL);
1858 Dir->setLowerBoundVariable(Exprs.LB);
1859 Dir->setUpperBoundVariable(Exprs.UB);
1860 Dir->setStrideVariable(Exprs.ST);
1861 Dir->setEnsureUpperBound(Exprs.EUB);
1862 Dir->setNextLowerBound(Exprs.NLB);
1863 Dir->setNextUpperBound(Exprs.NUB);
1864 Dir->setNumIterations(Exprs.NumIterations);
1865 Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1866 Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1867 Dir->setDistInc(Exprs.DistInc);
1868 Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1869 Dir->setCounters(Exprs.Counters);
1870 Dir->setPrivateCounters(Exprs.PrivateCounters);
1871 Dir->setInits(Exprs.Inits);
1872 Dir->setUpdates(Exprs.Updates);
1873 Dir->setFinals(Exprs.Finals);
1874 Dir->setDependentCounters(Exprs.DependentCounters);
1875 Dir->setDependentInits(Exprs.DependentInits);
1876 Dir->setFinalsConditions(Exprs.FinalsConditions);
1877 Dir->setPreInits(Exprs.PreInits);
1878 Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1879 Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1880 Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1881 Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1882 Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1883 Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1884 Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1885 Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
1886 Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
1887 return Dir;
1888 }
1889
1890 OMPTargetTeamsDistributeParallelForSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1891 OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty(
1892 const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
1893 EmptyShell) {
1894 return createEmptyDirective<OMPTargetTeamsDistributeParallelForSimdDirective>(
1895 C, NumClauses, /*HasAssociatedStmt=*/true,
1896 numLoopChildren(CollapsedNum,
1897 OMPD_target_teams_distribute_parallel_for_simd),
1898 CollapsedNum);
1899 }
1900
1901 OMPTargetTeamsDistributeSimdDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,const HelperExprs & Exprs)1902 OMPTargetTeamsDistributeSimdDirective::Create(
1903 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1904 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1905 const HelperExprs &Exprs) {
1906 auto *Dir = createDirective<OMPTargetTeamsDistributeSimdDirective>(
1907 C, Clauses, AssociatedStmt,
1908 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd),
1909 StartLoc, EndLoc, CollapsedNum);
1910 Dir->setIterationVariable(Exprs.IterationVarRef);
1911 Dir->setLastIteration(Exprs.LastIteration);
1912 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1913 Dir->setPreCond(Exprs.PreCond);
1914 Dir->setCond(Exprs.Cond);
1915 Dir->setInit(Exprs.Init);
1916 Dir->setInc(Exprs.Inc);
1917 Dir->setIsLastIterVariable(Exprs.IL);
1918 Dir->setLowerBoundVariable(Exprs.LB);
1919 Dir->setUpperBoundVariable(Exprs.UB);
1920 Dir->setStrideVariable(Exprs.ST);
1921 Dir->setEnsureUpperBound(Exprs.EUB);
1922 Dir->setNextLowerBound(Exprs.NLB);
1923 Dir->setNextUpperBound(Exprs.NUB);
1924 Dir->setNumIterations(Exprs.NumIterations);
1925 Dir->setCounters(Exprs.Counters);
1926 Dir->setPrivateCounters(Exprs.PrivateCounters);
1927 Dir->setInits(Exprs.Inits);
1928 Dir->setUpdates(Exprs.Updates);
1929 Dir->setFinals(Exprs.Finals);
1930 Dir->setDependentCounters(Exprs.DependentCounters);
1931 Dir->setDependentInits(Exprs.DependentInits);
1932 Dir->setFinalsConditions(Exprs.FinalsConditions);
1933 Dir->setPreInits(Exprs.PreInits);
1934 return Dir;
1935 }
1936
1937 OMPTargetTeamsDistributeSimdDirective *
CreateEmpty(const ASTContext & C,unsigned NumClauses,unsigned CollapsedNum,EmptyShell)1938 OMPTargetTeamsDistributeSimdDirective::CreateEmpty(const ASTContext &C,
1939 unsigned NumClauses,
1940 unsigned CollapsedNum,
1941 EmptyShell) {
1942 return createEmptyDirective<OMPTargetTeamsDistributeSimdDirective>(
1943 C, NumClauses, /*HasAssociatedStmt=*/true,
1944 numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd),
1945 CollapsedNum);
1946 }
1947
1948 OMPInteropDirective *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses)1949 OMPInteropDirective::Create(const ASTContext &C, SourceLocation StartLoc,
1950 SourceLocation EndLoc,
1951 ArrayRef<OMPClause *> Clauses) {
1952 return createDirective<OMPInteropDirective>(
1953 C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
1954 EndLoc);
1955 }
1956
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1957 OMPInteropDirective *OMPInteropDirective::CreateEmpty(const ASTContext &C,
1958 unsigned NumClauses,
1959 EmptyShell) {
1960 return createEmptyDirective<OMPInteropDirective>(C, NumClauses);
1961 }
1962
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt,SourceLocation TargetCallLoc)1963 OMPDispatchDirective *OMPDispatchDirective::Create(
1964 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1965 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1966 SourceLocation TargetCallLoc) {
1967 auto *Dir = createDirective<OMPDispatchDirective>(
1968 C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
1969 Dir->setTargetCallLoc(TargetCallLoc);
1970 return Dir;
1971 }
1972
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1973 OMPDispatchDirective *OMPDispatchDirective::CreateEmpty(const ASTContext &C,
1974 unsigned NumClauses,
1975 EmptyShell) {
1976 return createEmptyDirective<OMPDispatchDirective>(C, NumClauses,
1977 /*HasAssociatedStmt=*/true,
1978 /*NumChildren=*/0);
1979 }
1980
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc,ArrayRef<OMPClause * > Clauses,Stmt * AssociatedStmt)1981 OMPMaskedDirective *OMPMaskedDirective::Create(const ASTContext &C,
1982 SourceLocation StartLoc,
1983 SourceLocation EndLoc,
1984 ArrayRef<OMPClause *> Clauses,
1985 Stmt *AssociatedStmt) {
1986 return createDirective<OMPMaskedDirective>(C, Clauses, AssociatedStmt,
1987 /*NumChildren=*/0, StartLoc,
1988 EndLoc);
1989 }
1990
CreateEmpty(const ASTContext & C,unsigned NumClauses,EmptyShell)1991 OMPMaskedDirective *OMPMaskedDirective::CreateEmpty(const ASTContext &C,
1992 unsigned NumClauses,
1993 EmptyShell) {
1994 return createEmptyDirective<OMPMaskedDirective>(C, NumClauses,
1995 /*HasAssociatedStmt=*/true);
1996 }
1997