forked from OSchip/llvm-project
[OPENMP] Emit __kmpc_cancel_barrier() and code for 'cancellation point' only if 'cancel' is found.
Patch improves codegen for OpenMP constructs. If the OpenMP region does not have internal 'cancel' construct, a call to 'void __kmpc_barrier()' runtime function is generated for all implicit/explicit barriers. If the region has inner 'cancel' directive, then ``` if (__kmpc_cancel_barrier()) exit from outer construct; ``` code is generated. Also, the code for 'canellation point' directive is not generated if parent directive does not have 'cancel' directive. llvm-svn: 247681
This commit is contained in:
parent
7d4038dc5a
commit
25e5b44654
|
@ -230,6 +230,10 @@ public:
|
|||
/// variables 'c' and 'd'.
|
||||
///
|
||||
class OMPParallelDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
/// \brief true if the construct has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive (directive keyword).
|
||||
|
@ -238,7 +242,8 @@ class OMPParallelDirective : public OMPExecutableDirective {
|
|||
OMPParallelDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel,
|
||||
StartLoc, EndLoc, NumClauses, 1) {}
|
||||
StartLoc, EndLoc, NumClauses, 1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
|
@ -247,7 +252,11 @@ class OMPParallelDirective : public OMPExecutableDirective {
|
|||
explicit OMPParallelDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel,
|
||||
SourceLocation(), SourceLocation(), NumClauses,
|
||||
1) {}
|
||||
1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
|
@ -257,10 +266,11 @@ public:
|
|||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement associated with the directive.
|
||||
/// \param HasCancel true if this directive has inner cancel directive.
|
||||
///
|
||||
static OMPParallelDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt);
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a N clauses.
|
||||
///
|
||||
|
@ -270,6 +280,9 @@ public:
|
|||
static OMPParallelDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned NumClauses, EmptyShell);
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPParallelDirectiveClass;
|
||||
}
|
||||
|
@ -732,6 +745,10 @@ public:
|
|||
///
|
||||
class OMPForDirective : public OMPLoopDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// \brief true if current directive has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
|
@ -742,7 +759,8 @@ class OMPForDirective : public OMPLoopDirective {
|
|||
OMPForDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPForDirectiveClass, OMPD_for, StartLoc, EndLoc,
|
||||
CollapsedNum, NumClauses) {}
|
||||
CollapsedNum, NumClauses),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
|
@ -751,7 +769,11 @@ class OMPForDirective : public OMPLoopDirective {
|
|||
///
|
||||
explicit OMPForDirective(unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPForDirectiveClass, OMPD_for, SourceLocation(),
|
||||
SourceLocation(), CollapsedNum, NumClauses) {}
|
||||
SourceLocation(), CollapsedNum, NumClauses),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
|
@ -763,12 +785,13 @@ public:
|
|||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
/// \param HasCancel true if current directive has inner cancel directive.
|
||||
///
|
||||
static OMPForDirective *Create(const ASTContext &C, SourceLocation StartLoc,
|
||||
SourceLocation EndLoc, unsigned CollapsedNum,
|
||||
ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt,
|
||||
const HelperExprs &Exprs);
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs,
|
||||
bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive with the place
|
||||
/// for \a NumClauses clauses.
|
||||
|
@ -780,6 +803,9 @@ public:
|
|||
static OMPForDirective *CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
||||
unsigned CollapsedNum, EmptyShell);
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPForDirectiveClass;
|
||||
}
|
||||
|
@ -861,6 +887,10 @@ public:
|
|||
///
|
||||
class OMPSectionsDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// \brief true if current directive has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
|
@ -870,7 +900,8 @@ class OMPSectionsDirective : public OMPExecutableDirective {
|
|||
OMPSectionsDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPSectionsDirectiveClass, OMPD_sections,
|
||||
StartLoc, EndLoc, NumClauses, 1) {}
|
||||
StartLoc, EndLoc, NumClauses, 1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
|
@ -879,7 +910,11 @@ class OMPSectionsDirective : public OMPExecutableDirective {
|
|||
explicit OMPSectionsDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPSectionsDirectiveClass, OMPD_sections,
|
||||
SourceLocation(), SourceLocation(), NumClauses,
|
||||
1) {}
|
||||
1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
|
@ -889,10 +924,11 @@ public:
|
|||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param HasCancel true if current directive has inner directive.
|
||||
///
|
||||
static OMPSectionsDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt);
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a NumClauses
|
||||
/// clauses.
|
||||
|
@ -903,6 +939,9 @@ public:
|
|||
static OMPSectionsDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned NumClauses, EmptyShell);
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPSectionsDirectiveClass;
|
||||
}
|
||||
|
@ -916,6 +955,10 @@ public:
|
|||
///
|
||||
class OMPSectionDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// \brief true if current directive has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
|
@ -923,13 +966,15 @@ class OMPSectionDirective : public OMPExecutableDirective {
|
|||
///
|
||||
OMPSectionDirective(SourceLocation StartLoc, SourceLocation EndLoc)
|
||||
: OMPExecutableDirective(this, OMPSectionDirectiveClass, OMPD_section,
|
||||
StartLoc, EndLoc, 0, 1) {}
|
||||
StartLoc, EndLoc, 0, 1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
explicit OMPSectionDirective()
|
||||
: OMPExecutableDirective(this, OMPSectionDirectiveClass, OMPD_section,
|
||||
SourceLocation(), SourceLocation(), 0, 1) {}
|
||||
SourceLocation(), SourceLocation(), 0, 1),
|
||||
HasCancel(false) {}
|
||||
|
||||
public:
|
||||
/// \brief Creates directive.
|
||||
|
@ -938,11 +983,12 @@ public:
|
|||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param HasCancel true if current directive has inner directive.
|
||||
///
|
||||
static OMPSectionDirective *Create(const ASTContext &C,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
Stmt *AssociatedStmt);
|
||||
Stmt *AssociatedStmt, bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive.
|
||||
///
|
||||
|
@ -950,6 +996,12 @@ public:
|
|||
///
|
||||
static OMPSectionDirective *CreateEmpty(const ASTContext &C, EmptyShell);
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPSectionDirectiveClass;
|
||||
}
|
||||
|
@ -1133,6 +1185,10 @@ public:
|
|||
///
|
||||
class OMPParallelForDirective : public OMPLoopDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// \brief true if current region has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
|
@ -1143,7 +1199,8 @@ class OMPParallelForDirective : public OMPLoopDirective {
|
|||
OMPParallelForDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPParallelForDirectiveClass, OMPD_parallel_for,
|
||||
StartLoc, EndLoc, CollapsedNum, NumClauses) {}
|
||||
StartLoc, EndLoc, CollapsedNum, NumClauses),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
|
@ -1153,7 +1210,11 @@ class OMPParallelForDirective : public OMPLoopDirective {
|
|||
explicit OMPParallelForDirective(unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPParallelForDirectiveClass, OMPD_parallel_for,
|
||||
SourceLocation(), SourceLocation(), CollapsedNum,
|
||||
NumClauses) {}
|
||||
NumClauses),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
|
@ -1165,11 +1226,12 @@ public:
|
|||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
/// \param HasCancel true if current directive has inner cancel directive.
|
||||
///
|
||||
static OMPParallelForDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs);
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs, bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive with the place
|
||||
/// for \a NumClauses clauses.
|
||||
|
@ -1183,6 +1245,9 @@ public:
|
|||
unsigned CollapsedNum,
|
||||
EmptyShell);
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPParallelForDirectiveClass;
|
||||
}
|
||||
|
@ -1268,6 +1333,10 @@ public:
|
|||
///
|
||||
class OMPParallelSectionsDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// \brief true if current directive has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
|
@ -1278,7 +1347,8 @@ class OMPParallelSectionsDirective : public OMPExecutableDirective {
|
|||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPParallelSectionsDirectiveClass,
|
||||
OMPD_parallel_sections, StartLoc, EndLoc,
|
||||
NumClauses, 1) {}
|
||||
NumClauses, 1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
|
@ -1287,7 +1357,11 @@ class OMPParallelSectionsDirective : public OMPExecutableDirective {
|
|||
explicit OMPParallelSectionsDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPParallelSectionsDirectiveClass,
|
||||
OMPD_parallel_sections, SourceLocation(),
|
||||
SourceLocation(), NumClauses, 1) {}
|
||||
SourceLocation(), NumClauses, 1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
|
@ -1297,10 +1371,11 @@ public:
|
|||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param HasCancel true if current directive has inner cancel directive.
|
||||
///
|
||||
static OMPParallelSectionsDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt);
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a NumClauses
|
||||
/// clauses.
|
||||
|
@ -1311,6 +1386,9 @@ public:
|
|||
static OMPParallelSectionsDirective *
|
||||
CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell);
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPParallelSectionsDirectiveClass;
|
||||
}
|
||||
|
@ -1326,6 +1404,9 @@ public:
|
|||
///
|
||||
class OMPTaskDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
/// \brief true if this directive has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
|
@ -1335,7 +1416,8 @@ class OMPTaskDirective : public OMPExecutableDirective {
|
|||
OMPTaskDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTaskDirectiveClass, OMPD_task, StartLoc,
|
||||
EndLoc, NumClauses, 1) {}
|
||||
EndLoc, NumClauses, 1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
|
@ -1344,7 +1426,11 @@ class OMPTaskDirective : public OMPExecutableDirective {
|
|||
explicit OMPTaskDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTaskDirectiveClass, OMPD_task,
|
||||
SourceLocation(), SourceLocation(), NumClauses,
|
||||
1) {}
|
||||
1),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
|
@ -1354,11 +1440,12 @@ public:
|
|||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param HasCancel true, if current directive has inner cancel directive.
|
||||
///
|
||||
static OMPTaskDirective *Create(const ASTContext &C, SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt);
|
||||
Stmt *AssociatedStmt, bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a NumClauses
|
||||
/// clauses.
|
||||
|
@ -1369,6 +1456,9 @@ public:
|
|||
static OMPTaskDirective *CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
||||
EmptyShell);
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPTaskDirectiveClass;
|
||||
}
|
||||
|
|
|
@ -1622,11 +1622,8 @@ OMPDependClause *OMPDependClause::CreateEmpty(const ASTContext &C, unsigned N) {
|
|||
}
|
||||
|
||||
OMPParallelDirective *OMPParallelDirective::Create(
|
||||
const ASTContext &C,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt) {
|
||||
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
|
||||
unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelDirective),
|
||||
llvm::alignOf<OMPClause *>());
|
||||
void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
|
||||
|
@ -1635,6 +1632,7 @@ OMPParallelDirective *OMPParallelDirective::Create(
|
|||
Clauses.size());
|
||||
Dir->setClauses(Clauses);
|
||||
Dir->setAssociatedStmt(AssociatedStmt);
|
||||
Dir->setHasCancel(HasCancel);
|
||||
return Dir;
|
||||
}
|
||||
|
||||
|
@ -1693,7 +1691,7 @@ OMPForDirective *
|
|||
OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
||||
SourceLocation EndLoc, unsigned CollapsedNum,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
||||
const HelperExprs &Exprs) {
|
||||
const HelperExprs &Exprs, bool HasCancel) {
|
||||
unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPForDirective),
|
||||
llvm::alignOf<OMPClause *>());
|
||||
void *Mem =
|
||||
|
@ -1722,6 +1720,7 @@ OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
|||
Dir->setInits(Exprs.Inits);
|
||||
Dir->setUpdates(Exprs.Updates);
|
||||
Dir->setFinals(Exprs.Finals);
|
||||
Dir->setHasCancel(HasCancel);
|
||||
return Dir;
|
||||
}
|
||||
|
||||
|
@ -1787,7 +1786,7 @@ OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C,
|
|||
|
||||
OMPSectionsDirective *OMPSectionsDirective::Create(
|
||||
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
|
||||
unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSectionsDirective),
|
||||
llvm::alignOf<OMPClause *>());
|
||||
void *Mem =
|
||||
|
@ -1796,6 +1795,7 @@ OMPSectionsDirective *OMPSectionsDirective::Create(
|
|||
new (Mem) OMPSectionsDirective(StartLoc, EndLoc, Clauses.size());
|
||||
Dir->setClauses(Clauses);
|
||||
Dir->setAssociatedStmt(AssociatedStmt);
|
||||
Dir->setHasCancel(HasCancel);
|
||||
return Dir;
|
||||
}
|
||||
|
||||
|
@ -1812,12 +1812,14 @@ OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C,
|
|||
OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
Stmt *AssociatedStmt) {
|
||||
Stmt *AssociatedStmt,
|
||||
bool HasCancel) {
|
||||
unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSectionDirective),
|
||||
llvm::alignOf<Stmt *>());
|
||||
void *Mem = C.Allocate(Size + sizeof(Stmt *));
|
||||
OMPSectionDirective *Dir = new (Mem) OMPSectionDirective(StartLoc, EndLoc);
|
||||
Dir->setAssociatedStmt(AssociatedStmt);
|
||||
Dir->setHasCancel(HasCancel);
|
||||
return Dir;
|
||||
}
|
||||
|
||||
|
@ -1898,7 +1900,7 @@ OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C,
|
|||
OMPParallelForDirective *OMPParallelForDirective::Create(
|
||||
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
|
||||
const HelperExprs &Exprs) {
|
||||
const HelperExprs &Exprs, bool HasCancel) {
|
||||
unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelForDirective),
|
||||
llvm::alignOf<OMPClause *>());
|
||||
void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
|
||||
|
@ -1927,6 +1929,7 @@ OMPParallelForDirective *OMPParallelForDirective::Create(
|
|||
Dir->setInits(Exprs.Inits);
|
||||
Dir->setUpdates(Exprs.Updates);
|
||||
Dir->setFinals(Exprs.Finals);
|
||||
Dir->setHasCancel(HasCancel);
|
||||
return Dir;
|
||||
}
|
||||
|
||||
|
@ -1990,7 +1993,7 @@ OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C,
|
|||
|
||||
OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
|
||||
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
|
||||
unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelSectionsDirective),
|
||||
llvm::alignOf<OMPClause *>());
|
||||
void *Mem =
|
||||
|
@ -1999,6 +2002,7 @@ OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
|
|||
new (Mem) OMPParallelSectionsDirective(StartLoc, EndLoc, Clauses.size());
|
||||
Dir->setClauses(Clauses);
|
||||
Dir->setAssociatedStmt(AssociatedStmt);
|
||||
Dir->setHasCancel(HasCancel);
|
||||
return Dir;
|
||||
}
|
||||
|
||||
|
@ -2012,11 +2016,10 @@ OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C,
|
|||
return new (Mem) OMPParallelSectionsDirective(NumClauses);
|
||||
}
|
||||
|
||||
OMPTaskDirective *OMPTaskDirective::Create(const ASTContext &C,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt) {
|
||||
OMPTaskDirective *
|
||||
OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
|
||||
SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt, bool HasCancel) {
|
||||
unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskDirective),
|
||||
llvm::alignOf<OMPClause *>());
|
||||
void *Mem =
|
||||
|
@ -2025,6 +2028,7 @@ OMPTaskDirective *OMPTaskDirective::Create(const ASTContext &C,
|
|||
new (Mem) OMPTaskDirective(StartLoc, EndLoc, Clauses.size());
|
||||
Dir->setClauses(Clauses);
|
||||
Dir->setAssociatedStmt(AssociatedStmt);
|
||||
Dir->setHasCancel(HasCancel);
|
||||
return Dir;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,14 +45,16 @@ public:
|
|||
|
||||
CGOpenMPRegionInfo(const CapturedStmt &CS,
|
||||
const CGOpenMPRegionKind RegionKind,
|
||||
const RegionCodeGenTy &CodeGen, OpenMPDirectiveKind Kind)
|
||||
const RegionCodeGenTy &CodeGen, OpenMPDirectiveKind Kind,
|
||||
bool HasCancel)
|
||||
: CGCapturedStmtInfo(CS, CR_OpenMP), RegionKind(RegionKind),
|
||||
CodeGen(CodeGen), Kind(Kind) {}
|
||||
CodeGen(CodeGen), Kind(Kind), HasCancel(HasCancel) {}
|
||||
|
||||
CGOpenMPRegionInfo(const CGOpenMPRegionKind RegionKind,
|
||||
const RegionCodeGenTy &CodeGen, OpenMPDirectiveKind Kind)
|
||||
const RegionCodeGenTy &CodeGen, OpenMPDirectiveKind Kind,
|
||||
bool HasCancel)
|
||||
: CGCapturedStmtInfo(CR_OpenMP), RegionKind(RegionKind), CodeGen(CodeGen),
|
||||
Kind(Kind) {}
|
||||
Kind(Kind), HasCancel(HasCancel) {}
|
||||
|
||||
/// \brief Get a variable or parameter for storing global thread id
|
||||
/// inside OpenMP construct.
|
||||
|
@ -69,6 +71,8 @@ public:
|
|||
|
||||
OpenMPDirectiveKind getDirectiveKind() const { return Kind; }
|
||||
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const CGCapturedStmtInfo *Info) {
|
||||
return Info->getKind() == CR_OpenMP;
|
||||
}
|
||||
|
@ -77,6 +81,7 @@ protected:
|
|||
CGOpenMPRegionKind RegionKind;
|
||||
const RegionCodeGenTy &CodeGen;
|
||||
OpenMPDirectiveKind Kind;
|
||||
bool HasCancel;
|
||||
};
|
||||
|
||||
/// \brief API for captured statement code generation in OpenMP constructs.
|
||||
|
@ -84,8 +89,9 @@ class CGOpenMPOutlinedRegionInfo : public CGOpenMPRegionInfo {
|
|||
public:
|
||||
CGOpenMPOutlinedRegionInfo(const CapturedStmt &CS, const VarDecl *ThreadIDVar,
|
||||
const RegionCodeGenTy &CodeGen,
|
||||
OpenMPDirectiveKind Kind)
|
||||
: CGOpenMPRegionInfo(CS, ParallelOutlinedRegion, CodeGen, Kind),
|
||||
OpenMPDirectiveKind Kind, bool HasCancel)
|
||||
: CGOpenMPRegionInfo(CS, ParallelOutlinedRegion, CodeGen, Kind,
|
||||
HasCancel),
|
||||
ThreadIDVar(ThreadIDVar) {
|
||||
assert(ThreadIDVar != nullptr && "No ThreadID in OpenMP region.");
|
||||
}
|
||||
|
@ -114,8 +120,8 @@ public:
|
|||
CGOpenMPTaskOutlinedRegionInfo(const CapturedStmt &CS,
|
||||
const VarDecl *ThreadIDVar,
|
||||
const RegionCodeGenTy &CodeGen,
|
||||
OpenMPDirectiveKind Kind)
|
||||
: CGOpenMPRegionInfo(CS, TaskOutlinedRegion, CodeGen, Kind),
|
||||
OpenMPDirectiveKind Kind, bool HasCancel)
|
||||
: CGOpenMPRegionInfo(CS, TaskOutlinedRegion, CodeGen, Kind, HasCancel),
|
||||
ThreadIDVar(ThreadIDVar) {
|
||||
assert(ThreadIDVar != nullptr && "No ThreadID in OpenMP region.");
|
||||
}
|
||||
|
@ -147,8 +153,9 @@ class CGOpenMPInlinedRegionInfo : public CGOpenMPRegionInfo {
|
|||
public:
|
||||
CGOpenMPInlinedRegionInfo(CodeGenFunction::CGCapturedStmtInfo *OldCSI,
|
||||
const RegionCodeGenTy &CodeGen,
|
||||
OpenMPDirectiveKind Kind)
|
||||
: CGOpenMPRegionInfo(InlinedRegion, CodeGen, Kind), OldCSI(OldCSI),
|
||||
OpenMPDirectiveKind Kind, bool HasCancel)
|
||||
: CGOpenMPRegionInfo(InlinedRegion, CodeGen, Kind, HasCancel),
|
||||
OldCSI(OldCSI),
|
||||
OuterRegionInfo(dyn_cast_or_null<CGOpenMPRegionInfo>(OldCSI)) {}
|
||||
// \brief Retrieve the value of the context parameter.
|
||||
llvm::Value *getContextValue() const override {
|
||||
|
@ -214,11 +221,11 @@ public:
|
|||
/// a list of functions used for code generation of implicitly inlined
|
||||
/// regions.
|
||||
InlinedOpenMPRegionRAII(CodeGenFunction &CGF, const RegionCodeGenTy &CodeGen,
|
||||
OpenMPDirectiveKind Kind)
|
||||
OpenMPDirectiveKind Kind, bool HasCancel)
|
||||
: CGF(CGF) {
|
||||
// Start emission for the construct.
|
||||
CGF.CapturedStmtInfo =
|
||||
new CGOpenMPInlinedRegionInfo(CGF.CapturedStmtInfo, CodeGen, Kind);
|
||||
CGF.CapturedStmtInfo = new CGOpenMPInlinedRegionInfo(
|
||||
CGF.CapturedStmtInfo, CodeGen, Kind, HasCancel);
|
||||
}
|
||||
~InlinedOpenMPRegionRAII() {
|
||||
// Restore original CapturedStmtInfo only if we're done with code emission.
|
||||
|
@ -309,7 +316,15 @@ llvm::Value *CGOpenMPRuntime::emitParallelOutlinedFunction(
|
|||
"thread id variable must be of type kmp_int32 *");
|
||||
const CapturedStmt *CS = cast<CapturedStmt>(D.getAssociatedStmt());
|
||||
CodeGenFunction CGF(CGM, true);
|
||||
CGOpenMPOutlinedRegionInfo CGInfo(*CS, ThreadIDVar, CodeGen, InnermostKind);
|
||||
bool HasCancel = false;
|
||||
if (auto *OPD = dyn_cast<OMPParallelDirective>(&D))
|
||||
HasCancel = OPD->hasCancel();
|
||||
else if (auto *OPSD = dyn_cast<OMPParallelSectionsDirective>(&D))
|
||||
HasCancel = OPSD->hasCancel();
|
||||
else if (auto *OPFD = dyn_cast<OMPParallelForDirective>(&D))
|
||||
HasCancel = OPFD->hasCancel();
|
||||
CGOpenMPOutlinedRegionInfo CGInfo(*CS, ThreadIDVar, CodeGen, InnermostKind,
|
||||
HasCancel);
|
||||
CodeGenFunction::CGCapturedStmtRAII CapInfoRAII(CGF, &CGInfo);
|
||||
return CGF.GenerateOpenMPCapturedStmtFunction(*CS);
|
||||
}
|
||||
|
@ -322,7 +337,8 @@ llvm::Value *CGOpenMPRuntime::emitTaskOutlinedFunction(
|
|||
auto *CS = cast<CapturedStmt>(D.getAssociatedStmt());
|
||||
CodeGenFunction CGF(CGM, true);
|
||||
CGOpenMPTaskOutlinedRegionInfo CGInfo(*CS, ThreadIDVar, CodeGen,
|
||||
InnermostKind);
|
||||
InnermostKind,
|
||||
cast<OMPTaskDirective>(D).hasCancel());
|
||||
CodeGenFunction::CGCapturedStmtRAII CapInfoRAII(CGF, &CGInfo);
|
||||
return CGF.GenerateCapturedStmtFunction(*CS);
|
||||
}
|
||||
|
@ -1550,8 +1566,8 @@ void CGOpenMPRuntime::emitOrderedRegion(CodeGenFunction &CGF,
|
|||
}
|
||||
|
||||
void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPDirectiveKind Kind,
|
||||
bool CheckForCancel) {
|
||||
OpenMPDirectiveKind Kind, bool EmitChecks,
|
||||
bool ForceSimpleCall) {
|
||||
// Build call __kmpc_cancel_barrier(loc, thread_id);
|
||||
// Build call __kmpc_barrier(loc, thread_id);
|
||||
OpenMPLocationFlags Flags = OMP_IDENT_KMPC;
|
||||
|
@ -1571,16 +1587,19 @@ void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
}
|
||||
// Build call __kmpc_cancel_barrier(loc, thread_id) or __kmpc_barrier(loc,
|
||||
// thread_id);
|
||||
auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo);
|
||||
// Do not emit barrier call in the single directive emitted in some rare cases
|
||||
// for sections directives.
|
||||
if (OMPRegionInfo && OMPRegionInfo->getDirectiveKind() == OMPD_single)
|
||||
return;
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc, Flags),
|
||||
getThreadID(CGF, Loc)};
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
auto CancelDestination =
|
||||
CGF.getOMPCancelDestination(OMPRegionInfo->getDirectiveKind());
|
||||
if (CancelDestination.isValid()) {
|
||||
if (OMPRegionInfo) {
|
||||
if (!ForceSimpleCall && OMPRegionInfo->hasCancel()) {
|
||||
auto *Result = CGF.EmitRuntimeCall(
|
||||
createRuntimeFunction(OMPRTL__kmpc_cancel_barrier), Args);
|
||||
if (CheckForCancel) {
|
||||
if (EmitChecks) {
|
||||
// if (__kmpc_cancel_barrier()) {
|
||||
// exit from construct;
|
||||
// }
|
||||
|
@ -1590,6 +1609,8 @@ void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
CGF.Builder.CreateCondBr(Cmp, ExitBB, ContBB);
|
||||
CGF.EmitBlock(ExitBB);
|
||||
// exit from construct;
|
||||
auto CancelDestination =
|
||||
CGF.getOMPCancelDestination(OMPRegionInfo->getDirectiveKind());
|
||||
CGF.EmitBranchThroughCleanup(CancelDestination);
|
||||
CGF.EmitBlock(ContBB, /*IsFinished=*/true);
|
||||
}
|
||||
|
@ -2825,8 +2846,9 @@ void CGOpenMPRuntime::emitTaskwaitCall(CodeGenFunction &CGF,
|
|||
|
||||
void CGOpenMPRuntime::emitInlinedDirective(CodeGenFunction &CGF,
|
||||
OpenMPDirectiveKind InnerKind,
|
||||
const RegionCodeGenTy &CodeGen) {
|
||||
InlinedOpenMPRegionRAII Region(CGF, CodeGen, InnerKind);
|
||||
const RegionCodeGenTy &CodeGen,
|
||||
bool HasCancel) {
|
||||
InlinedOpenMPRegionRAII Region(CGF, CodeGen, InnerKind, HasCancel);
|
||||
CGF.CapturedStmtInfo->EmitBody(CGF, /*S=*/nullptr);
|
||||
}
|
||||
|
||||
|
@ -2862,9 +2884,9 @@ void CGOpenMPRuntime::emitCancellationPointCall(
|
|||
// global_tid, kmp_int32 cncl_kind);
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
auto CancelDest =
|
||||
CGF.getOMPCancelDestination(OMPRegionInfo->getDirectiveKind());
|
||||
if (CancelDest.isValid()) {
|
||||
if (OMPRegionInfo->getDirectiveKind() == OMPD_single)
|
||||
return;
|
||||
if (OMPRegionInfo->hasCancel()) {
|
||||
llvm::Value *Args[] = {
|
||||
emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
CGF.Builder.getInt32(getCancellationKind(CancelRegion))};
|
||||
|
@ -2881,8 +2903,10 @@ void CGOpenMPRuntime::emitCancellationPointCall(
|
|||
CGF.Builder.CreateCondBr(Cmp, ExitBB, ContBB);
|
||||
CGF.EmitBlock(ExitBB);
|
||||
// __kmpc_cancel_barrier();
|
||||
emitBarrierCall(CGF, Loc, OMPD_unknown, /*CheckForCancel=*/false);
|
||||
emitBarrierCall(CGF, Loc, OMPD_unknown, /*EmitChecks=*/false);
|
||||
// exit from construct;
|
||||
auto CancelDest =
|
||||
CGF.getOMPCancelDestination(OMPRegionInfo->getDirectiveKind());
|
||||
CGF.EmitBranchThroughCleanup(CancelDest);
|
||||
CGF.EmitBlock(ContBB, /*IsFinished=*/true);
|
||||
}
|
||||
|
@ -2895,29 +2919,29 @@ void CGOpenMPRuntime::emitCancelCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
// kmp_int32 cncl_kind);
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
if (OMPRegionInfo->getDirectiveKind() == OMPD_single)
|
||||
return;
|
||||
llvm::Value *Args[] = {
|
||||
emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
CGF.Builder.getInt32(getCancellationKind(CancelRegion))};
|
||||
// Ignore return result until untied tasks are supported.
|
||||
auto *Result =
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_cancel), Args);
|
||||
// if (__kmpc_cancel()) {
|
||||
// __kmpc_cancel_barrier();
|
||||
// exit from construct;
|
||||
// }
|
||||
auto *ExitBB = CGF.createBasicBlock(".cancel.exit");
|
||||
auto *ContBB = CGF.createBasicBlock(".cancel.continue");
|
||||
auto *Cmp = CGF.Builder.CreateIsNotNull(Result);
|
||||
CGF.Builder.CreateCondBr(Cmp, ExitBB, ContBB);
|
||||
CGF.EmitBlock(ExitBB);
|
||||
// __kmpc_cancel_barrier();
|
||||
emitBarrierCall(CGF, Loc, OMPD_unknown, /*EmitChecks=*/false);
|
||||
// exit from construct;
|
||||
auto CancelDest =
|
||||
CGF.getOMPCancelDestination(OMPRegionInfo->getDirectiveKind());
|
||||
if (CancelDest.isValid()) {
|
||||
llvm::Value *Args[] = {
|
||||
emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
CGF.Builder.getInt32(getCancellationKind(CancelRegion))};
|
||||
// Ignore return result until untied tasks are supported.
|
||||
auto *Result =
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_cancel), Args);
|
||||
// if (__kmpc_cancel()) {
|
||||
// __kmpc_cancel_barrier();
|
||||
// exit from construct;
|
||||
// }
|
||||
auto *ExitBB = CGF.createBasicBlock(".cancel.exit");
|
||||
auto *ContBB = CGF.createBasicBlock(".cancel.continue");
|
||||
auto *Cmp = CGF.Builder.CreateIsNotNull(Result);
|
||||
CGF.Builder.CreateCondBr(Cmp, ExitBB, ContBB);
|
||||
CGF.EmitBlock(ExitBB);
|
||||
// __kmpc_cancel_barrier();
|
||||
emitBarrierCall(CGF, Loc, OMPD_unknown, /*CheckForCancel=*/false);
|
||||
// exit from construct;
|
||||
CGF.EmitBranchThroughCleanup(CancelDest);
|
||||
CGF.EmitBlock(ContBB, /*IsFinished=*/true);
|
||||
}
|
||||
CGF.EmitBranchThroughCleanup(CancelDest);
|
||||
CGF.EmitBlock(ContBB, /*IsFinished=*/true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -454,12 +454,15 @@ public:
|
|||
/// \brief Emit an implicit/explicit barrier for OpenMP threads.
|
||||
/// \param Kind Directive for which this implicit barrier call must be
|
||||
/// generated. Must be OMPD_barrier for explicit barrier generation.
|
||||
/// \param CheckForCancel true if check for possible cancellation must be
|
||||
/// performed, false otherwise.
|
||||
/// \param EmitChecks true if need to emit checks for cancellation barriers.
|
||||
/// \param ForceSimpleCall true simple barrier call must be emitted, false if
|
||||
/// runtime class decides which one to emit (simple or with cancellation
|
||||
/// checks).
|
||||
///
|
||||
virtual void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPDirectiveKind Kind,
|
||||
bool CheckForCancel = true);
|
||||
bool EmitChecks = true,
|
||||
bool ForceSimpleCall = false);
|
||||
|
||||
/// \brief Check if the specified \a ScheduleKind is static non-chunked.
|
||||
/// This kind of worksharing directive is emitted without outer loop.
|
||||
|
@ -654,9 +657,12 @@ public:
|
|||
/// \param InnermostKind Kind of innermost directive (for simple directives it
|
||||
/// is a directive itself, for combined - its innermost directive).
|
||||
/// \param CodeGen Code generation sequence for the \a D directive.
|
||||
/// \param HasCancel true if region has inner cancel directive, false
|
||||
/// otherwise.
|
||||
virtual void emitInlinedDirective(CodeGenFunction &CGF,
|
||||
OpenMPDirectiveKind InnermostKind,
|
||||
const RegionCodeGenTy &CodeGen);
|
||||
const RegionCodeGenTy &CodeGen,
|
||||
bool HasCancel = false);
|
||||
/// \brief Emit a code for reduction clause. Next code should be emitted for
|
||||
/// reduction:
|
||||
/// \code
|
||||
|
|
|
@ -624,8 +624,9 @@ void CodeGenFunction::EmitOMPParallelDirective(const OMPParallelDirective &S) {
|
|||
// initialization of firstprivate variables or propagation master's thread
|
||||
// values of threadprivate variables to local instances of that variables
|
||||
// of all other implicit threads.
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, S.getLocStart(),
|
||||
OMPD_unknown);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_unknown, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
}
|
||||
CGF.EmitOMPPrivateClause(S, PrivateScope);
|
||||
CGF.EmitOMPReductionClauseInit(S, PrivateScope);
|
||||
|
@ -633,8 +634,9 @@ void CodeGenFunction::EmitOMPParallelDirective(const OMPParallelDirective &S) {
|
|||
CGF.EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
CGF.EmitOMPReductionClauseFinal(S);
|
||||
// Emit implicit barrier at the end of the 'parallel' directive.
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, S.getLocStart(),
|
||||
OMPD_unknown);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_unknown, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
};
|
||||
emitCommonOMPParallelDirective(*this, S, OMPD_parallel, CodeGen);
|
||||
}
|
||||
|
@ -1238,8 +1240,9 @@ bool CodeGenFunction::EmitOMPWorksharingLoop(const OMPLoopDirective &S) {
|
|||
if (EmitOMPFirstprivateClause(S, LoopScope)) {
|
||||
// Emit implicit barrier to synchronize threads and avoid data races on
|
||||
// initialization of firstprivate variables.
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(),
|
||||
OMPD_unknown);
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
*this, S.getLocStart(), OMPD_unknown, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
}
|
||||
EmitOMPPrivateClause(S, LoopScope);
|
||||
HasLastprivateClause = EmitOMPLastprivateClauseInit(S, LoopScope);
|
||||
|
@ -1321,7 +1324,8 @@ void CodeGenFunction::EmitOMPForDirective(const OMPForDirective &S) {
|
|||
auto &&CodeGen = [&S, &HasLastprivates](CodeGenFunction &CGF) {
|
||||
HasLastprivates = CGF.EmitOMPWorksharingLoop(S);
|
||||
};
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_for, CodeGen);
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_for, CodeGen,
|
||||
S.hasCancel());
|
||||
|
||||
// Emit an implicit barrier at the end.
|
||||
if (!S.getSingleClause<OMPNowaitClause>() || HasLastprivates) {
|
||||
|
@ -1416,8 +1420,9 @@ CodeGenFunction::EmitSections(const OMPExecutableDirective &S) {
|
|||
if (CGF.EmitOMPFirstprivateClause(S, LoopScope)) {
|
||||
// Emit implicit barrier to synchronize threads and avoid data races on
|
||||
// initialization of firstprivate variables.
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, S.getLocStart(),
|
||||
OMPD_unknown);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_unknown, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
}
|
||||
CGF.EmitOMPPrivateClause(S, LoopScope);
|
||||
HasLastprivates = CGF.EmitOMPLastprivateClauseInit(S, LoopScope);
|
||||
|
@ -1450,7 +1455,13 @@ CodeGenFunction::EmitSections(const OMPExecutableDirective &S) {
|
|||
CGF.EmitLoadOfScalar(IL, S.getLocStart())));
|
||||
};
|
||||
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_sections, CodeGen);
|
||||
bool HasCancel = false;
|
||||
if (auto *OSD = dyn_cast<OMPSectionsDirective>(&S))
|
||||
HasCancel = OSD->hasCancel();
|
||||
else if (auto *OPSD = dyn_cast<OMPParallelSectionsDirective>(&S))
|
||||
HasCancel = OPSD->hasCancel();
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_sections, CodeGen,
|
||||
HasCancel);
|
||||
// Emit barrier for lastprivates only if 'sections' directive has 'nowait'
|
||||
// clause. Otherwise the barrier will be generated by the codegen for the
|
||||
// directive.
|
||||
|
@ -1490,7 +1501,9 @@ CodeGenFunction::EmitSections(const OMPExecutableDirective &S) {
|
|||
S.getSingleClause<OMPNowaitClause>()) {
|
||||
// Emit implicit barrier to synchronize threads and avoid data races on
|
||||
// initialization of firstprivate variables.
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(), OMPD_unknown);
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(), OMPD_unknown,
|
||||
/*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
}
|
||||
return OMPD_single;
|
||||
}
|
||||
|
@ -1510,7 +1523,8 @@ void CodeGenFunction::EmitOMPSectionDirective(const OMPSectionDirective &S) {
|
|||
CGF.EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
CGF.EnsureInsertPoint();
|
||||
};
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_section, CodeGen);
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_section, CodeGen,
|
||||
S.hasCancel());
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPSingleDirective(const OMPSingleDirective &S) {
|
||||
|
@ -1586,8 +1600,9 @@ void CodeGenFunction::EmitOMPParallelForDirective(
|
|||
// Emit implicit barrier at the end of parallel region, but this barrier
|
||||
// is at the end of 'for' directive, so emit it as the implicit barrier for
|
||||
// this 'for' directive.
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, S.getLocStart(),
|
||||
OMPD_parallel);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_parallel, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
};
|
||||
emitCommonOMPParallelDirective(*this, S, OMPD_for, CodeGen);
|
||||
}
|
||||
|
@ -1603,8 +1618,9 @@ void CodeGenFunction::EmitOMPParallelForSimdDirective(
|
|||
// Emit implicit barrier at the end of parallel region, but this barrier
|
||||
// is at the end of 'for' directive, so emit it as the implicit barrier for
|
||||
// this 'for' directive.
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, S.getLocStart(),
|
||||
OMPD_parallel);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_parallel, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
};
|
||||
emitCommonOMPParallelDirective(*this, S, OMPD_simd, CodeGen);
|
||||
}
|
||||
|
@ -1617,8 +1633,9 @@ void CodeGenFunction::EmitOMPParallelSectionsDirective(
|
|||
auto &&CodeGen = [&S](CodeGenFunction &CGF) {
|
||||
(void)CGF.EmitSections(S);
|
||||
// Emit implicit barrier at the end of parallel region.
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, S.getLocStart(),
|
||||
OMPD_parallel);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_parallel, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
};
|
||||
emitCommonOMPParallelDirective(*this, S, OMPD_sections, CodeGen);
|
||||
}
|
||||
|
@ -2253,10 +2270,9 @@ CodeGenFunction::JumpDest
|
|||
CodeGenFunction::getOMPCancelDestination(OpenMPDirectiveKind Kind) {
|
||||
if (Kind == OMPD_parallel || Kind == OMPD_task)
|
||||
return ReturnBlock;
|
||||
else if (Kind == OMPD_for || Kind == OMPD_section || Kind == OMPD_sections)
|
||||
return BreakContinueStack.empty() ? JumpDest()
|
||||
: BreakContinueStack.back().BreakBlock;
|
||||
return JumpDest();
|
||||
assert(Kind == OMPD_for || Kind == OMPD_section || Kind == OMPD_sections ||
|
||||
Kind == OMPD_parallel_sections || Kind == OMPD_parallel_for);
|
||||
return BreakContinueStack.back().BreakBlock;
|
||||
}
|
||||
|
||||
// Generate the instructions for '#pragma omp target data' directive.
|
||||
|
|
|
@ -98,6 +98,7 @@ private:
|
|||
SourceLocation ConstructLoc;
|
||||
bool OrderedRegion;
|
||||
bool NowaitRegion;
|
||||
bool CancelRegion;
|
||||
unsigned CollapseNumber;
|
||||
SourceLocation InnerTeamsRegionLoc;
|
||||
SharingMapTy(OpenMPDirectiveKind DKind, DeclarationNameInfo Name,
|
||||
|
@ -105,12 +106,12 @@ private:
|
|||
: SharingMap(), AlignedMap(), LCVSet(), DefaultAttr(DSA_unspecified),
|
||||
Directive(DKind), DirectiveName(std::move(Name)), CurScope(CurScope),
|
||||
ConstructLoc(Loc), OrderedRegion(false), NowaitRegion(false),
|
||||
CollapseNumber(1), InnerTeamsRegionLoc() {}
|
||||
CancelRegion(false), CollapseNumber(1), InnerTeamsRegionLoc() {}
|
||||
SharingMapTy()
|
||||
: SharingMap(), AlignedMap(), LCVSet(), DefaultAttr(DSA_unspecified),
|
||||
Directive(OMPD_unknown), DirectiveName(), CurScope(nullptr),
|
||||
ConstructLoc(), OrderedRegion(false), NowaitRegion(false),
|
||||
CollapseNumber(1), InnerTeamsRegionLoc() {}
|
||||
CancelRegion(false), CollapseNumber(1), InnerTeamsRegionLoc() {}
|
||||
};
|
||||
|
||||
typedef SmallVector<SharingMapTy, 64> StackTy;
|
||||
|
@ -251,6 +252,16 @@ public:
|
|||
return Stack[Stack.size() - 2].NowaitRegion;
|
||||
return false;
|
||||
}
|
||||
/// \brief Marks parent region as cancel region.
|
||||
void setParentCancelRegion(bool Cancel = true) {
|
||||
if (Stack.size() > 2)
|
||||
Stack[Stack.size() - 2].CancelRegion =
|
||||
Stack[Stack.size() - 2].CancelRegion || Cancel;
|
||||
}
|
||||
/// \brief Return true if current region has inner cancel construct.
|
||||
bool isCancelRegion() const {
|
||||
return Stack.back().CancelRegion;
|
||||
}
|
||||
|
||||
/// \brief Set collapse value for the region.
|
||||
void setCollapseNumber(unsigned Val) { Stack.back().CollapseNumber = Val; }
|
||||
|
@ -1901,10 +1912,12 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
|
|||
// construct-type-clause.
|
||||
NestingProhibited =
|
||||
!((CancelRegion == OMPD_parallel && ParentRegion == OMPD_parallel) ||
|
||||
(CancelRegion == OMPD_for && ParentRegion == OMPD_for) ||
|
||||
(CancelRegion == OMPD_for &&
|
||||
(ParentRegion == OMPD_for || ParentRegion == OMPD_parallel_for)) ||
|
||||
(CancelRegion == OMPD_taskgroup && ParentRegion == OMPD_task) ||
|
||||
(CancelRegion == OMPD_sections &&
|
||||
(ParentRegion == OMPD_section || ParentRegion == OMPD_sections)));
|
||||
(ParentRegion == OMPD_section || ParentRegion == OMPD_sections ||
|
||||
ParentRegion == OMPD_parallel_sections)));
|
||||
} else if (CurrentRegion == OMPD_master) {
|
||||
// OpenMP [2.16, Nesting of Regions]
|
||||
// A master region may not be closely nested inside a worksharing,
|
||||
|
@ -2275,8 +2288,8 @@ StmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses,
|
|||
|
||||
getCurFunction()->setHasBranchProtectedScope();
|
||||
|
||||
return OMPParallelDirective::Create(Context, StartLoc, EndLoc, Clauses,
|
||||
AStmt);
|
||||
return OMPParallelDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
|
||||
DSAStack->isCancelRegion());
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
@ -3741,7 +3754,7 @@ StmtResult Sema::ActOnOpenMPForDirective(
|
|||
|
||||
getCurFunction()->setHasBranchProtectedScope();
|
||||
return OMPForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
|
||||
Clauses, AStmt, B);
|
||||
Clauses, AStmt, B, DSAStack->isCancelRegion());
|
||||
}
|
||||
|
||||
StmtResult Sema::ActOnOpenMPForSimdDirective(
|
||||
|
@ -3822,6 +3835,8 @@ StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
|
|||
diag::err_omp_sections_substmt_not_section);
|
||||
return StmtError();
|
||||
}
|
||||
cast<OMPSectionDirective>(SectionStmt)
|
||||
->setHasCancel(DSAStack->isCancelRegion());
|
||||
}
|
||||
} else {
|
||||
Diag(AStmt->getLocStart(), diag::err_omp_sections_not_compound_stmt);
|
||||
|
@ -3830,8 +3845,8 @@ StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
|
|||
|
||||
getCurFunction()->setHasBranchProtectedScope();
|
||||
|
||||
return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses,
|
||||
AStmt);
|
||||
return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
|
||||
DSAStack->isCancelRegion());
|
||||
}
|
||||
|
||||
StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt,
|
||||
|
@ -3843,8 +3858,10 @@ StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt,
|
|||
assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
|
||||
|
||||
getCurFunction()->setHasBranchProtectedScope();
|
||||
DSAStack->setParentCancelRegion(DSAStack->isCancelRegion());
|
||||
|
||||
return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt);
|
||||
return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt,
|
||||
DSAStack->isCancelRegion());
|
||||
}
|
||||
|
||||
StmtResult Sema::ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses,
|
||||
|
@ -3946,7 +3963,8 @@ StmtResult Sema::ActOnOpenMPParallelForDirective(
|
|||
|
||||
getCurFunction()->setHasBranchProtectedScope();
|
||||
return OMPParallelForDirective::Create(Context, StartLoc, EndLoc,
|
||||
NestedLoopCount, Clauses, AStmt, B);
|
||||
NestedLoopCount, Clauses, AStmt, B,
|
||||
DSAStack->isCancelRegion());
|
||||
}
|
||||
|
||||
StmtResult Sema::ActOnOpenMPParallelForSimdDirective(
|
||||
|
@ -4031,6 +4049,8 @@ Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses,
|
|||
diag::err_omp_parallel_sections_substmt_not_section);
|
||||
return StmtError();
|
||||
}
|
||||
cast<OMPSectionDirective>(SectionStmt)
|
||||
->setHasCancel(DSAStack->isCancelRegion());
|
||||
}
|
||||
} else {
|
||||
Diag(AStmt->getLocStart(),
|
||||
|
@ -4040,8 +4060,8 @@ Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses,
|
|||
|
||||
getCurFunction()->setHasBranchProtectedScope();
|
||||
|
||||
return OMPParallelSectionsDirective::Create(Context, StartLoc, EndLoc,
|
||||
Clauses, AStmt);
|
||||
return OMPParallelSectionsDirective::Create(
|
||||
Context, StartLoc, EndLoc, Clauses, AStmt, DSAStack->isCancelRegion());
|
||||
}
|
||||
|
||||
StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses,
|
||||
|
@ -4060,7 +4080,8 @@ StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses,
|
|||
|
||||
getCurFunction()->setHasBranchProtectedScope();
|
||||
|
||||
return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
|
||||
return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
|
||||
DSAStack->isCancelRegion());
|
||||
}
|
||||
|
||||
StmtResult Sema::ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc,
|
||||
|
@ -4899,6 +4920,7 @@ StmtResult Sema::ActOnOpenMPCancelDirective(SourceLocation StartLoc,
|
|||
Diag(StartLoc, diag::err_omp_parent_cancel_region_ordered) << 1;
|
||||
return StmtError();
|
||||
}
|
||||
DSAStack->setParentCancelRegion(/*Cancel=*/true);
|
||||
return OMPCancelDirective::Create(Context, StartLoc, EndLoc, CancelRegion);
|
||||
}
|
||||
|
||||
|
|
|
@ -2167,6 +2167,7 @@ void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) {
|
|||
// The NumClauses field was read in ReadStmtFromStream.
|
||||
++Idx;
|
||||
VisitOMPExecutableDirective(D);
|
||||
D->setHasCancel(Record[Idx++]);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) {
|
||||
|
@ -2175,6 +2176,7 @@ void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) {
|
|||
|
||||
void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) {
|
||||
VisitOMPLoopDirective(D);
|
||||
D->setHasCancel(Record[Idx++]);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) {
|
||||
|
@ -2186,11 +2188,13 @@ void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
|
|||
// The NumClauses field was read in ReadStmtFromStream.
|
||||
++Idx;
|
||||
VisitOMPExecutableDirective(D);
|
||||
D->setHasCancel(Record[Idx++]);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) {
|
||||
VisitStmt(D);
|
||||
VisitOMPExecutableDirective(D);
|
||||
D->setHasCancel(Record[Idx++]);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) {
|
||||
|
@ -2213,6 +2217,7 @@ void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
|
|||
|
||||
void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
|
||||
VisitOMPLoopDirective(D);
|
||||
D->setHasCancel(Record[Idx++]);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitOMPParallelForSimdDirective(
|
||||
|
@ -2226,6 +2231,7 @@ void ASTStmtReader::VisitOMPParallelSectionsDirective(
|
|||
// The NumClauses field was read in ReadStmtFromStream.
|
||||
++Idx;
|
||||
VisitOMPExecutableDirective(D);
|
||||
D->setHasCancel(Record[Idx++]);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) {
|
||||
|
@ -2233,6 +2239,7 @@ void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) {
|
|||
// The NumClauses field was read in ReadStmtFromStream.
|
||||
++Idx;
|
||||
VisitOMPExecutableDirective(D);
|
||||
D->setHasCancel(Record[Idx++]);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {
|
||||
|
|
|
@ -2003,6 +2003,7 @@ void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {
|
|||
VisitStmt(D);
|
||||
Record.push_back(D->getNumClauses());
|
||||
VisitOMPExecutableDirective(D);
|
||||
Record.push_back(D->hasCancel() ? 1 : 0);
|
||||
Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;
|
||||
}
|
||||
|
||||
|
@ -2013,6 +2014,7 @@ void ASTStmtWriter::VisitOMPSimdDirective(OMPSimdDirective *D) {
|
|||
|
||||
void ASTStmtWriter::VisitOMPForDirective(OMPForDirective *D) {
|
||||
VisitOMPLoopDirective(D);
|
||||
Record.push_back(D->hasCancel() ? 1 : 0);
|
||||
Code = serialization::STMT_OMP_FOR_DIRECTIVE;
|
||||
}
|
||||
|
||||
|
@ -2025,12 +2027,14 @@ void ASTStmtWriter::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
|
|||
VisitStmt(D);
|
||||
Record.push_back(D->getNumClauses());
|
||||
VisitOMPExecutableDirective(D);
|
||||
Record.push_back(D->hasCancel() ? 1 : 0);
|
||||
Code = serialization::STMT_OMP_SECTIONS_DIRECTIVE;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitOMPSectionDirective(OMPSectionDirective *D) {
|
||||
VisitStmt(D);
|
||||
VisitOMPExecutableDirective(D);
|
||||
Record.push_back(D->hasCancel() ? 1 : 0);
|
||||
Code = serialization::STMT_OMP_SECTION_DIRECTIVE;
|
||||
}
|
||||
|
||||
|
@ -2056,6 +2060,7 @@ void ASTStmtWriter::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
|
|||
|
||||
void ASTStmtWriter::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
|
||||
VisitOMPLoopDirective(D);
|
||||
Record.push_back(D->hasCancel() ? 1 : 0);
|
||||
Code = serialization::STMT_OMP_PARALLEL_FOR_DIRECTIVE;
|
||||
}
|
||||
|
||||
|
@ -2070,6 +2075,7 @@ void ASTStmtWriter::VisitOMPParallelSectionsDirective(
|
|||
VisitStmt(D);
|
||||
Record.push_back(D->getNumClauses());
|
||||
VisitOMPExecutableDirective(D);
|
||||
Record.push_back(D->hasCancel() ? 1 : 0);
|
||||
Code = serialization::STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE;
|
||||
}
|
||||
|
||||
|
@ -2077,6 +2083,7 @@ void ASTStmtWriter::VisitOMPTaskDirective(OMPTaskDirective *D) {
|
|||
VisitStmt(D);
|
||||
Record.push_back(D->getNumClauses());
|
||||
VisitOMPExecutableDirective(D);
|
||||
Record.push_back(D->hasCancel() ? 1 : 0);
|
||||
Code = serialization::STMT_OMP_TASK_DIRECTIVE;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,6 +69,25 @@ for (int i = 0; i < argc; ++i) {
|
|||
}
|
||||
// CHECK: call i8* @__kmpc_omp_task_alloc(
|
||||
// CHECK: call i32 @__kmpc_omp_task(
|
||||
#pragma omp parallel sections
|
||||
{
|
||||
#pragma omp cancel sections
|
||||
}
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
|
||||
#pragma omp parallel sections
|
||||
{
|
||||
#pragma omp cancel sections
|
||||
#pragma omp section
|
||||
{
|
||||
#pragma omp cancel sections
|
||||
}
|
||||
}
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
|
||||
#pragma omp parallel for
|
||||
for (int i = 0; i < argc; ++i) {
|
||||
#pragma omp cancel for
|
||||
}
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
|
||||
return argc;
|
||||
}
|
||||
|
||||
|
@ -92,4 +111,46 @@ for (int i = 0; i < argc; ++i) {
|
|||
// CHECK: [[RETURN]]
|
||||
// CHECK: ret i32 0
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: @__kmpc_cancel
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t*
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t*
|
||||
// CHECK: ret void
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,12 +11,16 @@ int main (int argc, char **argv) {
|
|||
#pragma omp parallel
|
||||
{
|
||||
#pragma omp cancellation point parallel
|
||||
#pragma omp cancel parallel
|
||||
argv[0][0] = argc;
|
||||
}
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
|
||||
#pragma omp sections
|
||||
{
|
||||
{
|
||||
#pragma omp cancellation point sections
|
||||
#pragma omp cancel sections
|
||||
}
|
||||
}
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: @__kmpc_cancellationpoint
|
||||
|
@ -28,6 +32,7 @@ int main (int argc, char **argv) {
|
|||
#pragma omp section
|
||||
{
|
||||
#pragma omp cancellation point sections
|
||||
#pragma omp cancel sections
|
||||
}
|
||||
}
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
|
@ -51,6 +56,7 @@ int main (int argc, char **argv) {
|
|||
#pragma omp for
|
||||
for (int i = 0; i < argc; ++i) {
|
||||
#pragma omp cancellation point for
|
||||
#pragma omp cancel for
|
||||
}
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
|
||||
|
@ -66,9 +72,36 @@ for (int i = 0; i < argc; ++i) {
|
|||
#pragma omp task
|
||||
{
|
||||
#pragma omp cancellation point taskgroup
|
||||
#pragma omp cancel taskgroup
|
||||
}
|
||||
// CHECK: call i8* @__kmpc_omp_task_alloc(
|
||||
// CHECK: call i32 @__kmpc_omp_task(
|
||||
#pragma omp parallel sections
|
||||
{
|
||||
{
|
||||
#pragma omp cancellation point sections
|
||||
#pragma omp cancel sections
|
||||
}
|
||||
}
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
|
||||
#pragma omp parallel sections
|
||||
{
|
||||
{
|
||||
#pragma omp cancellation point sections
|
||||
#pragma omp cancel sections
|
||||
}
|
||||
#pragma omp section
|
||||
{
|
||||
#pragma omp cancellation point sections
|
||||
}
|
||||
}
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
|
||||
#pragma omp parallel for
|
||||
for (int i = 0; i < argc; ++i) {
|
||||
#pragma omp cancellation point for
|
||||
#pragma omp cancel for
|
||||
}
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
|
||||
return argc;
|
||||
}
|
||||
|
||||
|
@ -92,4 +125,46 @@ for (int i = 0; i < argc; ++i) {
|
|||
// CHECK: [[RETURN]]
|
||||
// CHECK: ret i32 0
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: @__kmpc_cancellationpoint
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t*
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t*
|
||||
// CHECK: ret void
|
||||
|
||||
#endif
|
||||
|
|
|
@ -357,7 +357,7 @@ void parallel_for(float *a) {
|
|||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_for_static_fini({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
|
||||
// TERM_DEBUG: call {{.+}} @__kmpc_cancel_barrier({{.+}}), !dbg [[DBG_LOC_CANCEL:![0-9]+]]
|
||||
// TERM_DEBUG: call {{.+}} @__kmpc_barrier({{.+}}), !dbg [[DBG_LOC_CANCEL:![0-9]+]]
|
||||
// TERM_DEBUG: [[TERM_LPAD]]
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
|
|
|
@ -92,7 +92,7 @@ int main() {
|
|||
// LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]]
|
||||
// LAMBDA: call void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]])
|
||||
// LAMBDA: call void @__kmpc_for_static_fini(
|
||||
// LAMBDA: call i32 @__kmpc_cancel_barrier(
|
||||
// LAMBDA: call void @__kmpc_barrier(
|
||||
[&]() {
|
||||
// LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
|
||||
// LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
|
||||
|
@ -136,7 +136,7 @@ int main() {
|
|||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}}
|
||||
// BLOCKS: call void {{%.+}}(i8
|
||||
// BLOCKS: call void @__kmpc_for_static_fini(
|
||||
// BLOCKS: call i32 @__kmpc_cancel_barrier(
|
||||
// BLOCKS: call void @__kmpc_barrier(
|
||||
^{
|
||||
// BLOCKS: define {{.+}} void {{@.+}}(i8*
|
||||
g = 2;
|
||||
|
@ -276,7 +276,7 @@ int main() {
|
|||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
#endif
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ int main() {
|
|||
// LAMBDA: store volatile i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G]],
|
||||
// LAMBDA: br label %[[LAST_DONE]]
|
||||
// LAMBDA: [[LAST_DONE]]
|
||||
// LAMBDA: call i32 @__kmpc_cancel_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
// LAMBDA: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
[&]() {
|
||||
// LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
|
||||
// LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
|
||||
|
@ -146,7 +146,7 @@ int main() {
|
|||
// BLOCKS: store volatile i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G]],
|
||||
// BLOCKS: br label %[[LAST_DONE]]
|
||||
// BLOCKS: [[LAST_DONE]]
|
||||
// BLOCKS: call i32 @__kmpc_cancel_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
// BLOCKS: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
g = 1;
|
||||
g1 = 1;
|
||||
^{
|
||||
|
@ -265,7 +265,7 @@ int main() {
|
|||
// CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
//
|
||||
|
@ -306,8 +306,8 @@ int main() {
|
|||
// CHECK-NEXT: br label %[[LAST_DONE]]
|
||||
// CHECK: [[LAST_DONE]]
|
||||
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void [[MAIN_MICROTASK2]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
|
||||
|
@ -338,8 +338,8 @@ int main() {
|
|||
// CHECK-NEXT: br label %[[LAST_DONE]]
|
||||
// CHECK: [[LAST_DONE]]
|
||||
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void [[MAIN_MICROTASK3]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
|
||||
|
@ -385,8 +385,8 @@ int main() {
|
|||
// CHECK-NEXT: br label %[[LAST_DONE]]
|
||||
// CHECK: [[LAST_DONE]]
|
||||
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
|
||||
|
@ -461,7 +461,7 @@ int main() {
|
|||
// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
#endif
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ int main() {
|
|||
// LAMBDA: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 [[GTID]])
|
||||
g += 5;
|
||||
g1 += 5;
|
||||
// LAMBDA: call i32 @__kmpc_cancel_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
// LAMBDA: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
[&]() {
|
||||
// LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
|
||||
// LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
|
||||
|
@ -131,7 +131,7 @@ int main() {
|
|||
// BLOCKS: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 [[GTID]])
|
||||
g += 5;
|
||||
g1 += 5;
|
||||
// BLOCKS: call i32 @__kmpc_cancel_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
// BLOCKS: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
g = 1;
|
||||
g1 = 5;
|
||||
^{
|
||||
|
@ -207,7 +207,7 @@ int main() {
|
|||
// CHECK: [[ADD:%.+]] = add nsw i64 [[LVAR_VAL]], 3
|
||||
// CHECK: store i64 [[ADD]], i64* [[LVAR_PRIV]],
|
||||
// CHECK: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 %{{.+}})
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
|
||||
|
@ -260,7 +260,7 @@ int main() {
|
|||
// CHECK: [[ADD:%.+]] = add nsw i32 [[LVAR_VAL]], 1
|
||||
// CHECK: store i32 [[ADD]], i32* [[LVAR_PRIV]],
|
||||
// CHECK: call void @__kmpc_for_static_fini(%{{.+}}* @{{.+}}, i32 %{{.+}})
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
#endif
|
||||
|
||||
|
|
|
@ -373,8 +373,8 @@ int main() {
|
|||
// CHECK: [[RED_DONE]]
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
|
||||
// CHECK: ret void
|
||||
|
||||
|
@ -613,7 +613,7 @@ int main() {
|
|||
// CHECK: [[RED_DONE]]
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
|
||||
|
|
|
@ -303,7 +303,7 @@ void simple(float *a, float *b, float *c, float *d) {
|
|||
// CHECK: [[A_PRIV_VAL:%.+]] = load i32, i32* [[A_PRIV]],
|
||||
// CHECK-NEXT: store i32 [[A_PRIV_VAL]], i32* %{{.+}},
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* {{.+}}, i32 %{{.+}})
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
|
||||
}
|
||||
int R;
|
||||
#pragma omp parallel
|
||||
|
@ -354,7 +354,7 @@ void simple(float *a, float *b, float *c, float *d) {
|
|||
// CHECK: [[RED:%.+]] = mul nsw i32 %{{.+}}, [[R_PRIV_VAL]]
|
||||
// CHECK-NEXT: store i32 [[RED]], i32* %{{.+}},
|
||||
// CHECK-NEXT: call void @__kmpc_end_reduce(
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* {{.+}}, i32 %{{.+}})
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK: [[ARGC_REF:%.+]] = load i32*, i32** [[ARGC_PTR_ADDR]]
|
||||
// CHECK-NEXT: [[ARGC:%.+]] = load i32, i32* [[ARGC_REF]]
|
||||
// CHECK-NEXT: invoke {{.*}}void [[FOO:@.+foo.+]](i32{{[ ]?[a-z]*}} [[ARGC]])
|
||||
// CHECK: call {{.+}} @__kmpc_cancel_barrier(
|
||||
// CHECK: call {{.+}} @__kmpc_barrier(
|
||||
// CHECK: ret void
|
||||
// CHECK: call {{.*}}void @{{.+terminate.*|abort}}(
|
||||
// CHECK-NEXT: unreachable
|
||||
|
@ -68,7 +68,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK-DEBUG: [[ARGC_REF:%.+]] = load i32*, i32** [[ARGC_PTR_ADDR]]
|
||||
// CHECK-DEBUG-NEXT: [[ARGC:%.+]] = load i32, i32* [[ARGC_REF]]
|
||||
// CHECK-DEBUG-NEXT: invoke void [[FOO:@.+foo.+]](i32 [[ARGC]])
|
||||
// CHECK-DEBUG: call {{.+}} @__kmpc_cancel_barrier(
|
||||
// CHECK-DEBUG: call {{.+}} @__kmpc_barrier(
|
||||
// CHECK-DEBUG: ret void
|
||||
// CHECK-DEBUG: call void @{{.+terminate.*|abort}}(
|
||||
// CHECK-DEBUG-NEXT: unreachable
|
||||
|
@ -101,7 +101,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK: [[ARGC_REF:%.+]] = load i8***, i8**** [[ARGC_PTR_ADDR]]
|
||||
// CHECK-NEXT: [[ARGC:%.+]] = load i8**, i8*** [[ARGC_REF]]
|
||||
// CHECK-NEXT: invoke {{.*}}void [[FOO1:@.+foo.+]](i8** [[ARGC]])
|
||||
// CHECK: call {{.+}} @__kmpc_cancel_barrier(
|
||||
// CHECK: call {{.+}} @__kmpc_barrier(
|
||||
// CHECK: ret void
|
||||
// CHECK: call {{.*}}void @{{.+terminate.*|abort}}(
|
||||
// CHECK-NEXT: unreachable
|
||||
|
@ -111,7 +111,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK-DEBUG: [[ARGC_REF:%.+]] = load i8***, i8**** [[ARGC_PTR_ADDR]]
|
||||
// CHECK-DEBUG-NEXT: [[ARGC:%.+]] = load i8**, i8*** [[ARGC_REF]]
|
||||
// CHECK-DEBUG-NEXT: invoke void [[FOO1:@.+foo.+]](i8** [[ARGC]])
|
||||
// CHECK-DEBUG: call {{.+}} @__kmpc_cancel_barrier(
|
||||
// CHECK-DEBUG: call {{.+}} @__kmpc_barrier(
|
||||
// CHECK-DEBUG: ret void
|
||||
// CHECK-DEBUG: call void @{{.+terminate.*|abort}}(
|
||||
// CHECK-DEBUG-NEXT: unreachable
|
||||
|
|
|
@ -118,8 +118,8 @@ int main() {
|
|||
// TLS-LAMBDA: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
|
||||
// TLS-LAMBDA: [[DONE]]
|
||||
|
||||
// LAMBDA: call {{.*}}i32 @__kmpc_cancel_barrier(
|
||||
// TLS-LAMBDA: call {{.*}}i32 @__kmpc_cancel_barrier(
|
||||
// LAMBDA: call {{.*}}void @__kmpc_barrier(
|
||||
// TLS-LAMBDA: call {{.*}}void @__kmpc_barrier(
|
||||
g = 1;
|
||||
// LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
|
||||
// TLS-LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}*
|
||||
|
@ -179,8 +179,8 @@ int main() {
|
|||
// TLS-BLOCKS: store volatile i{{[0-9]+}} %{{.+}}, i{{[0-9]+}}* [[G_CAPTURE_DST]], align 128
|
||||
// TLS-BLOCKS: [[DONE]]
|
||||
|
||||
// BLOCKS: call {{.*}}i32 @__kmpc_cancel_barrier(
|
||||
// TLS-BLOCKS: call {{.*}}i32 @__kmpc_cancel_barrier(
|
||||
// BLOCKS: call {{.*}}void @__kmpc_barrier(
|
||||
// TLS-BLOCKS: call {{.*}}void @__kmpc_barrier(
|
||||
g = 1;
|
||||
// BLOCKS: store volatile i{{[0-9]+}} 1, i{{[0-9]+}}*
|
||||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}}
|
||||
|
@ -309,12 +309,12 @@ int main() {
|
|||
|
||||
// TLS-CHECK: call {{.*}} [[S_FLOAT_TY_COPY_ASSIGN]]([[S_FLOAT_TY]]* {{.*}}[[VAR]], [[S_FLOAT_TY]]* {{.*}}[[MASTER_REF4]])
|
||||
|
||||
// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
|
||||
// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
|
||||
// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: ret void
|
||||
|
||||
// CHECK: define internal {{.*}}void [[MAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
|
||||
|
@ -345,12 +345,12 @@ int main() {
|
|||
// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[T_VAR]]
|
||||
// TLS-CHECK: [[DONE]]
|
||||
|
||||
// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
|
||||
// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
|
||||
// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: ret void
|
||||
|
||||
// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
|
||||
|
@ -430,12 +430,12 @@ int main() {
|
|||
|
||||
// TLS-CHECK: call {{.*}} [[S_INT_TY_COPY_ASSIGN]]([[S_INT_TY]]* {{.*}}[[TMAIN_VAR]], [[S_INT_TY]]* {{.*}}[[MASTER_REF3]])
|
||||
|
||||
// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
|
||||
// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
|
||||
// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: ret void
|
||||
|
||||
// CHECK: define internal {{.*}}void [[TMAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
|
||||
|
@ -466,12 +466,12 @@ int main() {
|
|||
// TLS-CHECK: store i32 [[MASTER_VAL]], i32* [[TMAIN_T_VAR]]
|
||||
// TLS-CHECK: [[DONE]]
|
||||
|
||||
// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// TLS-CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_ADDR]],
|
||||
// TLS-CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]],
|
||||
// TLS-CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
|
||||
// TLS-CHECK: ret void
|
||||
|
||||
#endif
|
||||
|
|
|
@ -65,7 +65,7 @@ int main() {
|
|||
// LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_REF_ADDR:%.+]]
|
||||
// LAMBDA: [[G_VAL:%.+]] = load volatile i{{[0-9]+}}, i{{[0-9]+}}* [[G_REF]], align 128
|
||||
// LAMBDA: store i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G_PRIVATE_ADDR]], align 128
|
||||
// LAMBDA: call {{.*}}i32 @__kmpc_cancel_barrier(
|
||||
// LAMBDA: call {{.*}}void @__kmpc_barrier(
|
||||
g = 1;
|
||||
// LAMBDA: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
|
||||
// LAMBDA: [[G_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
|
@ -97,7 +97,7 @@ int main() {
|
|||
// BLOCKS: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_REF_ADDR:%.+]],
|
||||
// BLOCKS: [[G_VAL:%.+]] = load volatile i{{[0-9]+}}, i{{[0-9]+}}* [[G_REF]], align 128
|
||||
// BLOCKS: store i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G_PRIVATE_ADDR]], align 128
|
||||
// BLOCKS: call {{.*}}i32 @__kmpc_cancel_barrier(
|
||||
// BLOCKS: call {{.*}}void @__kmpc_barrier(
|
||||
g = 1;
|
||||
// BLOCKS: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]],
|
||||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}}
|
||||
|
@ -172,7 +172,7 @@ int main() {
|
|||
// CHECK: call {{.*}} [[ST_TY_DESTR]]([[ST_TY]]* [[ST_TY_TEMP]])
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
// CHECK: ret void
|
||||
|
@ -216,7 +216,7 @@ int main() {
|
|||
// CHECK: call {{.*}} [[ST_TY_DESTR]]([[ST_TY]]* [[ST_TY_TEMP]])
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call {{.*}}i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call {{.*}}void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
// CHECK: ret void
|
||||
|
|
|
@ -341,7 +341,7 @@ int main() {
|
|||
// break;
|
||||
// CHECK: br label %[[RED_DONE]]
|
||||
// CHECK: [[RED_DONE]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
|
@ -572,7 +572,7 @@ int main() {
|
|||
// break;
|
||||
// CHECK: br label %[[RED_DONE]]
|
||||
// CHECK: [[RED_DONE]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
|
|
|
@ -95,8 +95,8 @@ int main() {
|
|||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK-NEXT: br label %[[END]]
|
||||
// CHECK: [[END]]
|
||||
// CHECK-NEXT: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_SINGLE_LOC]],
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_SINGLE_LOC]],
|
||||
// CHECK: call void @__kmpc_barrier(
|
||||
// CHECK: ret
|
||||
// CHECK: [[TERM_LPAD]]
|
||||
// CHECK: call void @__clang_call_terminate(i8*
|
||||
|
|
|
@ -92,7 +92,7 @@ int main() {
|
|||
// LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]]
|
||||
// LAMBDA: call void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]])
|
||||
// LAMBDA: call void @__kmpc_for_static_fini(
|
||||
// LAMBDA: call i32 @__kmpc_cancel_barrier(
|
||||
// LAMBDA: call void @__kmpc_barrier(
|
||||
#pragma omp section
|
||||
[&]() {
|
||||
// LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
|
||||
|
@ -135,7 +135,7 @@ int main() {
|
|||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}}
|
||||
// BLOCKS: call void {{%.+}}(i8
|
||||
// BLOCKS: call void @__kmpc_for_static_fini(
|
||||
// BLOCKS: call i32 @__kmpc_cancel_barrier(
|
||||
// BLOCKS: call void @__kmpc_barrier(
|
||||
#pragma omp section
|
||||
^{
|
||||
// BLOCKS: define {{.+}} void {{@.+}}(i8*
|
||||
|
@ -268,7 +268,7 @@ int main() {
|
|||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[SECTIONS_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SECTIONS_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
#endif
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ int main() {
|
|||
// LAMBDA: store volatile i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G]],
|
||||
// LAMBDA: br label %[[LAST_DONE]]
|
||||
// LAMBDA: [[LAST_DONE]]
|
||||
// LAMBDA: call i32 @__kmpc_cancel_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
// LAMBDA: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
#pragma omp section
|
||||
[&]() {
|
||||
// LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
|
||||
|
@ -142,7 +142,7 @@ int main() {
|
|||
// BLOCKS: store volatile i{{[0-9]+}} [[G_VAL]], i{{[0-9]+}}* [[G]],
|
||||
// BLOCKS: br label %[[LAST_DONE]]
|
||||
// BLOCKS: [[LAST_DONE]]
|
||||
// BLOCKS: call i32 @__kmpc_cancel_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
// BLOCKS: call void @__kmpc_barrier(%{{.+}}* @{{.+}}, i{{[0-9]+}} [[GTID]])
|
||||
#pragma omp section
|
||||
^{
|
||||
// BLOCKS: define {{.+}} void {{@.+}}(i8*
|
||||
|
@ -207,8 +207,8 @@ int main() {
|
|||
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
//
|
||||
|
@ -238,8 +238,8 @@ int main() {
|
|||
// CHECK-NEXT: br label %[[LAST_DONE]]
|
||||
// CHECK: [[LAST_DONE]]
|
||||
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[SECTIONS_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SECTIONS_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
|
||||
|
@ -311,10 +311,10 @@ int main() {
|
|||
// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[SECTIONS_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SECTIONS_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
#endif
|
||||
|
||||
|
|
|
@ -212,8 +212,8 @@ int main() {
|
|||
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
|
||||
// CHECK: ret void
|
||||
|
||||
|
@ -372,7 +372,7 @@ int main() {
|
|||
// CHECK: [[RED_DONE]]
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
|
||||
// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
|
||||
|
|
|
@ -84,7 +84,7 @@ int main() {
|
|||
// LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]]
|
||||
// LAMBDA: call void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]])
|
||||
// LAMBDA: call void @__kmpc_end_single(
|
||||
// LAMBDA: call i32 @__kmpc_cancel_barrier(
|
||||
// LAMBDA: call void @__kmpc_barrier(
|
||||
[&]() {
|
||||
// LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
|
||||
// LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
|
||||
|
@ -119,7 +119,7 @@ int main() {
|
|||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}}
|
||||
// BLOCKS: call void {{%.+}}(i8
|
||||
// BLOCKS: call void @__kmpc_end_single(
|
||||
// BLOCKS: call i32 @__kmpc_cancel_barrier(
|
||||
// BLOCKS: call void @__kmpc_barrier(
|
||||
^{
|
||||
// BLOCKS: define {{.+}} void {{@.+}}(i8*
|
||||
g = 2;
|
||||
|
@ -242,8 +242,8 @@ int main() {
|
|||
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: ret void
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue