2015-10-02 13:41:04 +00:00
|
|
|
//===--- StmtOpenMP.cpp - Classes for OpenMP directives -------------------===//
|
|
|
|
//
|
2019-01-19 08:50:56 +00:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2015-10-02 13:41:04 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
2024-06-28 18:36:20 +01:00
|
|
|
// This file implements the subclasses of Stmt class declared in StmtOpenMP.h
|
2015-10-02 13:41:04 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "clang/AST/ASTContext.h"
|
2020-02-28 09:52:15 -05:00
|
|
|
#include "clang/AST/StmtOpenMP.h"
|
2015-10-02 13:41:04 +00:00
|
|
|
|
|
|
|
using namespace clang;
|
[OpenMP][NFCI] Introduce llvm/IR/OpenMPConstants.h
Summary:
The new OpenMPConstants.h is a location for all OpenMP related constants
(and helpers) to live.
This patch moves the directives there (the enum OpenMPDirectiveKind) and
rewires Clang to use the new location.
Initially part of D69785.
Reviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim
Subscribers: jholewinski, ppenzin, penzn, llvm-commits, cfe-commits, jfb, guansong, bollu, hiraditya, mgorny
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D69853
2019-11-04 22:00:49 -06:00
|
|
|
using namespace llvm::omp;
|
2015-10-02 13:41:04 +00:00
|
|
|
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
size_t OMPChildren::size(unsigned NumClauses, bool HasAssociatedStmt,
|
|
|
|
unsigned NumChildren) {
|
|
|
|
return llvm::alignTo(
|
|
|
|
totalSizeToAlloc<OMPClause *, Stmt *>(
|
|
|
|
NumClauses, NumChildren + (HasAssociatedStmt ? 1 : 0)),
|
|
|
|
alignof(OMPChildren));
|
|
|
|
}
|
|
|
|
|
|
|
|
void OMPChildren::setClauses(ArrayRef<OMPClause *> Clauses) {
|
|
|
|
assert(Clauses.size() == NumClauses &&
|
2015-10-02 13:41:04 +00:00
|
|
|
"Number of clauses is not the same as the preallocated buffer");
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
llvm::copy(Clauses, getTrailingObjects<OMPClause *>());
|
|
|
|
}
|
|
|
|
|
|
|
|
MutableArrayRef<Stmt *> OMPChildren::getChildren() {
|
2023-01-15 21:39:16 -07:00
|
|
|
return llvm::MutableArrayRef(getTrailingObjects<Stmt *>(), NumChildren);
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPChildren *OMPChildren::Create(void *Mem, ArrayRef<OMPClause *> Clauses) {
|
|
|
|
auto *Data = CreateEmpty(Mem, Clauses.size());
|
|
|
|
Data->setClauses(Clauses);
|
|
|
|
return Data;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPChildren *OMPChildren::Create(void *Mem, ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *S, unsigned NumChildren) {
|
|
|
|
auto *Data = CreateEmpty(Mem, Clauses.size(), S, NumChildren);
|
|
|
|
Data->setClauses(Clauses);
|
|
|
|
if (S)
|
|
|
|
Data->setAssociatedStmt(S);
|
|
|
|
return Data;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPChildren *OMPChildren::CreateEmpty(void *Mem, unsigned NumClauses,
|
|
|
|
bool HasAssociatedStmt,
|
|
|
|
unsigned NumChildren) {
|
|
|
|
return new (Mem) OMPChildren(NumClauses, NumChildren, HasAssociatedStmt);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
[clang][OpeMP] Model OpenMP structured-block in AST (PR40563)
Summary:
https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf, page 3:
```
structured block
For C/C++, an executable statement, possibly compound, with a single entry at the
top and a single exit at the bottom, or an OpenMP construct.
COMMENT: See Section 2.1 on page 38 for restrictions on structured
blocks.
```
```
2.1 Directive Format
Some executable directives include a structured block. A structured block:
• may contain infinite loops where the point of exit is never reached;
• may halt due to an IEEE exception;
• may contain calls to exit(), _Exit(), quick_exit(), abort() or functions with a
_Noreturn specifier (in C) or a noreturn attribute (in C/C++);
• may be an expression statement, iteration statement, selection statement, or try block, provided
that the corresponding compound statement obtained by enclosing it in { and } would be a
structured block; and
Restrictions
Restrictions to structured blocks are as follows:
• Entry to a structured block must not be the result of a branch.
• The point of exit cannot be a branch out of the structured block.
C / C++
• The point of entry to a structured block must not be a call to setjmp().
• longjmp() and throw() must not violate the entry/exit criteria.
```
Of particular note here is the fact that OpenMP structured blocks are as-if `noexcept`,
in the same sense as with the normal `noexcept` functions in C++.
I.e. if throw happens, and it attempts to travel out of the `noexcept` function
(here: out of the current structured-block), then the program terminates.
Now, one of course can say that since it is explicitly prohibited by the Specification,
then any and all programs that violate this Specification contain undefined behavior,
and are unspecified, and thus no one should care about them. Just don't write broken code /s
But i'm not sure this is a reasonable approach.
I have personally had oss-fuzz issues of this origin - exception thrown inside
of an OpenMP structured-block that is not caught, thus causing program termination.
This issue isn't all that hard to catch, it's not any particularly different from
diagnosing the same situation with the normal `noexcept` function.
Now, clang static analyzer does not presently model exceptions.
But clang-tidy has a simplisic [[ https://clang.llvm.org/extra/clang-tidy/checks/bugprone-exception-escape.html | bugprone-exception-escape ]] check,
and it is even refactored as a `ExceptionAnalyzer` class for reuse.
So it would be trivial to use that analyzer to check for
exceptions escaping out of OpenMP structured blocks. (D59466)
All that sounds too great to be true. Indeed, there is a caveat.
Presently, it's practically impossible to do. To check a OpenMP structured block
you need to somehow 'get' the OpenMP structured block, and you can't because
it's simply not modelled in AST. `CapturedStmt`/`CapturedDecl` is not it's representation.
Now, it is of course possible to write e.g. some AST matcher that would e.g.
match every OpenMP executable directive, and then return the whatever `Stmt` is
the structured block of said executable directive, if any.
But i said //practically//. This isn't practical for the following reasons:
1. This **will** bitrot. That matcher will need to be kept up-to-date,
and refreshed with every new OpenMP spec version.
2. Every single piece of code that would want that knowledge would need to
have such matcher. Well, okay, if it is an AST matcher, it could be shared.
But then you still have `RecursiveASTVisitor` and friends.
`2 > 1`, so now you have code duplication.
So it would be reasonable (and is fully within clang AST spirit) to not
force every single consumer to do that work, but instead store that knowledge
in the correct, and appropriate place - AST, class structure.
Now, there is another hoop we need to get through.
It isn't fully obvious //how// to model this.
The best solution would of course be to simply add a `OMPStructuredBlock` transparent
node. It would be optimal, it would give us two properties:
* Given this `OMPExecutableDirective`, what's it OpenMP structured block?
* It is trivial to check whether the `Stmt*` is a OpenMP structured block (`isa<OMPStructuredBlock>(ptr)`)
But OpenMP structured block isn't **necessarily** the first, direct child of `OMP*Directive`.
(even ignoring the clang's `CapturedStmt`/`CapturedDecl` that were inserted inbetween).
So i'm not sure whether or not we could re-create AST statements after they were already created?
There would be other costs to a new AST node: https://bugs.llvm.org/show_bug.cgi?id=40563#c12
```
1. You will need to break the representation of loops. The body should be replaced by the "structured block" entity.
2. You will need to support serialization/deserialization.
3. You will need to support template instantiation.
4. You will need to support codegen and take this new construct to account in each OpenMP directive.
```
Instead, there **is** an functionally-equivalent, alternative solution, consisting of two parts.
Part 1:
* Add a member function `isStandaloneDirective()` to the `OMPExecutableDirective` class,
that will tell whether this directive is stand-alone or not, as per the spec.
We need it because we can't just check for the existance of associated statements,
see code comment.
* Add a member function `getStructuredBlock()` to the OMPExecutableDirective` class itself,
that assert that this is not a stand-alone directive, and either return the correct loop body
if this is a loop-like directive, or the captured statement.
This way, given an `OMPExecutableDirective`, we can get it's structured block.
Also, since the knowledge is ingrained into the clang OpenMP implementation,
it will not cause any duplication, and //hopefully// won't bitrot.
Great we achieved 1 of 2 properties of `OMPStructuredBlock` approach.
Thus, there is a second part needed:
* How can we check whether a given `Stmt*` is `OMPStructuredBlock`?
Well, we can't really, in general. I can see this workaround:
```
class FunctionASTVisitor : public RecursiveASTVisitor<FunctionASTVisitor> {
using Base = RecursiveASTVisitor<FunctionASTVisitor>;
public:
bool VisitOMPExecDir(OMPExecDir *D) {
OmpStructuredStmts.emplace_back(D.getStructuredStmt());
}
bool VisitSOMETHINGELSE(???) {
if(InOmpStructuredStmt)
HI!
}
bool TraverseStmt(Stmt *Node) {
if (!Node)
return Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node)
++InOmpStructuredStmt;
Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node) {
OmpStructuredStmts.pop_back();
--InOmpStructuredStmt;
}
return true;
}
std::vector<Stmt*> OmpStructuredStmts;
int InOmpStructuredStmt = 0;
};
```
But i really don't see using it in practice.
It's just too intrusive; and again, requires knowledge duplication.
.. but no. The solution lies right on the ground.
Why don't we simply store this `i'm a openmp structured block` in the bitfield of the `Stmt` itself?
This does not appear to have any impact on the memory footprint of the clang AST,
since it's just a single extra bit in the bitfield. At least the static assertions don't fail.
Thus, indeed, we can achieve both of the properties without a new AST node.
We can cheaply set that bit right in sema, at the end of `Sema::ActOnOpenMPExecutableDirective()`,
by just calling the `getStructuredBlock()` that we just added.
Test coverage that demonstrates all this has been added.
This isn't as great with serialization though. Most of it does not use abbrevs,
so we do end up paying the full price (4 bytes?) instead of a single bit.
That price, of course, can be reclaimed by using abbrevs.
In fact, i suspect that //might// not just reclaim these bytes, but pack these PCH significantly.
I'm not seeing a third solution. If there is one, it would be interesting to hear about it.
("just don't write code that would require `isa<OMPStructuredBlock>(ptr)`" is not a solution.)
Fixes [[ https://bugs.llvm.org/show_bug.cgi?id=40563 | PR40563 ]].
Reviewers: ABataev, rjmccall, hfinkel, rsmith, riccibruno, gribozavr
Reviewed By: ABataev, gribozavr
Subscribers: mgorny, aaron.ballman, steveire, guansong, jfb, jdoerfert, cfe-commits
Tags: #clang, #openmp
Differential Revision: https://reviews.llvm.org/D59214
llvm-svn: 356570
2019-03-20 16:32:36 +00:00
|
|
|
bool OMPExecutableDirective::isStandaloneDirective() const {
|
|
|
|
// Special case: 'omp target enter data', 'omp target exit data',
|
|
|
|
// 'omp target update' are stand-alone directives, but for implementation
|
|
|
|
// reasons they have empty synthetic structured block, to simplify codegen.
|
|
|
|
if (isa<OMPTargetEnterDataDirective>(this) ||
|
|
|
|
isa<OMPTargetExitDataDirective>(this) ||
|
|
|
|
isa<OMPTargetUpdateDirective>(this))
|
|
|
|
return true;
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return !hasAssociatedStmt();
|
[clang][OpeMP] Model OpenMP structured-block in AST (PR40563)
Summary:
https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf, page 3:
```
structured block
For C/C++, an executable statement, possibly compound, with a single entry at the
top and a single exit at the bottom, or an OpenMP construct.
COMMENT: See Section 2.1 on page 38 for restrictions on structured
blocks.
```
```
2.1 Directive Format
Some executable directives include a structured block. A structured block:
• may contain infinite loops where the point of exit is never reached;
• may halt due to an IEEE exception;
• may contain calls to exit(), _Exit(), quick_exit(), abort() or functions with a
_Noreturn specifier (in C) or a noreturn attribute (in C/C++);
• may be an expression statement, iteration statement, selection statement, or try block, provided
that the corresponding compound statement obtained by enclosing it in { and } would be a
structured block; and
Restrictions
Restrictions to structured blocks are as follows:
• Entry to a structured block must not be the result of a branch.
• The point of exit cannot be a branch out of the structured block.
C / C++
• The point of entry to a structured block must not be a call to setjmp().
• longjmp() and throw() must not violate the entry/exit criteria.
```
Of particular note here is the fact that OpenMP structured blocks are as-if `noexcept`,
in the same sense as with the normal `noexcept` functions in C++.
I.e. if throw happens, and it attempts to travel out of the `noexcept` function
(here: out of the current structured-block), then the program terminates.
Now, one of course can say that since it is explicitly prohibited by the Specification,
then any and all programs that violate this Specification contain undefined behavior,
and are unspecified, and thus no one should care about them. Just don't write broken code /s
But i'm not sure this is a reasonable approach.
I have personally had oss-fuzz issues of this origin - exception thrown inside
of an OpenMP structured-block that is not caught, thus causing program termination.
This issue isn't all that hard to catch, it's not any particularly different from
diagnosing the same situation with the normal `noexcept` function.
Now, clang static analyzer does not presently model exceptions.
But clang-tidy has a simplisic [[ https://clang.llvm.org/extra/clang-tidy/checks/bugprone-exception-escape.html | bugprone-exception-escape ]] check,
and it is even refactored as a `ExceptionAnalyzer` class for reuse.
So it would be trivial to use that analyzer to check for
exceptions escaping out of OpenMP structured blocks. (D59466)
All that sounds too great to be true. Indeed, there is a caveat.
Presently, it's practically impossible to do. To check a OpenMP structured block
you need to somehow 'get' the OpenMP structured block, and you can't because
it's simply not modelled in AST. `CapturedStmt`/`CapturedDecl` is not it's representation.
Now, it is of course possible to write e.g. some AST matcher that would e.g.
match every OpenMP executable directive, and then return the whatever `Stmt` is
the structured block of said executable directive, if any.
But i said //practically//. This isn't practical for the following reasons:
1. This **will** bitrot. That matcher will need to be kept up-to-date,
and refreshed with every new OpenMP spec version.
2. Every single piece of code that would want that knowledge would need to
have such matcher. Well, okay, if it is an AST matcher, it could be shared.
But then you still have `RecursiveASTVisitor` and friends.
`2 > 1`, so now you have code duplication.
So it would be reasonable (and is fully within clang AST spirit) to not
force every single consumer to do that work, but instead store that knowledge
in the correct, and appropriate place - AST, class structure.
Now, there is another hoop we need to get through.
It isn't fully obvious //how// to model this.
The best solution would of course be to simply add a `OMPStructuredBlock` transparent
node. It would be optimal, it would give us two properties:
* Given this `OMPExecutableDirective`, what's it OpenMP structured block?
* It is trivial to check whether the `Stmt*` is a OpenMP structured block (`isa<OMPStructuredBlock>(ptr)`)
But OpenMP structured block isn't **necessarily** the first, direct child of `OMP*Directive`.
(even ignoring the clang's `CapturedStmt`/`CapturedDecl` that were inserted inbetween).
So i'm not sure whether or not we could re-create AST statements after they were already created?
There would be other costs to a new AST node: https://bugs.llvm.org/show_bug.cgi?id=40563#c12
```
1. You will need to break the representation of loops. The body should be replaced by the "structured block" entity.
2. You will need to support serialization/deserialization.
3. You will need to support template instantiation.
4. You will need to support codegen and take this new construct to account in each OpenMP directive.
```
Instead, there **is** an functionally-equivalent, alternative solution, consisting of two parts.
Part 1:
* Add a member function `isStandaloneDirective()` to the `OMPExecutableDirective` class,
that will tell whether this directive is stand-alone or not, as per the spec.
We need it because we can't just check for the existance of associated statements,
see code comment.
* Add a member function `getStructuredBlock()` to the OMPExecutableDirective` class itself,
that assert that this is not a stand-alone directive, and either return the correct loop body
if this is a loop-like directive, or the captured statement.
This way, given an `OMPExecutableDirective`, we can get it's structured block.
Also, since the knowledge is ingrained into the clang OpenMP implementation,
it will not cause any duplication, and //hopefully// won't bitrot.
Great we achieved 1 of 2 properties of `OMPStructuredBlock` approach.
Thus, there is a second part needed:
* How can we check whether a given `Stmt*` is `OMPStructuredBlock`?
Well, we can't really, in general. I can see this workaround:
```
class FunctionASTVisitor : public RecursiveASTVisitor<FunctionASTVisitor> {
using Base = RecursiveASTVisitor<FunctionASTVisitor>;
public:
bool VisitOMPExecDir(OMPExecDir *D) {
OmpStructuredStmts.emplace_back(D.getStructuredStmt());
}
bool VisitSOMETHINGELSE(???) {
if(InOmpStructuredStmt)
HI!
}
bool TraverseStmt(Stmt *Node) {
if (!Node)
return Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node)
++InOmpStructuredStmt;
Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node) {
OmpStructuredStmts.pop_back();
--InOmpStructuredStmt;
}
return true;
}
std::vector<Stmt*> OmpStructuredStmts;
int InOmpStructuredStmt = 0;
};
```
But i really don't see using it in practice.
It's just too intrusive; and again, requires knowledge duplication.
.. but no. The solution lies right on the ground.
Why don't we simply store this `i'm a openmp structured block` in the bitfield of the `Stmt` itself?
This does not appear to have any impact on the memory footprint of the clang AST,
since it's just a single extra bit in the bitfield. At least the static assertions don't fail.
Thus, indeed, we can achieve both of the properties without a new AST node.
We can cheaply set that bit right in sema, at the end of `Sema::ActOnOpenMPExecutableDirective()`,
by just calling the `getStructuredBlock()` that we just added.
Test coverage that demonstrates all this has been added.
This isn't as great with serialization though. Most of it does not use abbrevs,
so we do end up paying the full price (4 bytes?) instead of a single bit.
That price, of course, can be reclaimed by using abbrevs.
In fact, i suspect that //might// not just reclaim these bytes, but pack these PCH significantly.
I'm not seeing a third solution. If there is one, it would be interesting to hear about it.
("just don't write code that would require `isa<OMPStructuredBlock>(ptr)`" is not a solution.)
Fixes [[ https://bugs.llvm.org/show_bug.cgi?id=40563 | PR40563 ]].
Reviewers: ABataev, rjmccall, hfinkel, rsmith, riccibruno, gribozavr
Reviewed By: ABataev, gribozavr
Subscribers: mgorny, aaron.ballman, steveire, guansong, jfb, jdoerfert, cfe-commits
Tags: #clang, #openmp
Differential Revision: https://reviews.llvm.org/D59214
llvm-svn: 356570
2019-03-20 16:32:36 +00:00
|
|
|
}
|
|
|
|
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
Stmt *OMPExecutableDirective::getStructuredBlock() {
|
[clang][OpeMP] Model OpenMP structured-block in AST (PR40563)
Summary:
https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf, page 3:
```
structured block
For C/C++, an executable statement, possibly compound, with a single entry at the
top and a single exit at the bottom, or an OpenMP construct.
COMMENT: See Section 2.1 on page 38 for restrictions on structured
blocks.
```
```
2.1 Directive Format
Some executable directives include a structured block. A structured block:
• may contain infinite loops where the point of exit is never reached;
• may halt due to an IEEE exception;
• may contain calls to exit(), _Exit(), quick_exit(), abort() or functions with a
_Noreturn specifier (in C) or a noreturn attribute (in C/C++);
• may be an expression statement, iteration statement, selection statement, or try block, provided
that the corresponding compound statement obtained by enclosing it in { and } would be a
structured block; and
Restrictions
Restrictions to structured blocks are as follows:
• Entry to a structured block must not be the result of a branch.
• The point of exit cannot be a branch out of the structured block.
C / C++
• The point of entry to a structured block must not be a call to setjmp().
• longjmp() and throw() must not violate the entry/exit criteria.
```
Of particular note here is the fact that OpenMP structured blocks are as-if `noexcept`,
in the same sense as with the normal `noexcept` functions in C++.
I.e. if throw happens, and it attempts to travel out of the `noexcept` function
(here: out of the current structured-block), then the program terminates.
Now, one of course can say that since it is explicitly prohibited by the Specification,
then any and all programs that violate this Specification contain undefined behavior,
and are unspecified, and thus no one should care about them. Just don't write broken code /s
But i'm not sure this is a reasonable approach.
I have personally had oss-fuzz issues of this origin - exception thrown inside
of an OpenMP structured-block that is not caught, thus causing program termination.
This issue isn't all that hard to catch, it's not any particularly different from
diagnosing the same situation with the normal `noexcept` function.
Now, clang static analyzer does not presently model exceptions.
But clang-tidy has a simplisic [[ https://clang.llvm.org/extra/clang-tidy/checks/bugprone-exception-escape.html | bugprone-exception-escape ]] check,
and it is even refactored as a `ExceptionAnalyzer` class for reuse.
So it would be trivial to use that analyzer to check for
exceptions escaping out of OpenMP structured blocks. (D59466)
All that sounds too great to be true. Indeed, there is a caveat.
Presently, it's practically impossible to do. To check a OpenMP structured block
you need to somehow 'get' the OpenMP structured block, and you can't because
it's simply not modelled in AST. `CapturedStmt`/`CapturedDecl` is not it's representation.
Now, it is of course possible to write e.g. some AST matcher that would e.g.
match every OpenMP executable directive, and then return the whatever `Stmt` is
the structured block of said executable directive, if any.
But i said //practically//. This isn't practical for the following reasons:
1. This **will** bitrot. That matcher will need to be kept up-to-date,
and refreshed with every new OpenMP spec version.
2. Every single piece of code that would want that knowledge would need to
have such matcher. Well, okay, if it is an AST matcher, it could be shared.
But then you still have `RecursiveASTVisitor` and friends.
`2 > 1`, so now you have code duplication.
So it would be reasonable (and is fully within clang AST spirit) to not
force every single consumer to do that work, but instead store that knowledge
in the correct, and appropriate place - AST, class structure.
Now, there is another hoop we need to get through.
It isn't fully obvious //how// to model this.
The best solution would of course be to simply add a `OMPStructuredBlock` transparent
node. It would be optimal, it would give us two properties:
* Given this `OMPExecutableDirective`, what's it OpenMP structured block?
* It is trivial to check whether the `Stmt*` is a OpenMP structured block (`isa<OMPStructuredBlock>(ptr)`)
But OpenMP structured block isn't **necessarily** the first, direct child of `OMP*Directive`.
(even ignoring the clang's `CapturedStmt`/`CapturedDecl` that were inserted inbetween).
So i'm not sure whether or not we could re-create AST statements after they were already created?
There would be other costs to a new AST node: https://bugs.llvm.org/show_bug.cgi?id=40563#c12
```
1. You will need to break the representation of loops. The body should be replaced by the "structured block" entity.
2. You will need to support serialization/deserialization.
3. You will need to support template instantiation.
4. You will need to support codegen and take this new construct to account in each OpenMP directive.
```
Instead, there **is** an functionally-equivalent, alternative solution, consisting of two parts.
Part 1:
* Add a member function `isStandaloneDirective()` to the `OMPExecutableDirective` class,
that will tell whether this directive is stand-alone or not, as per the spec.
We need it because we can't just check for the existance of associated statements,
see code comment.
* Add a member function `getStructuredBlock()` to the OMPExecutableDirective` class itself,
that assert that this is not a stand-alone directive, and either return the correct loop body
if this is a loop-like directive, or the captured statement.
This way, given an `OMPExecutableDirective`, we can get it's structured block.
Also, since the knowledge is ingrained into the clang OpenMP implementation,
it will not cause any duplication, and //hopefully// won't bitrot.
Great we achieved 1 of 2 properties of `OMPStructuredBlock` approach.
Thus, there is a second part needed:
* How can we check whether a given `Stmt*` is `OMPStructuredBlock`?
Well, we can't really, in general. I can see this workaround:
```
class FunctionASTVisitor : public RecursiveASTVisitor<FunctionASTVisitor> {
using Base = RecursiveASTVisitor<FunctionASTVisitor>;
public:
bool VisitOMPExecDir(OMPExecDir *D) {
OmpStructuredStmts.emplace_back(D.getStructuredStmt());
}
bool VisitSOMETHINGELSE(???) {
if(InOmpStructuredStmt)
HI!
}
bool TraverseStmt(Stmt *Node) {
if (!Node)
return Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node)
++InOmpStructuredStmt;
Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node) {
OmpStructuredStmts.pop_back();
--InOmpStructuredStmt;
}
return true;
}
std::vector<Stmt*> OmpStructuredStmts;
int InOmpStructuredStmt = 0;
};
```
But i really don't see using it in practice.
It's just too intrusive; and again, requires knowledge duplication.
.. but no. The solution lies right on the ground.
Why don't we simply store this `i'm a openmp structured block` in the bitfield of the `Stmt` itself?
This does not appear to have any impact on the memory footprint of the clang AST,
since it's just a single extra bit in the bitfield. At least the static assertions don't fail.
Thus, indeed, we can achieve both of the properties without a new AST node.
We can cheaply set that bit right in sema, at the end of `Sema::ActOnOpenMPExecutableDirective()`,
by just calling the `getStructuredBlock()` that we just added.
Test coverage that demonstrates all this has been added.
This isn't as great with serialization though. Most of it does not use abbrevs,
so we do end up paying the full price (4 bytes?) instead of a single bit.
That price, of course, can be reclaimed by using abbrevs.
In fact, i suspect that //might// not just reclaim these bytes, but pack these PCH significantly.
I'm not seeing a third solution. If there is one, it would be interesting to hear about it.
("just don't write code that would require `isa<OMPStructuredBlock>(ptr)`" is not a solution.)
Fixes [[ https://bugs.llvm.org/show_bug.cgi?id=40563 | PR40563 ]].
Reviewers: ABataev, rjmccall, hfinkel, rsmith, riccibruno, gribozavr
Reviewed By: ABataev, gribozavr
Subscribers: mgorny, aaron.ballman, steveire, guansong, jfb, jdoerfert, cfe-commits
Tags: #clang, #openmp
Differential Revision: https://reviews.llvm.org/D59214
llvm-svn: 356570
2019-03-20 16:32:36 +00:00
|
|
|
assert(!isStandaloneDirective() &&
|
|
|
|
"Standalone Executable Directives don't have Structured Blocks.");
|
|
|
|
if (auto *LD = dyn_cast<OMPLoopDirective>(this))
|
|
|
|
return LD->getBody();
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return getRawStmt();
|
[clang][OpeMP] Model OpenMP structured-block in AST (PR40563)
Summary:
https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf, page 3:
```
structured block
For C/C++, an executable statement, possibly compound, with a single entry at the
top and a single exit at the bottom, or an OpenMP construct.
COMMENT: See Section 2.1 on page 38 for restrictions on structured
blocks.
```
```
2.1 Directive Format
Some executable directives include a structured block. A structured block:
• may contain infinite loops where the point of exit is never reached;
• may halt due to an IEEE exception;
• may contain calls to exit(), _Exit(), quick_exit(), abort() or functions with a
_Noreturn specifier (in C) or a noreturn attribute (in C/C++);
• may be an expression statement, iteration statement, selection statement, or try block, provided
that the corresponding compound statement obtained by enclosing it in { and } would be a
structured block; and
Restrictions
Restrictions to structured blocks are as follows:
• Entry to a structured block must not be the result of a branch.
• The point of exit cannot be a branch out of the structured block.
C / C++
• The point of entry to a structured block must not be a call to setjmp().
• longjmp() and throw() must not violate the entry/exit criteria.
```
Of particular note here is the fact that OpenMP structured blocks are as-if `noexcept`,
in the same sense as with the normal `noexcept` functions in C++.
I.e. if throw happens, and it attempts to travel out of the `noexcept` function
(here: out of the current structured-block), then the program terminates.
Now, one of course can say that since it is explicitly prohibited by the Specification,
then any and all programs that violate this Specification contain undefined behavior,
and are unspecified, and thus no one should care about them. Just don't write broken code /s
But i'm not sure this is a reasonable approach.
I have personally had oss-fuzz issues of this origin - exception thrown inside
of an OpenMP structured-block that is not caught, thus causing program termination.
This issue isn't all that hard to catch, it's not any particularly different from
diagnosing the same situation with the normal `noexcept` function.
Now, clang static analyzer does not presently model exceptions.
But clang-tidy has a simplisic [[ https://clang.llvm.org/extra/clang-tidy/checks/bugprone-exception-escape.html | bugprone-exception-escape ]] check,
and it is even refactored as a `ExceptionAnalyzer` class for reuse.
So it would be trivial to use that analyzer to check for
exceptions escaping out of OpenMP structured blocks. (D59466)
All that sounds too great to be true. Indeed, there is a caveat.
Presently, it's practically impossible to do. To check a OpenMP structured block
you need to somehow 'get' the OpenMP structured block, and you can't because
it's simply not modelled in AST. `CapturedStmt`/`CapturedDecl` is not it's representation.
Now, it is of course possible to write e.g. some AST matcher that would e.g.
match every OpenMP executable directive, and then return the whatever `Stmt` is
the structured block of said executable directive, if any.
But i said //practically//. This isn't practical for the following reasons:
1. This **will** bitrot. That matcher will need to be kept up-to-date,
and refreshed with every new OpenMP spec version.
2. Every single piece of code that would want that knowledge would need to
have such matcher. Well, okay, if it is an AST matcher, it could be shared.
But then you still have `RecursiveASTVisitor` and friends.
`2 > 1`, so now you have code duplication.
So it would be reasonable (and is fully within clang AST spirit) to not
force every single consumer to do that work, but instead store that knowledge
in the correct, and appropriate place - AST, class structure.
Now, there is another hoop we need to get through.
It isn't fully obvious //how// to model this.
The best solution would of course be to simply add a `OMPStructuredBlock` transparent
node. It would be optimal, it would give us two properties:
* Given this `OMPExecutableDirective`, what's it OpenMP structured block?
* It is trivial to check whether the `Stmt*` is a OpenMP structured block (`isa<OMPStructuredBlock>(ptr)`)
But OpenMP structured block isn't **necessarily** the first, direct child of `OMP*Directive`.
(even ignoring the clang's `CapturedStmt`/`CapturedDecl` that were inserted inbetween).
So i'm not sure whether or not we could re-create AST statements after they were already created?
There would be other costs to a new AST node: https://bugs.llvm.org/show_bug.cgi?id=40563#c12
```
1. You will need to break the representation of loops. The body should be replaced by the "structured block" entity.
2. You will need to support serialization/deserialization.
3. You will need to support template instantiation.
4. You will need to support codegen and take this new construct to account in each OpenMP directive.
```
Instead, there **is** an functionally-equivalent, alternative solution, consisting of two parts.
Part 1:
* Add a member function `isStandaloneDirective()` to the `OMPExecutableDirective` class,
that will tell whether this directive is stand-alone or not, as per the spec.
We need it because we can't just check for the existance of associated statements,
see code comment.
* Add a member function `getStructuredBlock()` to the OMPExecutableDirective` class itself,
that assert that this is not a stand-alone directive, and either return the correct loop body
if this is a loop-like directive, or the captured statement.
This way, given an `OMPExecutableDirective`, we can get it's structured block.
Also, since the knowledge is ingrained into the clang OpenMP implementation,
it will not cause any duplication, and //hopefully// won't bitrot.
Great we achieved 1 of 2 properties of `OMPStructuredBlock` approach.
Thus, there is a second part needed:
* How can we check whether a given `Stmt*` is `OMPStructuredBlock`?
Well, we can't really, in general. I can see this workaround:
```
class FunctionASTVisitor : public RecursiveASTVisitor<FunctionASTVisitor> {
using Base = RecursiveASTVisitor<FunctionASTVisitor>;
public:
bool VisitOMPExecDir(OMPExecDir *D) {
OmpStructuredStmts.emplace_back(D.getStructuredStmt());
}
bool VisitSOMETHINGELSE(???) {
if(InOmpStructuredStmt)
HI!
}
bool TraverseStmt(Stmt *Node) {
if (!Node)
return Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node)
++InOmpStructuredStmt;
Base::TraverseStmt(Node);
if (OmpStructuredStmts.back() == Node) {
OmpStructuredStmts.pop_back();
--InOmpStructuredStmt;
}
return true;
}
std::vector<Stmt*> OmpStructuredStmts;
int InOmpStructuredStmt = 0;
};
```
But i really don't see using it in practice.
It's just too intrusive; and again, requires knowledge duplication.
.. but no. The solution lies right on the ground.
Why don't we simply store this `i'm a openmp structured block` in the bitfield of the `Stmt` itself?
This does not appear to have any impact on the memory footprint of the clang AST,
since it's just a single extra bit in the bitfield. At least the static assertions don't fail.
Thus, indeed, we can achieve both of the properties without a new AST node.
We can cheaply set that bit right in sema, at the end of `Sema::ActOnOpenMPExecutableDirective()`,
by just calling the `getStructuredBlock()` that we just added.
Test coverage that demonstrates all this has been added.
This isn't as great with serialization though. Most of it does not use abbrevs,
so we do end up paying the full price (4 bytes?) instead of a single bit.
That price, of course, can be reclaimed by using abbrevs.
In fact, i suspect that //might// not just reclaim these bytes, but pack these PCH significantly.
I'm not seeing a third solution. If there is one, it would be interesting to hear about it.
("just don't write code that would require `isa<OMPStructuredBlock>(ptr)`" is not a solution.)
Fixes [[ https://bugs.llvm.org/show_bug.cgi?id=40563 | PR40563 ]].
Reviewers: ABataev, rjmccall, hfinkel, rsmith, riccibruno, gribozavr
Reviewed By: ABataev, gribozavr
Subscribers: mgorny, aaron.ballman, steveire, guansong, jfb, jdoerfert, cfe-commits
Tags: #clang, #openmp
Differential Revision: https://reviews.llvm.org/D59214
llvm-svn: 356570
2019-03-20 16:32:36 +00:00
|
|
|
}
|
|
|
|
|
2021-02-12 11:26:59 -08:00
|
|
|
Stmt *
|
|
|
|
OMPLoopBasedDirective::tryToFindNextInnerLoop(Stmt *CurStmt,
|
|
|
|
bool TryImperfectlyNestedLoops) {
|
2019-11-04 09:59:11 -05:00
|
|
|
Stmt *OrigStmt = CurStmt;
|
|
|
|
CurStmt = CurStmt->IgnoreContainers();
|
|
|
|
// Additional work for imperfectly nested loops, introduced in OpenMP 5.0.
|
|
|
|
if (TryImperfectlyNestedLoops) {
|
|
|
|
if (auto *CS = dyn_cast<CompoundStmt>(CurStmt)) {
|
|
|
|
CurStmt = nullptr;
|
|
|
|
SmallVector<CompoundStmt *, 4> Statements(1, CS);
|
|
|
|
SmallVector<CompoundStmt *, 4> NextStatements;
|
|
|
|
while (!Statements.empty()) {
|
|
|
|
CS = Statements.pop_back_val();
|
|
|
|
if (!CS)
|
|
|
|
continue;
|
|
|
|
for (Stmt *S : CS->body()) {
|
|
|
|
if (!S)
|
|
|
|
continue;
|
2021-03-03 17:15:32 -06:00
|
|
|
if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(S))
|
|
|
|
S = CanonLoop->getLoopStmt();
|
2021-02-12 11:26:59 -08:00
|
|
|
if (isa<ForStmt>(S) || isa<CXXForRangeStmt>(S) ||
|
|
|
|
(isa<OMPLoopBasedDirective>(S) && !isa<OMPLoopDirective>(S))) {
|
2019-11-04 09:59:11 -05:00
|
|
|
// Only single loop construct is allowed.
|
|
|
|
if (CurStmt) {
|
|
|
|
CurStmt = OrigStmt;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
CurStmt = S;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
S = S->IgnoreContainers();
|
|
|
|
if (auto *InnerCS = dyn_cast_or_null<CompoundStmt>(S))
|
|
|
|
NextStatements.push_back(InnerCS);
|
|
|
|
}
|
|
|
|
if (Statements.empty()) {
|
|
|
|
// Found single inner loop or multiple loops - exit.
|
|
|
|
if (CurStmt)
|
|
|
|
break;
|
|
|
|
Statements.swap(NextStatements);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!CurStmt)
|
|
|
|
CurStmt = OrigStmt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return CurStmt;
|
|
|
|
}
|
|
|
|
|
2021-02-12 11:26:59 -08:00
|
|
|
bool OMPLoopBasedDirective::doForAllLoops(
|
|
|
|
Stmt *CurStmt, bool TryImperfectlyNestedLoops, unsigned NumLoops,
|
2021-06-02 09:12:32 -05:00
|
|
|
llvm::function_ref<bool(unsigned, Stmt *)> Callback,
|
2021-10-06 10:02:27 -05:00
|
|
|
llvm::function_ref<void(OMPLoopTransformationDirective *)>
|
2021-06-02 09:12:32 -05:00
|
|
|
OnTransformationCallback) {
|
2021-02-12 11:26:59 -08:00
|
|
|
CurStmt = CurStmt->IgnoreContainers();
|
|
|
|
for (unsigned Cnt = 0; Cnt < NumLoops; ++Cnt) {
|
2021-06-10 14:24:17 -05:00
|
|
|
while (true) {
|
2021-10-06 10:02:27 -05:00
|
|
|
auto *Dir = dyn_cast<OMPLoopTransformationDirective>(CurStmt);
|
|
|
|
if (!Dir)
|
2021-06-10 14:24:17 -05:00
|
|
|
break;
|
|
|
|
|
2021-10-06 10:02:27 -05:00
|
|
|
OnTransformationCallback(Dir);
|
|
|
|
|
|
|
|
Stmt *TransformedStmt = Dir->getTransformedStmt();
|
|
|
|
if (!TransformedStmt) {
|
2021-10-06 11:43:29 -05:00
|
|
|
unsigned NumGeneratedLoops = Dir->getNumGeneratedLoops();
|
|
|
|
if (NumGeneratedLoops == 0) {
|
|
|
|
// May happen if the loop transformation does not result in a
|
|
|
|
// generated loop (such as full unrolling).
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (NumGeneratedLoops > 0) {
|
|
|
|
// The loop transformation construct has generated loops, but these
|
|
|
|
// may not have been generated yet due to being in a dependent
|
|
|
|
// context.
|
|
|
|
return true;
|
|
|
|
}
|
2021-06-10 14:24:17 -05:00
|
|
|
}
|
2021-10-06 10:02:27 -05:00
|
|
|
|
|
|
|
CurStmt = TransformedStmt;
|
2021-06-02 09:12:32 -05:00
|
|
|
}
|
2021-03-03 17:15:32 -06:00
|
|
|
if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(CurStmt))
|
|
|
|
CurStmt = CanonLoop->getLoopStmt();
|
2021-02-12 11:26:59 -08:00
|
|
|
if (Callback(Cnt, CurStmt))
|
|
|
|
return false;
|
|
|
|
// Move on to the next nested for loop, or to the loop body.
|
|
|
|
// OpenMP [2.8.1, simd construct, Restrictions]
|
|
|
|
// All loops associated with the construct must be perfectly nested; that
|
|
|
|
// is, there must be no intervening code nor any OpenMP directive between
|
|
|
|
// any two loops.
|
|
|
|
if (auto *For = dyn_cast<ForStmt>(CurStmt)) {
|
|
|
|
CurStmt = For->getBody();
|
2019-11-04 09:59:11 -05:00
|
|
|
} else {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(isa<CXXForRangeStmt>(CurStmt) &&
|
|
|
|
"Expected canonical for or range-based for loops.");
|
|
|
|
CurStmt = cast<CXXForRangeStmt>(CurStmt)->getBody();
|
2019-11-04 09:59:11 -05:00
|
|
|
}
|
2021-02-12 11:26:59 -08:00
|
|
|
CurStmt = OMPLoopBasedDirective::tryToFindNextInnerLoop(
|
|
|
|
CurStmt, TryImperfectlyNestedLoops);
|
2019-11-04 09:59:11 -05:00
|
|
|
}
|
2021-02-12 11:26:59 -08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void OMPLoopBasedDirective::doForAllLoopsBodies(
|
|
|
|
Stmt *CurStmt, bool TryImperfectlyNestedLoops, unsigned NumLoops,
|
|
|
|
llvm::function_ref<void(unsigned, Stmt *, Stmt *)> Callback) {
|
|
|
|
bool Res = OMPLoopBasedDirective::doForAllLoops(
|
|
|
|
CurStmt, TryImperfectlyNestedLoops, NumLoops,
|
|
|
|
[Callback](unsigned Cnt, Stmt *Loop) {
|
|
|
|
Stmt *Body = nullptr;
|
|
|
|
if (auto *For = dyn_cast<ForStmt>(Loop)) {
|
|
|
|
Body = For->getBody();
|
|
|
|
} else {
|
|
|
|
assert(isa<CXXForRangeStmt>(Loop) &&
|
|
|
|
"Expected canonical for or range-based for loops.");
|
|
|
|
Body = cast<CXXForRangeStmt>(Loop)->getBody();
|
|
|
|
}
|
2021-03-03 17:15:32 -06:00
|
|
|
if (auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(Body))
|
|
|
|
Body = CanonLoop->getLoopStmt();
|
2021-02-12 11:26:59 -08:00
|
|
|
Callback(Cnt, Loop, Body);
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
assert(Res && "Expected only loops");
|
|
|
|
(void)Res;
|
|
|
|
}
|
|
|
|
|
|
|
|
Stmt *OMPLoopDirective::getBody() {
|
|
|
|
// This relies on the loop form is already checked by Sema.
|
|
|
|
Stmt *Body = nullptr;
|
|
|
|
OMPLoopBasedDirective::doForAllLoopsBodies(
|
|
|
|
Data->getRawStmt(), /*TryImperfectlyNestedLoops=*/true,
|
|
|
|
NumAssociatedLoops,
|
|
|
|
[&Body](unsigned, Stmt *, Stmt *BodyStmt) { Body = BodyStmt; });
|
2019-11-04 09:59:11 -05:00
|
|
|
return Body;
|
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
void OMPLoopDirective::setCounters(ArrayRef<Expr *> A) {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(A.size() == getLoopsNumber() &&
|
2015-10-02 13:41:04 +00:00
|
|
|
"Number of loop counters is not the same as the collapsed number");
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
llvm::copy(A, getCounters().begin());
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void OMPLoopDirective::setPrivateCounters(ArrayRef<Expr *> A) {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(A.size() == getLoopsNumber() && "Number of loop private counters "
|
|
|
|
"is not the same as the collapsed "
|
|
|
|
"number");
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
llvm::copy(A, getPrivateCounters().begin());
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void OMPLoopDirective::setInits(ArrayRef<Expr *> A) {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(A.size() == getLoopsNumber() &&
|
2015-10-02 13:41:04 +00:00
|
|
|
"Number of counter inits is not the same as the collapsed number");
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
llvm::copy(A, getInits().begin());
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void OMPLoopDirective::setUpdates(ArrayRef<Expr *> A) {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(A.size() == getLoopsNumber() &&
|
2015-10-02 13:41:04 +00:00
|
|
|
"Number of counter updates is not the same as the collapsed number");
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
llvm::copy(A, getUpdates().begin());
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void OMPLoopDirective::setFinals(ArrayRef<Expr *> A) {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(A.size() == getLoopsNumber() &&
|
2015-10-02 13:41:04 +00:00
|
|
|
"Number of counter finals is not the same as the collapsed number");
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
llvm::copy(A, getFinals().begin());
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2019-08-14 19:30:06 +00:00
|
|
|
void OMPLoopDirective::setDependentCounters(ArrayRef<Expr *> A) {
|
|
|
|
assert(
|
2021-02-12 11:26:59 -08:00
|
|
|
A.size() == getLoopsNumber() &&
|
2019-08-14 19:30:06 +00:00
|
|
|
"Number of dependent counters is not the same as the collapsed number");
|
|
|
|
llvm::copy(A, getDependentCounters().begin());
|
|
|
|
}
|
|
|
|
|
|
|
|
void OMPLoopDirective::setDependentInits(ArrayRef<Expr *> A) {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(A.size() == getLoopsNumber() &&
|
2019-08-14 19:30:06 +00:00
|
|
|
"Number of dependent inits is not the same as the collapsed number");
|
|
|
|
llvm::copy(A, getDependentInits().begin());
|
|
|
|
}
|
|
|
|
|
|
|
|
void OMPLoopDirective::setFinalsConditions(ArrayRef<Expr *> A) {
|
2021-02-12 11:26:59 -08:00
|
|
|
assert(A.size() == getLoopsNumber() &&
|
2019-08-14 19:30:06 +00:00
|
|
|
"Number of finals conditions is not the same as the collapsed number");
|
|
|
|
llvm::copy(A, getFinalsConditions().begin());
|
|
|
|
}
|
|
|
|
|
2021-09-17 16:03:01 -05:00
|
|
|
OMPMetaDirective *OMPMetaDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt, Stmt *IfStmt) {
|
|
|
|
auto *Dir = createDirective<OMPMetaDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
|
|
|
|
Dir->setIfStmt(IfStmt);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPMetaDirective *OMPMetaDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPMetaDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true,
|
|
|
|
/*NumChildren=*/1);
|
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPParallelDirective *OMPParallelDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
|
|
|
|
bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPParallelDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelDirective *OMPParallelDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPParallelDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true,
|
|
|
|
/*NumChildren=*/1);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2024-07-23 07:31:42 -05:00
|
|
|
OMPSimdDirective *
|
|
|
|
OMPSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, unsigned CollapsedNum,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2015-10-02 13:41:04 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_simd), CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
OMPForDirective *OMPForDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
2024-07-23 07:31:42 -05:00
|
|
|
const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPForDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_for) + 1,
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
2021-10-06 10:02:27 -05:00
|
|
|
Stmt *OMPLoopTransformationDirective::getTransformedStmt() const {
|
|
|
|
switch (getStmtClass()) {
|
|
|
|
#define STMT(CLASS, PARENT)
|
|
|
|
#define ABSTRACT_STMT(CLASS)
|
|
|
|
#define OMPLOOPTRANSFORMATIONDIRECTIVE(CLASS, PARENT) \
|
|
|
|
case Stmt::CLASS##Class: \
|
|
|
|
return static_cast<const CLASS *>(this)->getTransformedStmt();
|
|
|
|
#include "clang/AST/StmtNodes.inc"
|
|
|
|
default:
|
|
|
|
llvm_unreachable("Not a loop transformation");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Stmt *OMPLoopTransformationDirective::getPreInits() const {
|
|
|
|
switch (getStmtClass()) {
|
|
|
|
#define STMT(CLASS, PARENT)
|
|
|
|
#define ABSTRACT_STMT(CLASS)
|
|
|
|
#define OMPLOOPTRANSFORMATIONDIRECTIVE(CLASS, PARENT) \
|
|
|
|
case Stmt::CLASS##Class: \
|
|
|
|
return static_cast<const CLASS *>(this)->getPreInits();
|
|
|
|
#include "clang/AST/StmtNodes.inc"
|
|
|
|
default:
|
|
|
|
llvm_unreachable("Not a loop transformation");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPForDirective *OMPForDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPForDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_for) + 1, CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2021-02-12 11:26:59 -08:00
|
|
|
OMPTileDirective *
|
|
|
|
OMPTileDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
|
|
|
|
unsigned NumLoops, Stmt *AssociatedStmt,
|
|
|
|
Stmt *TransformedStmt, Stmt *PreInits) {
|
|
|
|
OMPTileDirective *Dir = createDirective<OMPTileDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc,
|
|
|
|
NumLoops);
|
|
|
|
Dir->setTransformedStmt(TransformedStmt);
|
|
|
|
Dir->setPreInits(PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTileDirective *OMPTileDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned NumLoops) {
|
|
|
|
return createEmptyDirective<OMPTileDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
|
|
|
|
SourceLocation(), SourceLocation(), NumLoops);
|
|
|
|
}
|
|
|
|
|
2025-02-13 07:14:36 -05:00
|
|
|
OMPStripeDirective *
|
|
|
|
OMPStripeDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
|
|
|
|
unsigned NumLoops, Stmt *AssociatedStmt,
|
|
|
|
Stmt *TransformedStmt, Stmt *PreInits) {
|
|
|
|
OMPStripeDirective *Dir = createDirective<OMPStripeDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc,
|
|
|
|
NumLoops);
|
|
|
|
Dir->setTransformedStmt(TransformedStmt);
|
|
|
|
Dir->setPreInits(PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPStripeDirective *OMPStripeDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned NumLoops) {
|
|
|
|
return createEmptyDirective<OMPStripeDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
|
|
|
|
SourceLocation(), SourceLocation(), NumLoops);
|
|
|
|
}
|
|
|
|
|
2021-06-10 14:24:17 -05:00
|
|
|
OMPUnrollDirective *
|
|
|
|
OMPUnrollDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
|
2021-10-06 11:43:29 -05:00
|
|
|
Stmt *AssociatedStmt, unsigned NumGeneratedLoops,
|
|
|
|
Stmt *TransformedStmt, Stmt *PreInits) {
|
|
|
|
assert(NumGeneratedLoops <= 1 && "Unrolling generates at most one loop");
|
|
|
|
|
2021-06-10 14:24:17 -05:00
|
|
|
auto *Dir = createDirective<OMPUnrollDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc);
|
2021-10-06 11:43:29 -05:00
|
|
|
Dir->setNumGeneratedLoops(NumGeneratedLoops);
|
2021-06-10 14:24:17 -05:00
|
|
|
Dir->setTransformedStmt(TransformedStmt);
|
|
|
|
Dir->setPreInits(PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPUnrollDirective *OMPUnrollDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses) {
|
|
|
|
return createEmptyDirective<OMPUnrollDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
|
|
|
|
SourceLocation(), SourceLocation());
|
|
|
|
}
|
|
|
|
|
2024-07-18 10:35:32 +02:00
|
|
|
OMPReverseDirective *
|
|
|
|
OMPReverseDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, Stmt *AssociatedStmt,
|
|
|
|
Stmt *TransformedStmt, Stmt *PreInits) {
|
|
|
|
OMPReverseDirective *Dir = createDirective<OMPReverseDirective>(
|
2024-10-24 10:23:40 +01:00
|
|
|
C, {}, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc);
|
2024-07-18 10:35:32 +02:00
|
|
|
Dir->setTransformedStmt(TransformedStmt);
|
|
|
|
Dir->setPreInits(PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPReverseDirective *OMPReverseDirective::CreateEmpty(const ASTContext &C) {
|
|
|
|
return createEmptyDirective<OMPReverseDirective>(
|
|
|
|
C, /*NumClauses=*/0, /*HasAssociatedStmt=*/true,
|
|
|
|
TransformedStmtOffset + 1, SourceLocation(), SourceLocation());
|
|
|
|
}
|
|
|
|
|
2024-07-19 09:24:40 +02:00
|
|
|
OMPInterchangeDirective *OMPInterchangeDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, unsigned NumLoops, Stmt *AssociatedStmt,
|
|
|
|
Stmt *TransformedStmt, Stmt *PreInits) {
|
|
|
|
OMPInterchangeDirective *Dir = createDirective<OMPInterchangeDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, TransformedStmtOffset + 1, StartLoc, EndLoc,
|
|
|
|
NumLoops);
|
|
|
|
Dir->setTransformedStmt(TransformedStmt);
|
|
|
|
Dir->setPreInits(PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPInterchangeDirective *
|
|
|
|
OMPInterchangeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
unsigned NumLoops) {
|
|
|
|
return createEmptyDirective<OMPInterchangeDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, TransformedStmtOffset + 1,
|
|
|
|
SourceLocation(), SourceLocation(), NumLoops);
|
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPForSimdDirective *
|
|
|
|
OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, unsigned CollapsedNum,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPForSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_for_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2015-10-02 13:41:04 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPForSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_for_simd), CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPSectionsDirective *OMPSectionsDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
|
|
|
|
bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPSectionsDirective>(C, Clauses, AssociatedStmt,
|
|
|
|
/*NumChildren=*/1, StartLoc,
|
|
|
|
EndLoc);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPSectionsDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true,
|
|
|
|
/*NumChildren=*/1);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
Stmt *AssociatedStmt,
|
|
|
|
bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir =
|
2024-10-24 10:23:40 +01:00
|
|
|
createDirective<OMPSectionDirective>(C, {}, AssociatedStmt,
|
2022-01-09 00:19:49 -08:00
|
|
|
/*NumChildren=*/0, StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPSectionDirective *OMPSectionDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPSectionDirective>(C, /*NumClauses=*/0,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2023-08-09 15:28:09 -07:00
|
|
|
OMPScopeDirective *OMPScopeDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt) {
|
|
|
|
return createDirective<OMPScopeDirective>(C, Clauses, AssociatedStmt,
|
|
|
|
/*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPScopeDirective *OMPScopeDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPScopeDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPSingleDirective>(C, Clauses, AssociatedStmt,
|
|
|
|
/*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPSingleDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
Stmt *AssociatedStmt) {
|
2024-10-24 10:23:40 +01:00
|
|
|
return createDirective<OMPMasterDirective>(C, {}, AssociatedStmt,
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
/*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPMasterDirective>(C, /*NumClauses=*/0,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPCriticalDirective *OMPCriticalDirective::Create(
|
|
|
|
const ASTContext &C, const DeclarationNameInfo &Name,
|
2015-12-15 08:19:24 +00:00
|
|
|
SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPCriticalDirective>(C, Clauses, AssociatedStmt,
|
|
|
|
/*NumChildren=*/0, Name,
|
|
|
|
StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C,
|
2015-12-15 08:19:24 +00:00
|
|
|
unsigned NumClauses,
|
2015-10-02 13:41:04 +00:00
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPCriticalDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelForDirective *OMPParallelForDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPParallelForDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelForDirective *
|
|
|
|
OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPParallelForDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_for) + 1, CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPParallelForSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2015-10-02 13:41:04 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelForSimdDirective *
|
|
|
|
OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPParallelForSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_for_simd), CollapsedNum);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2019-12-05 13:43:48 -05:00
|
|
|
OMPParallelMasterDirective *OMPParallelMasterDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPParallelMasterDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2019-12-05 13:43:48 -05:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
OMPParallelMasterDirective *
|
|
|
|
OMPParallelMasterDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses, EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPParallelMasterDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
|
2019-12-05 13:43:48 -05:00
|
|
|
}
|
|
|
|
|
2022-06-16 16:32:30 -07:00
|
|
|
OMPParallelMaskedDirective *OMPParallelMaskedDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef) {
|
|
|
|
auto *Dir = createDirective<OMPParallelMaskedDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
|
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelMaskedDirective *
|
|
|
|
OMPParallelMaskedDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses, EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPParallelMaskedDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
|
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
|
|
|
|
bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPParallelSectionsDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelSectionsDirective *
|
|
|
|
OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPParallelSectionsDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskDirective *
|
|
|
|
OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTaskDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskDirective *OMPTaskDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTaskDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return new (C) OMPTaskyieldDirective(StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return new (C) OMPTaskyieldDirective();
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2024-08-05 12:37:07 +01:00
|
|
|
OMPAssumeDirective *OMPAssumeDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AStmt) {
|
|
|
|
return createDirective<OMPAssumeDirective>(C, Clauses, AStmt,
|
|
|
|
/*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPAssumeDirective *OMPAssumeDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPAssumeDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
|
|
|
}
|
|
|
|
|
2022-11-01 14:46:12 -07:00
|
|
|
OMPErrorDirective *OMPErrorDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses) {
|
|
|
|
return createDirective<OMPErrorDirective>(
|
|
|
|
C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPErrorDirective *OMPErrorDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPErrorDirective>(C, NumClauses);
|
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return new (C) OMPBarrierDirective(StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return new (C) OMPBarrierDirective();
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2021-11-19 05:59:40 -08:00
|
|
|
OMPTaskwaitDirective *
|
|
|
|
OMPTaskwaitDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses) {
|
|
|
|
return createDirective<OMPTaskwaitDirective>(
|
|
|
|
C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C,
|
2021-11-19 05:59:40 -08:00
|
|
|
unsigned NumClauses,
|
2015-10-02 13:41:04 +00:00
|
|
|
EmptyShell) {
|
2021-11-19 05:59:40 -08:00
|
|
|
return createEmptyDirective<OMPTaskwaitDirective>(C, NumClauses);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2017-07-18 20:17:46 +00:00
|
|
|
OMPTaskgroupDirective *OMPTaskgroupDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
2017-07-25 15:53:26 +00:00
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *ReductionRef) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTaskgroupDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
|
2017-07-25 15:53:26 +00:00
|
|
|
Dir->setReductionRef(ReductionRef);
|
2015-10-02 13:41:04 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C,
|
2017-07-18 20:17:46 +00:00
|
|
|
unsigned NumClauses,
|
2015-10-02 13:41:04 +00:00
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTaskgroupDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPCancellationPointDirective *OMPCancellationPointDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
OpenMPDirectiveKind CancelRegion) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = new (C) OMPCancellationPointDirective(StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setCancelRegion(CancelRegion);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPCancellationPointDirective *
|
|
|
|
OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return new (C) OMPCancellationPointDirective();
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPCancelDirective *
|
|
|
|
OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
|
|
|
|
OpenMPDirectiveKind CancelRegion) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPCancelDirective>(
|
|
|
|
C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
Dir->setCancelRegion(CancelRegion);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPCancelDirective>(C, NumClauses);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPFlushDirective>(
|
|
|
|
C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPFlushDirective>(C, NumClauses);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2020-02-28 09:52:15 -05:00
|
|
|
OMPDepobjDirective *OMPDepobjDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPDepobjDirective>(
|
|
|
|
C, Clauses, /*AssociatedStmt=*/nullptr,
|
|
|
|
/*NumChildren=*/0, StartLoc, EndLoc);
|
2020-02-28 09:52:15 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPDepobjDirective *OMPDepobjDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPDepobjDirective>(C, NumClauses);
|
2020-02-28 09:52:15 -05:00
|
|
|
}
|
|
|
|
|
2020-03-20 07:03:01 -04:00
|
|
|
OMPScanDirective *OMPScanDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPScanDirective>(C, Clauses,
|
|
|
|
/*AssociatedStmt=*/nullptr,
|
|
|
|
/*NumChildren=*/0, StartLoc, EndLoc);
|
2020-03-20 07:03:01 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPScanDirective *OMPScanDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPScanDirective>(C, NumClauses);
|
2020-03-20 07:03:01 -04:00
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPOrderedDirective>(
|
|
|
|
C, Clauses, cast_or_null<CapturedStmt>(AssociatedStmt),
|
|
|
|
/*NumChildren=*/0, StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
bool IsStandalone,
|
2015-10-02 13:41:04 +00:00
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPOrderedDirective>(C, NumClauses,
|
|
|
|
!IsStandalone);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2022-02-22 12:59:56 -05:00
|
|
|
OMPAtomicDirective *
|
|
|
|
OMPAtomicDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
|
2022-04-15 11:39:04 -04:00
|
|
|
Stmt *AssociatedStmt, Expressions Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPAtomicDirective>(
|
2022-06-02 21:38:12 -04:00
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/7, StartLoc, EndLoc);
|
2022-04-15 11:39:04 -04:00
|
|
|
Dir->setX(Exprs.X);
|
|
|
|
Dir->setV(Exprs.V);
|
2022-06-02 21:38:12 -04:00
|
|
|
Dir->setR(Exprs.R);
|
2022-04-15 11:39:04 -04:00
|
|
|
Dir->setExpr(Exprs.E);
|
|
|
|
Dir->setUpdateExpr(Exprs.UE);
|
|
|
|
Dir->setD(Exprs.D);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
2022-04-15 21:34:19 -04:00
|
|
|
Dir->Flags.IsXLHSInRHSPart = Exprs.IsXLHSInRHSPart ? 1 : 0;
|
|
|
|
Dir->Flags.IsPostfixUpdate = Exprs.IsPostfixUpdate ? 1 : 0;
|
2022-06-02 21:38:12 -04:00
|
|
|
Dir->Flags.IsFailOnly = Exprs.IsFailOnly ? 1 : 0;
|
2015-10-02 13:41:04 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPAtomicDirective>(
|
2022-06-02 21:38:12 -04:00
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/7);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPTargetDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2016-01-26 18:48:41 +00:00
|
|
|
OMPTargetParallelDirective *OMPTargetParallelDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *TaskRedRef,
|
|
|
|
bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetParallelDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/1, StartLoc, EndLoc);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2020-04-27 11:37:35 -04:00
|
|
|
Dir->setHasCancel(HasCancel);
|
2016-01-26 18:48:41 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetParallelDirective *
|
|
|
|
OMPTargetParallelDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetParallelDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true, /*NumChildren=*/1);
|
2016-01-26 18:48:41 +00:00
|
|
|
}
|
|
|
|
|
2016-02-03 15:46:42 +00:00
|
|
|
OMPTargetParallelForDirective *OMPTargetParallelForDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetParallelForDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1, StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
2016-02-03 15:46:42 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2016-02-03 15:46:42 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2016-02-03 15:46:42 +00:00
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetParallelForDirective *
|
|
|
|
OMPTargetParallelForDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetParallelForDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_parallel_for) + 1,
|
|
|
|
CollapsedNum);
|
2016-02-03 15:46:42 +00:00
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPTargetDataDirective *OMPTargetDataDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPTargetDataDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned N,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetDataDirective>(
|
|
|
|
C, N, /*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
2016-01-19 19:15:56 +00:00
|
|
|
OMPTargetEnterDataDirective *OMPTargetEnterDataDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
2017-11-21 17:08:48 +00:00
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPTargetEnterDataDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
|
2016-01-19 19:15:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetEnterDataDirective *
|
|
|
|
OMPTargetEnterDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetEnterDataDirective>(
|
|
|
|
C, N, /*HasAssociatedStmt=*/true);
|
2016-01-19 19:15:56 +00:00
|
|
|
}
|
|
|
|
|
2017-11-21 17:08:48 +00:00
|
|
|
OMPTargetExitDataDirective *OMPTargetExitDataDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPTargetExitDataDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
|
2016-01-19 20:04:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetExitDataDirective *
|
|
|
|
OMPTargetExitDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetExitDataDirective>(
|
|
|
|
C, N, /*HasAssociatedStmt=*/true);
|
2016-01-19 20:04:50 +00:00
|
|
|
}
|
|
|
|
|
2015-10-02 13:41:04 +00:00
|
|
|
OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPTeamsDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTeamsDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
2015-10-02 13:41:04 +00:00
|
|
|
}
|
2015-12-01 04:18:41 +00:00
|
|
|
|
|
|
|
OMPTaskLoopDirective *OMPTaskLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
2020-02-12 16:12:53 -05:00
|
|
|
const HelperExprs &Exprs, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTaskLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_taskloop),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2015-12-01 04:18:41 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2015-12-01 04:18:41 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2020-02-12 16:12:53 -05:00
|
|
|
Dir->setHasCancel(HasCancel);
|
2015-12-01 04:18:41 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTaskLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_taskloop), CollapsedNum);
|
2015-12-01 04:18:41 +00:00
|
|
|
}
|
|
|
|
|
2015-12-03 09:40:15 +00:00
|
|
|
OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTaskLoopSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_taskloop_simd), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2015-12-03 09:40:15 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2015-12-03 09:40:15 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2015-12-03 09:40:15 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTaskLoopSimdDirective *
|
|
|
|
OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTaskLoopSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_taskloop_simd), CollapsedNum);
|
2015-12-03 09:40:15 +00:00
|
|
|
}
|
|
|
|
|
2019-10-10 20:13:02 +00:00
|
|
|
OMPMasterTaskLoopDirective *OMPMasterTaskLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
2020-02-12 16:12:53 -05:00
|
|
|
const HelperExprs &Exprs, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPMasterTaskLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_master_taskloop), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2019-10-10 20:13:02 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2020-02-12 16:12:53 -05:00
|
|
|
Dir->setHasCancel(HasCancel);
|
2019-10-10 20:13:02 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPMasterTaskLoopDirective *
|
|
|
|
OMPMasterTaskLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPMasterTaskLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_master_taskloop), CollapsedNum);
|
2019-10-10 20:13:02 +00:00
|
|
|
}
|
|
|
|
|
2022-06-24 08:42:21 -07:00
|
|
|
OMPMaskedTaskLoopDirective *OMPMaskedTaskLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs, bool HasCancel) {
|
|
|
|
auto *Dir = createDirective<OMPMaskedTaskLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_masked_taskloop), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPMaskedTaskLoopDirective *
|
|
|
|
OMPMaskedTaskLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPMaskedTaskLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_masked_taskloop), CollapsedNum);
|
|
|
|
}
|
|
|
|
|
2019-10-18 16:47:35 +00:00
|
|
|
OMPMasterTaskLoopSimdDirective *OMPMasterTaskLoopSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPMasterTaskLoopSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
2019-10-18 16:47:35 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPMasterTaskLoopSimdDirective *
|
|
|
|
OMPMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPMasterTaskLoopSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_master_taskloop_simd), CollapsedNum);
|
2019-10-18 16:47:35 +00:00
|
|
|
}
|
|
|
|
|
2022-06-28 14:35:43 -07:00
|
|
|
OMPMaskedTaskLoopSimdDirective *OMPMaskedTaskLoopSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
|
|
|
auto *Dir = createDirective<OMPMaskedTaskLoopSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_masked_taskloop_simd), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPMaskedTaskLoopSimdDirective *
|
|
|
|
OMPMaskedTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPMaskedTaskLoopSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_masked_taskloop_simd), CollapsedNum);
|
|
|
|
}
|
|
|
|
|
2019-10-14 17:17:41 +00:00
|
|
|
OMPParallelMasterTaskLoopDirective *OMPParallelMasterTaskLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
2020-02-12 16:12:53 -05:00
|
|
|
const HelperExprs &Exprs, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPParallelMasterTaskLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
2019-10-14 17:17:41 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2020-02-12 16:12:53 -05:00
|
|
|
Dir->setHasCancel(HasCancel);
|
2019-10-14 17:17:41 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelMasterTaskLoopDirective *
|
|
|
|
OMPParallelMasterTaskLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPParallelMasterTaskLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop),
|
|
|
|
CollapsedNum);
|
2019-10-14 17:17:41 +00:00
|
|
|
}
|
|
|
|
|
2022-06-30 10:59:33 -07:00
|
|
|
OMPParallelMaskedTaskLoopDirective *OMPParallelMaskedTaskLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs, bool HasCancel) {
|
|
|
|
auto *Dir = createDirective<OMPParallelMaskedTaskLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
Dir->setHasCancel(HasCancel);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelMaskedTaskLoopDirective *
|
|
|
|
OMPParallelMaskedTaskLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPParallelMaskedTaskLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop),
|
|
|
|
CollapsedNum);
|
|
|
|
}
|
|
|
|
|
2019-10-25 10:27:13 -04:00
|
|
|
OMPParallelMasterTaskLoopSimdDirective *
|
|
|
|
OMPParallelMasterTaskLoopSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPParallelMasterTaskLoopSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2019-10-25 10:27:13 -04:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelMasterTaskLoopSimdDirective *
|
|
|
|
OMPParallelMasterTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPParallelMasterTaskLoopSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_master_taskloop_simd),
|
|
|
|
CollapsedNum);
|
2019-10-25 10:27:13 -04:00
|
|
|
}
|
|
|
|
|
2022-06-30 17:08:17 -07:00
|
|
|
OMPParallelMaskedTaskLoopSimdDirective *
|
|
|
|
OMPParallelMaskedTaskLoopSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
|
|
|
auto *Dir = createDirective<OMPParallelMaskedTaskLoopSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelMaskedTaskLoopSimdDirective *
|
|
|
|
OMPParallelMaskedTaskLoopSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPParallelMaskedTaskLoopSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_masked_taskloop_simd),
|
|
|
|
CollapsedNum);
|
|
|
|
}
|
|
|
|
|
2024-07-23 07:31:42 -05:00
|
|
|
OMPDistributeDirective *
|
|
|
|
OMPDistributeDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc, unsigned CollapsedNum,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt, const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPDistributeDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2015-12-14 14:51:25 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
2016-05-25 12:36:08 +00:00
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2015-12-14 14:51:25 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-03-29 08:58:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2015-12-14 14:51:25 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPDistributeDirective *
|
|
|
|
OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPDistributeDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute), CollapsedNum);
|
2015-12-14 14:51:25 +00:00
|
|
|
}
|
2016-05-26 17:30:50 +00:00
|
|
|
|
2017-11-21 17:08:48 +00:00
|
|
|
OMPTargetUpdateDirective *OMPTargetUpdateDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPTargetUpdateDirective>(C, Clauses, AssociatedStmt,
|
|
|
|
/*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
2016-05-26 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetUpdateDirective *
|
|
|
|
OMPTargetUpdateDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetUpdateDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true);
|
2016-05-26 17:30:50 +00:00
|
|
|
}
|
2016-06-27 14:55:37 +00:00
|
|
|
|
|
|
|
OMPDistributeParallelForDirective *OMPDistributeParallelForDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPDistributeParallelForDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1, StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
2016-06-27 14:55:37 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
2017-02-17 21:29:13 +00:00
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2016-06-27 14:55:37 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-06-27 14:55:37 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2017-04-20 00:39:39 +00:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
2018-10-29 15:45:47 +00:00
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2017-11-22 20:19:50 +00:00
|
|
|
Dir->HasCancel = HasCancel;
|
2016-06-27 14:55:37 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPDistributeParallelForDirective *
|
|
|
|
OMPDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPDistributeParallelForDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for) + 1,
|
|
|
|
CollapsedNum);
|
2016-06-27 14:55:37 +00:00
|
|
|
}
|
2016-07-05 05:00:15 +00:00
|
|
|
|
|
|
|
OMPDistributeParallelForSimdDirective *
|
|
|
|
OMPDistributeParallelForSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPDistributeParallelForSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2016-07-05 05:00:15 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
2017-02-17 21:29:13 +00:00
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2016-07-05 05:00:15 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-07-05 05:00:15 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2017-04-20 00:39:39 +00:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
2018-10-29 15:45:47 +00:00
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
2016-07-05 05:00:15 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPDistributeParallelForSimdDirective *
|
|
|
|
OMPDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPDistributeParallelForSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd),
|
|
|
|
CollapsedNum);
|
2016-07-05 05:00:15 +00:00
|
|
|
}
|
2016-07-06 04:45:38 +00:00
|
|
|
|
|
|
|
OMPDistributeSimdDirective *OMPDistributeSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPDistributeSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute_simd), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2016-07-06 04:45:38 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-07-06 04:45:38 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPDistributeSimdDirective *
|
|
|
|
OMPDistributeSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPDistributeSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_distribute_simd), CollapsedNum);
|
2016-07-06 04:45:38 +00:00
|
|
|
}
|
2016-07-14 02:54:56 +00:00
|
|
|
|
|
|
|
OMPTargetParallelForSimdDirective *OMPTargetParallelForSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetParallelForSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
2016-07-14 02:54:56 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-07-14 02:54:56 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetParallelForSimdDirective *
|
|
|
|
OMPTargetParallelForSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetParallelForSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd),
|
|
|
|
CollapsedNum);
|
2016-07-14 02:54:56 +00:00
|
|
|
}
|
2016-07-20 22:57:10 +00:00
|
|
|
|
|
|
|
OMPTargetSimdDirective *
|
2018-07-30 19:24:48 +00:00
|
|
|
OMPTargetSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
2016-07-20 22:57:10 +00:00
|
|
|
SourceLocation EndLoc, unsigned CollapsedNum,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt, const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_simd), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2016-07-20 22:57:10 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-07-20 22:57:10 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetSimdDirective *
|
|
|
|
OMPTargetSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_simd), CollapsedNum);
|
2016-07-20 22:57:10 +00:00
|
|
|
}
|
2016-08-05 14:37:37 +00:00
|
|
|
|
|
|
|
OMPTeamsDistributeDirective *OMPTeamsDistributeDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTeamsDistributeDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
2016-08-05 14:37:37 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-08-05 14:37:37 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTeamsDistributeDirective *
|
|
|
|
OMPTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTeamsDistributeDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute), CollapsedNum);
|
2016-08-05 14:37:37 +00:00
|
|
|
}
|
2016-10-25 12:50:55 +00:00
|
|
|
|
|
|
|
OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTeamsDistributeSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
2016-10-25 12:50:55 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-10-25 12:50:55 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::CreateEmpty(
|
|
|
|
const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTeamsDistributeSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd), CollapsedNum);
|
2016-10-25 12:50:55 +00:00
|
|
|
}
|
2016-11-30 23:51:03 +00:00
|
|
|
|
|
|
|
OMPTeamsDistributeParallelForSimdDirective *
|
|
|
|
OMPTeamsDistributeParallelForSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTeamsDistributeParallelForSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2016-11-30 23:51:03 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
2017-02-17 21:29:13 +00:00
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2016-11-30 23:51:03 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-11-30 23:51:03 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2017-04-20 00:39:39 +00:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
2018-10-29 15:45:47 +00:00
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
2016-11-30 23:51:03 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTeamsDistributeParallelForSimdDirective *
|
|
|
|
OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTeamsDistributeParallelForSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for_simd),
|
|
|
|
CollapsedNum);
|
2016-11-30 23:51:03 +00:00
|
|
|
}
|
2016-12-09 03:24:30 +00:00
|
|
|
|
|
|
|
OMPTeamsDistributeParallelForDirective *
|
|
|
|
OMPTeamsDistributeParallelForDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTeamsDistributeParallelForDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1,
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2016-12-09 03:24:30 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
2017-02-17 21:29:13 +00:00
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2016-12-09 03:24:30 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-12-09 03:24:30 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2017-04-20 00:39:39 +00:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
2018-10-29 15:45:47 +00:00
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2017-11-22 20:19:50 +00:00
|
|
|
Dir->HasCancel = HasCancel;
|
2016-12-09 03:24:30 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTeamsDistributeParallelForDirective *
|
|
|
|
OMPTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTeamsDistributeParallelForDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for) + 1,
|
|
|
|
CollapsedNum);
|
2016-12-09 03:24:30 +00:00
|
|
|
}
|
|
|
|
|
2016-12-17 05:48:59 +00:00
|
|
|
OMPTargetTeamsDirective *OMPTargetTeamsDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createDirective<OMPTargetTeamsDirective>(C, Clauses, AssociatedStmt,
|
|
|
|
/*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
2016-12-17 05:48:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetTeamsDirective *
|
|
|
|
OMPTargetTeamsDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetTeamsDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true);
|
2016-12-17 05:48:59 +00:00
|
|
|
}
|
2016-12-25 04:52:54 +00:00
|
|
|
|
|
|
|
OMPTargetTeamsDistributeDirective *OMPTargetTeamsDistributeDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetTeamsDistributeDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_distribute), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
2016-12-25 04:52:54 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-12-25 04:52:54 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetTeamsDistributeDirective *
|
|
|
|
OMPTargetTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetTeamsDistributeDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_distribute),
|
|
|
|
CollapsedNum);
|
2016-12-25 04:52:54 +00:00
|
|
|
}
|
2016-12-29 22:16:30 +00:00
|
|
|
|
|
|
|
OMPTargetTeamsDistributeParallelForDirective *
|
|
|
|
OMPTargetTeamsDistributeParallelForDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
const HelperExprs &Exprs, Expr *TaskRedRef, bool HasCancel) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) +
|
|
|
|
1,
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2016-12-29 22:16:30 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
2017-02-17 21:29:13 +00:00
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2016-12-29 22:16:30 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2016-12-29 22:16:30 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2017-04-20 00:39:39 +00:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
2018-10-29 15:45:47 +00:00
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
[OPENMP50]Codegen for reduction clauses with 'task' modifier.
Summary:
Added codegen for reduction clause with task modifier.
```
#pragma omp ... reduction(task, +: a)
{
#pragma omp ... in_reduction(+: a)
}
```
is translated into something like this:
```
#pragma omp ... reduction(+:a)
{
struct red_input_t {
void *reduce_shar;
void *reduce_orig;
size_t reduce_size;
void *reduce_init;
void *reduce_fini;
void *reduce_comb;
unsigned flags;
} r_var;
r_var.reduce_shar = &a;
r_var.reduce_orig = &original a;
r_var.reduce_size = sizeof(a);
r_var.reduce_init = [](void* l,void*){return *(int*)l=0;};
r_var.reduce_fini = nullptr;
r_var.reduce_comb = [](void* l,void* r){return *(int*)l += *(int)r;};
void *tg = __kmpc_taskred_modifier_init(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>,
<1 - number of reduction elements>,
&r_var);
{
#pragma omp ... in_reduction(+: a) firstprivate(tg)
...
}
__kmpc_task_reduction_modifier_fini(<loc_addr>,<gtid>,
<flag - 0 for parallel, 1 for worksharing>);
}
```
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79034
2020-04-24 09:56:29 -04:00
|
|
|
Dir->setTaskReductionRefExpr(TaskRedRef);
|
2017-11-22 21:12:03 +00:00
|
|
|
Dir->HasCancel = HasCancel;
|
2016-12-29 22:16:30 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetTeamsDistributeParallelForDirective *
|
|
|
|
OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetTeamsDistributeParallelForDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_parallel_for) +
|
|
|
|
1,
|
|
|
|
CollapsedNum);
|
2016-12-29 22:16:30 +00:00
|
|
|
}
|
2017-01-03 05:23:48 +00:00
|
|
|
|
|
|
|
OMPTargetTeamsDistributeParallelForSimdDirective *
|
|
|
|
OMPTargetTeamsDistributeParallelForSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetTeamsDistributeParallelForSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum,
|
|
|
|
OMPD_target_teams_distribute_parallel_for_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2017-01-03 05:23:48 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
2017-02-17 21:29:13 +00:00
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2017-01-03 05:23:48 +00:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2017-01-03 05:23:48 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2017-04-20 00:39:39 +00:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
2018-10-29 15:45:47 +00:00
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
2017-01-03 05:23:48 +00:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetTeamsDistributeParallelForSimdDirective *
|
|
|
|
OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty(
|
|
|
|
const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetTeamsDistributeParallelForSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum,
|
|
|
|
OMPD_target_teams_distribute_parallel_for_simd),
|
|
|
|
CollapsedNum);
|
2017-01-03 05:23:48 +00:00
|
|
|
}
|
|
|
|
|
2017-01-10 18:08:18 +00:00
|
|
|
OMPTargetTeamsDistributeSimdDirective *
|
|
|
|
OMPTargetTeamsDistributeSimdDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
auto *Dir = createDirective<OMPTargetTeamsDistributeSimdDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
2017-01-10 18:08:18 +00:00
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
2019-08-14 19:30:06 +00:00
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
2017-01-10 18:08:18 +00:00
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetTeamsDistributeSimdDirective *
|
|
|
|
OMPTargetTeamsDistributeSimdDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
[OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation.
Summary:
Introduced OMPChildren class to handle all associated clauses, statement
and child expressions/statements. It allows to represent some directives
more correctly (like flush, depobj etc. with pseudo clauses, ordered
depend directives, which are standalone, and target data directives).
Also, it will make easier to avoid using of CapturedStmt in directives,
if required (atomic, tile etc. directives).
Also, it simplifies serialization/deserialization of the
executable/declarative directives.
Reduces number of allocation operations for mapper declarations.
Reviewers: jdoerfert
Subscribers: yaxunl, guansong, jfb, cfe-commits, sstefan1, aaron.ballman, caomhin
Tags: #clang
Differential Revision: https://reviews.llvm.org/D83261
2020-06-26 17:42:31 -04:00
|
|
|
return createEmptyDirective<OMPTargetTeamsDistributeSimdDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd),
|
|
|
|
CollapsedNum);
|
2017-01-10 18:08:18 +00:00
|
|
|
}
|
2021-03-15 13:09:46 -07:00
|
|
|
|
|
|
|
OMPInteropDirective *
|
|
|
|
OMPInteropDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses) {
|
|
|
|
return createDirective<OMPInteropDirective>(
|
|
|
|
C, Clauses, /*AssociatedStmt=*/nullptr, /*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPInteropDirective *OMPInteropDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPInteropDirective>(C, NumClauses);
|
|
|
|
}
|
2021-03-22 18:13:29 -07:00
|
|
|
|
|
|
|
OMPDispatchDirective *OMPDispatchDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
SourceLocation TargetCallLoc) {
|
|
|
|
auto *Dir = createDirective<OMPDispatchDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, /*NumChildren=*/0, StartLoc, EndLoc);
|
|
|
|
Dir->setTargetCallLoc(TargetCallLoc);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPDispatchDirective *OMPDispatchDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPDispatchDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true,
|
|
|
|
/*NumChildren=*/0);
|
|
|
|
}
|
2021-04-09 14:00:36 -05:00
|
|
|
|
|
|
|
OMPMaskedDirective *OMPMaskedDirective::Create(const ASTContext &C,
|
|
|
|
SourceLocation StartLoc,
|
|
|
|
SourceLocation EndLoc,
|
|
|
|
ArrayRef<OMPClause *> Clauses,
|
|
|
|
Stmt *AssociatedStmt) {
|
|
|
|
return createDirective<OMPMaskedDirective>(C, Clauses, AssociatedStmt,
|
|
|
|
/*NumChildren=*/0, StartLoc,
|
|
|
|
EndLoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPMaskedDirective *OMPMaskedDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPMaskedDirective>(C, NumClauses,
|
|
|
|
/*HasAssociatedStmt=*/true);
|
|
|
|
}
|
2021-10-28 08:10:40 -07:00
|
|
|
|
|
|
|
OMPGenericLoopDirective *OMPGenericLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
|
|
|
auto *Dir = createDirective<OMPGenericLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt, numLoopChildren(CollapsedNum, OMPD_loop),
|
|
|
|
StartLoc, EndLoc, CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPGenericLoopDirective *
|
|
|
|
OMPGenericLoopDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPGenericLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_loop), CollapsedNum);
|
|
|
|
}
|
2022-03-15 08:35:59 -07:00
|
|
|
|
|
|
|
OMPTeamsGenericLoopDirective *OMPTeamsGenericLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
|
|
|
auto *Dir = createDirective<OMPTeamsGenericLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_loop), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2023-07-01 19:10:28 -05:00
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2022-03-15 08:35:59 -07:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2023-07-01 19:10:28 -05:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
2022-03-15 08:35:59 -07:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTeamsGenericLoopDirective *
|
|
|
|
OMPTeamsGenericLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum, EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPTeamsGenericLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_teams_loop), CollapsedNum);
|
|
|
|
}
|
2022-03-18 11:02:02 -07:00
|
|
|
|
|
|
|
OMPTargetTeamsGenericLoopDirective *OMPTargetTeamsGenericLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
2024-04-10 13:09:17 -07:00
|
|
|
const HelperExprs &Exprs, bool CanBeParallelFor) {
|
2022-03-18 11:02:02 -07:00
|
|
|
auto *Dir = createDirective<OMPTargetTeamsGenericLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_loop), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
2023-07-01 19:10:28 -05:00
|
|
|
Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
|
|
|
|
Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
|
|
|
|
Dir->setDistInc(Exprs.DistInc);
|
|
|
|
Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
|
2022-03-18 11:02:02 -07:00
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
2023-07-01 19:10:28 -05:00
|
|
|
Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
|
|
|
|
Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
|
|
|
|
Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
|
|
|
|
Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
|
|
|
|
Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
|
|
|
|
Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
|
|
|
|
Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
|
|
|
|
Dir->setCombinedDistCond(Exprs.DistCombinedFields.DistCond);
|
|
|
|
Dir->setCombinedParForInDistCond(Exprs.DistCombinedFields.ParForInDistCond);
|
2024-04-10 13:09:17 -07:00
|
|
|
Dir->setCanBeParallelFor(CanBeParallelFor);
|
2022-03-18 11:02:02 -07:00
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetTeamsGenericLoopDirective *
|
|
|
|
OMPTargetTeamsGenericLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPTargetTeamsGenericLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_teams_loop), CollapsedNum);
|
|
|
|
}
|
2022-03-22 10:55:21 -07:00
|
|
|
|
|
|
|
OMPParallelGenericLoopDirective *OMPParallelGenericLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
|
|
|
auto *Dir = createDirective<OMPParallelGenericLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_loop), StartLoc, EndLoc,
|
|
|
|
CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPParallelGenericLoopDirective *OMPParallelGenericLoopDirective::CreateEmpty(
|
|
|
|
const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPParallelGenericLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_parallel_loop), CollapsedNum);
|
|
|
|
}
|
2022-03-23 15:37:06 -07:00
|
|
|
|
|
|
|
OMPTargetParallelGenericLoopDirective *
|
|
|
|
OMPTargetParallelGenericLoopDirective::Create(
|
|
|
|
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
|
|
|
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
|
|
|
const HelperExprs &Exprs) {
|
|
|
|
auto *Dir = createDirective<OMPTargetParallelGenericLoopDirective>(
|
|
|
|
C, Clauses, AssociatedStmt,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_parallel_loop), StartLoc,
|
|
|
|
EndLoc, CollapsedNum);
|
|
|
|
Dir->setIterationVariable(Exprs.IterationVarRef);
|
|
|
|
Dir->setLastIteration(Exprs.LastIteration);
|
|
|
|
Dir->setCalcLastIteration(Exprs.CalcLastIteration);
|
|
|
|
Dir->setPreCond(Exprs.PreCond);
|
|
|
|
Dir->setCond(Exprs.Cond);
|
|
|
|
Dir->setInit(Exprs.Init);
|
|
|
|
Dir->setInc(Exprs.Inc);
|
|
|
|
Dir->setIsLastIterVariable(Exprs.IL);
|
|
|
|
Dir->setLowerBoundVariable(Exprs.LB);
|
|
|
|
Dir->setUpperBoundVariable(Exprs.UB);
|
|
|
|
Dir->setStrideVariable(Exprs.ST);
|
|
|
|
Dir->setEnsureUpperBound(Exprs.EUB);
|
|
|
|
Dir->setNextLowerBound(Exprs.NLB);
|
|
|
|
Dir->setNextUpperBound(Exprs.NUB);
|
|
|
|
Dir->setNumIterations(Exprs.NumIterations);
|
|
|
|
Dir->setCounters(Exprs.Counters);
|
|
|
|
Dir->setPrivateCounters(Exprs.PrivateCounters);
|
|
|
|
Dir->setInits(Exprs.Inits);
|
|
|
|
Dir->setUpdates(Exprs.Updates);
|
|
|
|
Dir->setFinals(Exprs.Finals);
|
|
|
|
Dir->setDependentCounters(Exprs.DependentCounters);
|
|
|
|
Dir->setDependentInits(Exprs.DependentInits);
|
|
|
|
Dir->setFinalsConditions(Exprs.FinalsConditions);
|
|
|
|
Dir->setPreInits(Exprs.PreInits);
|
|
|
|
return Dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
OMPTargetParallelGenericLoopDirective *
|
|
|
|
OMPTargetParallelGenericLoopDirective::CreateEmpty(const ASTContext &C,
|
|
|
|
unsigned NumClauses,
|
|
|
|
unsigned CollapsedNum,
|
|
|
|
EmptyShell) {
|
|
|
|
return createEmptyDirective<OMPTargetParallelGenericLoopDirective>(
|
|
|
|
C, NumClauses, /*HasAssociatedStmt=*/true,
|
|
|
|
numLoopChildren(CollapsedNum, OMPD_target_parallel_loop), CollapsedNum);
|
|
|
|
}
|