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