Skip to content

Commit 61ca38a

Browse files
committed
First commit supporting 'release' directive. See more
- Took the oportunity to fix some warnings. - Do not asign DSA for release clauses. - Forbid multideps in release directive. - Only allow [weak](in|out|inout) in release depend clauses. Closes llvm#78 #70
1 parent 189fec4 commit 61ca38a

32 files changed

+907
-55
lines changed

clang/include/clang/AST/RecursiveASTVisitor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3595,6 +3595,9 @@ RecursiveASTVisitor<Derived>::TraverseOSSLoopDirective(OSSLoopDirective *S) {
35953595
DEF_TRAVERSE_STMT(OSSTaskwaitDirective,
35963596
{ TRY_TO(TraverseOSSExecutableDirective(S)); })
35973597

3598+
DEF_TRAVERSE_STMT(OSSReleaseDirective,
3599+
{ TRY_TO(TraverseOSSExecutableDirective(S)); })
3600+
35983601
DEF_TRAVERSE_STMT(OSSTaskDirective,
35993602
{ TRY_TO(TraverseOSSExecutableDirective(S)); })
36003603

clang/include/clang/AST/StmtOmpSs.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,57 @@ class OSSTaskwaitDirective : public OSSExecutableDirective {
275275
}
276276
};
277277

278+
/// This represents '#pragma oss release' directive.
279+
///
280+
/// \code
281+
/// #pragma oss release
282+
/// \endcode
283+
///
284+
class OSSReleaseDirective : public OSSExecutableDirective {
285+
friend class ASTStmtReader;
286+
/// Build directive with the given start and end location.
287+
///
288+
/// \param StartLoc Starting location of the directive kind.
289+
/// \param EndLoc Ending location of the directive.
290+
/// \param NumClauses Number of clauses.
291+
///
292+
OSSReleaseDirective(SourceLocation StartLoc, SourceLocation EndLoc, unsigned NumClauses)
293+
: OSSExecutableDirective(this, OSSReleaseDirectiveClass, OSSD_release,
294+
StartLoc, EndLoc, NumClauses, 0) {}
295+
296+
/// Build an empty directive.
297+
///
298+
/// \param NumClauses Number of clauses.
299+
///
300+
explicit OSSReleaseDirective(unsigned NumClauses)
301+
: OSSExecutableDirective(this, OSSReleaseDirectiveClass, OSSD_release,
302+
SourceLocation(), SourceLocation(), NumClauses, 0) {}
303+
304+
public:
305+
/// Creates directive.
306+
///
307+
/// \param C AST context.
308+
/// \param StartLoc Starting location of the directive kind.
309+
/// \param EndLoc Ending Location of the directive.
310+
/// \param Clauses List of clauses.
311+
///
312+
static OSSReleaseDirective *
313+
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
314+
ArrayRef<OSSClause *> Clauses);
315+
316+
/// Creates an empty directive.
317+
///
318+
/// \param C AST context.
319+
/// \param NumClauses Number of clauses.
320+
///
321+
static OSSReleaseDirective *CreateEmpty(const ASTContext &C, unsigned NumClauses,
322+
EmptyShell);
323+
324+
static bool classof(const Stmt *T) {
325+
return T->getStmtClass() == OSSReleaseDirectiveClass;
326+
}
327+
};
328+
278329
class OSSTaskDirective : public OSSExecutableDirective {
279330
friend class ASTStmtReader;
280331
/// Build directive with the given start and end location.

clang/include/clang/Basic/OmpSsKinds.def

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
#ifndef OMPSS_TASK_CLAUSE
2525
# define OMPSS_TASK_CLAUSE(Name)
2626
#endif
27+
#ifndef OMPSS_RELEASE_CLAUSE
28+
# define OMPSS_RELEASE_CLAUSE(Name)
29+
#endif
2730
#ifndef OMPSS_TASK_FOR_CLAUSE
2831
# define OMPSS_TASK_FOR_CLAUSE(Name)
2932
#endif
@@ -53,6 +56,7 @@
5356
OMPSS_DIRECTIVE(task)
5457
OMPSS_DIRECTIVE(taskloop)
5558
OMPSS_DIRECTIVE(taskwait)
59+
OMPSS_DIRECTIVE(release)
5660

5761
// OmpSs clauses.
5862
OMPSS_CLAUSE(if, OSSIfClause)
@@ -126,6 +130,15 @@ OMPSS_TASK_CLAUSE(weakinout)
126130
OMPSS_TASK_CLAUSE(weakcommutative)
127131
OMPSS_TASK_CLAUSE(weakreduction)
128132

133+
// Clauses allowed for OmpSs directive 'release'.
134+
OMPSS_RELEASE_CLAUSE(depend)
135+
OMPSS_RELEASE_CLAUSE(in)
136+
OMPSS_RELEASE_CLAUSE(out)
137+
OMPSS_RELEASE_CLAUSE(inout)
138+
OMPSS_RELEASE_CLAUSE(weakin)
139+
OMPSS_RELEASE_CLAUSE(weakout)
140+
OMPSS_RELEASE_CLAUSE(weakinout)
141+
129142
// Clauses allowed for OmpSs directive 'task for'.
130143
OMPSS_TASK_FOR_CLAUSE(if)
131144
OMPSS_TASK_FOR_CLAUSE(final)
@@ -235,6 +248,7 @@ OMPSS_DECLARE_TASK_CLAUSE(weakcommutative)
235248
#undef OMPSS_DECLARE_TASK_CLAUSE
236249
#undef OMPSS_TASKWAIT_CLAUSE
237250
#undef OMPSS_TASK_CLAUSE
251+
#undef OMPSS_RELEASE_CLAUSE
238252
#undef OMPSS_TASK_FOR_CLAUSE
239253
#undef OMPSS_TASKLOOP_CLAUSE
240254
#undef OMPSS_TASKLOOP_FOR_CLAUSE

clang/include/clang/Basic/StmtNodes.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ def OMPTargetTeamsDistributeSimdDirective : StmtNode<OMPLoopDirective>;
281281
def OSSExecutableDirective : StmtNode<Stmt, 1>;
282282
def OSSLoopDirective : StmtNode<OSSExecutableDirective, 1>;
283283
def OSSTaskwaitDirective : StmtNode<OSSExecutableDirective>;
284+
def OSSReleaseDirective : StmtNode<OSSExecutableDirective>;
284285
def OSSTaskDirective : StmtNode<OSSExecutableDirective>;
285286
def OSSTaskForDirective : StmtNode<OSSLoopDirective>;
286287
def OSSTaskLoopDirective : StmtNode<OSSLoopDirective>;

clang/include/clang/Parse/Parser.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1882,7 +1882,8 @@ class Parser : public CodeCompletionHandler {
18821882

18831883
ExprResult ParseOSSMultiDepExpression();
18841884
// Used to handle assignment exprs. and multideps
1885-
ExprResult ParseOSSAssignmentExpression(OmpSsClauseKind CKind);
1885+
ExprResult ParseOSSAssignmentExpression(
1886+
OmpSsDirectiveKind DKind, OmpSsClauseKind CKind);
18861887

18871888
//===--------------------------------------------------------------------===//
18881889
// C++ Expressions

clang/include/clang/Sema/Sema.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11051,6 +11051,11 @@ class Sema final {
1105111051
SourceLocation StartLoc,
1105211052
SourceLocation EndLoc);
1105311053

11054+
/// Called on well-formed '\#pragma oss taskwait'.
11055+
StmtResult ActOnOmpSsReleaseDirective(ArrayRef<OSSClause *> Clauses,
11056+
SourceLocation StartLoc,
11057+
SourceLocation EndLoc);
11058+
1105411059
/// Called on well-formed '\#pragma omp task' after parsing of the
1105511060
/// associated statement.
1105611061
StmtResult ActOnOmpSsTaskDirective(ArrayRef<OSSClause *> Clauses,

clang/lib/AST/StmtOmpSs.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,25 @@ OSSTaskwaitDirective *OSSTaskwaitDirective::CreateEmpty(const ASTContext &C,
4242
return new (Mem) OSSTaskwaitDirective(NumClauses);
4343
}
4444

45+
OSSReleaseDirective *
46+
OSSReleaseDirective::Create(const ASTContext &C, SourceLocation StartLoc,
47+
SourceLocation EndLoc, ArrayRef<OSSClause *> Clauses) {
48+
unsigned Size = llvm::alignTo(sizeof(OSSReleaseDirective), alignof(OSSClause *));
49+
void *Mem = C.Allocate(Size + sizeof(OSSClause *) * Clauses.size());
50+
OSSReleaseDirective *Dir =
51+
new (Mem) OSSReleaseDirective(StartLoc, EndLoc, Clauses.size());
52+
Dir->setClauses(Clauses);
53+
return Dir;
54+
}
55+
56+
OSSReleaseDirective *OSSReleaseDirective::CreateEmpty(const ASTContext &C,
57+
unsigned NumClauses,
58+
EmptyShell) {
59+
unsigned Size = llvm::alignTo(sizeof(OSSReleaseDirective), alignof(OSSClause *));
60+
void *Mem = C.Allocate(Size + sizeof(OSSClause *) * NumClauses);
61+
return new (Mem) OSSReleaseDirective(NumClauses);
62+
}
63+
4564
OSSTaskDirective *
4665
OSSTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
4766
SourceLocation EndLoc, ArrayRef<OSSClause *> Clauses, Stmt *AStmt) {

clang/lib/AST/StmtPrinter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,11 @@ void StmtPrinter::VisitOSSTaskwaitDirective(OSSTaskwaitDirective *Node) {
11471147
PrintOSSExecutableDirective(Node);
11481148
}
11491149

1150+
void StmtPrinter::VisitOSSReleaseDirective(OSSReleaseDirective *Node) {
1151+
Indent() << "#pragma oss release";
1152+
PrintOSSExecutableDirective(Node);
1153+
}
1154+
11501155
void StmtPrinter::VisitOSSTaskDirective(OSSTaskDirective *Node) {
11511156
Indent() << "#pragma oss task";
11521157
PrintOSSExecutableDirective(Node);

clang/lib/AST/StmtProfile.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,6 +1125,10 @@ void StmtProfiler::VisitOSSTaskwaitDirective(const OSSTaskwaitDirective *S) {
11251125
VisitOSSExecutableDirective(S);
11261126
}
11271127

1128+
void StmtProfiler::VisitOSSReleaseDirective(const OSSReleaseDirective *S) {
1129+
VisitOSSExecutableDirective(S);
1130+
}
1131+
11281132
void StmtProfiler::VisitOSSTaskDirective(const OSSTaskDirective *S) {
11291133
VisitOSSExecutableDirective(S);
11301134
}

clang/lib/Basic/OmpSsKinds.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,16 @@ bool clang::isAllowedClauseForDirective(OmpSsDirectiveKind DKind,
223223
#define OMPSS_TASKWAIT_CLAUSE(Name) \
224224
case OSSC_##Name: \
225225
return true;
226+
#include "clang/Basic/OmpSsKinds.def"
227+
default:
228+
break;
229+
}
230+
break;
231+
case OSSD_release:
232+
switch (CKind) {
233+
#define OMPSS_RELEASE_CLAUSE(Name) \
234+
case OSSC_##Name: \
235+
return true;
226236
#include "clang/Basic/OmpSsKinds.def"
227237
default:
228238
break;
@@ -240,7 +250,9 @@ bool clang::isOmpSsPrivate(OmpSsClauseKind Kind) {
240250
}
241251

242252
bool clang::isOmpSsTaskingDirective(OmpSsDirectiveKind Kind) {
243-
return Kind == OSSD_task || isOmpSsLoopDirective(Kind);
253+
return Kind == OSSD_task
254+
|| Kind == OSSD_declare_task
255+
|| isOmpSsLoopDirective(Kind);
244256
}
245257

246258
bool clang::isOmpSsLoopDirective(OmpSsDirectiveKind Kind) {

clang/lib/CodeGen/CGOmpSsRuntime.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ enum OmpSsBundleKind {
4545
OSSB_taskloop,
4646
OSSB_taskloop_for,
4747
OSSB_taskwait,
48+
OSSB_release,
4849
OSSB_shared,
4950
OSSB_private,
5051
OSSB_firstprivate,
@@ -107,6 +108,8 @@ const char *getBundleStr(OmpSsBundleKind Kind) {
107108
return "TASKLOOP.FOR";
108109
case OSSB_taskwait:
109110
return "TASKWAIT";
111+
case OSSB_release:
112+
return "RELEASE";
110113
case OSSB_shared:
111114
return "QUAL.OSS.SHARED";
112115
case OSSB_private:
@@ -2148,6 +2151,32 @@ void CGOmpSsRuntime::emitTaskwaitCall(CodeGenFunction &CGF,
21482151
}
21492152
}
21502153

2154+
void CGOmpSsRuntime::emitReleaseCall(
2155+
CodeGenFunction &CGF, SourceLocation Loc, const OSSTaskDataTy &Data) {
2156+
2157+
SmallVector<llvm::OperandBundleDef, 8> ReleaseInfo;
2158+
2159+
ReleaseInfo.emplace_back(
2160+
getBundleStr(OSSB_directive),
2161+
llvm::ConstantDataArray::getString(CGM.getLLVMContext(), getBundleStr(OSSB_release)));
2162+
2163+
// Push Task Stack
2164+
TaskStack.push_back(TaskContext());
2165+
CaptureMapStack.push_back(CaptureMapTy());
2166+
2167+
// TODO: rename this since we have release directive
2168+
InTaskEmission = true;
2169+
EmitDirectiveData(CGF, Data, ReleaseInfo);
2170+
InTaskEmission = false;
2171+
2172+
llvm::Function *Callee = CGM.getIntrinsic(llvm::Intrinsic::directive_marker);
2173+
CGF.Builder.CreateCall(Callee, {}, llvm::makeArrayRef(ReleaseInfo));
2174+
2175+
// Pop Task Stack
2176+
TaskStack.pop_back();
2177+
CaptureMapStack.pop_back();
2178+
}
2179+
21512180
// We're in task body context once we set InsertPt
21522181
bool CGOmpSsRuntime::inTaskBody() {
21532182
return !TaskStack.empty() && TaskStack.back().InsertPt;

clang/lib/CodeGen/CGOmpSsRuntime.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class CGOmpSsRuntime {
264264
virtual void emitTaskwaitCall(CodeGenFunction &CGF,
265265
SourceLocation Loc,
266266
const OSSTaskDataTy &Data);
267+
/// Emit code for 'release' directive.
268+
virtual void emitReleaseCall(
269+
CodeGenFunction &CGF, SourceLocation Loc, const OSSTaskDataTy &Data);
267270
/// Emit code for 'task' directive.
268271
virtual void emitTaskCall(CodeGenFunction &CGF,
269272
const OSSExecutableDirective &D,

clang/lib/CodeGen/CGStmt.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,9 @@ void CodeGenFunction::EmitStmt(const Stmt *S, ArrayRef<const Attr *> Attrs) {
372372
case Stmt::OSSTaskwaitDirectiveClass:
373373
EmitOSSTaskwaitDirective(cast<OSSTaskwaitDirective>(*S));
374374
break;
375+
case Stmt::OSSReleaseDirectiveClass:
376+
EmitOSSReleaseDirective(cast<OSSReleaseDirective>(*S));
377+
break;
375378
case Stmt::OSSTaskDirectiveClass:
376379
EmitOSSTaskDirective(cast<OSSTaskDirective>(*S));
377380
break;

clang/lib/CodeGen/CGStmtOmpSs.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,13 @@ void CodeGenFunction::EmitOSSTaskwaitDirective(const OSSTaskwaitDirective &S) {
240240
CGM.getOmpSsRuntime().emitTaskwaitCall(*this, S.getBeginLoc(), Data);
241241
}
242242

243+
void CodeGenFunction::EmitOSSReleaseDirective(const OSSReleaseDirective &S) {
244+
OSSTaskDataTy Data;
245+
246+
AddDepData(S, Data.Deps);
247+
CGM.getOmpSsRuntime().emitReleaseCall(*this, S.getBeginLoc(), Data);
248+
}
249+
243250
void CodeGenFunction::EmitOSSTaskDirective(const OSSTaskDirective &S) {
244251
OSSTaskDataTy Data;
245252

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3316,6 +3316,7 @@ class CodeGenFunction : public CodeGenTypeCache {
33163316

33173317
// OmpSs statements
33183318
void EmitOSSTaskwaitDirective(const OSSTaskwaitDirective &S);
3319+
void EmitOSSReleaseDirective(const OSSReleaseDirective &S);
33193320
void EmitOSSTaskDirective(const OSSTaskDirective &S);
33203321
void EmitOSSTaskForDirective(const OSSTaskForDirective &S);
33213322
void EmitOSSTaskLoopDirective(const OSSTaskLoopDirective &S);

clang/lib/Parse/ParseExpr.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3494,7 +3494,10 @@ ExprResult Parser::ParseOSSMultiDepExpression() {
34943494
return ExprError();
34953495
}
34963496

3497-
ExprResult Parser::ParseOSSAssignmentExpression(OmpSsClauseKind CKind) {
3497+
ExprResult Parser::ParseOSSAssignmentExpression(
3498+
OmpSsDirectiveKind DKind, OmpSsClauseKind CKind) {
3499+
if (!isOmpSsTaskingDirective(DKind))
3500+
return ParseAssignmentExpression();
34983501
if (Tok.is(tok::l_brace) &&
34993502
(CKind == OSSC_depend
35003503
|| CKind == OSSC_in || CKind == OSSC_out || CKind == OSSC_inout

clang/lib/Parse/ParseOmpSs.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,8 @@ static bool parseDeclareTaskClauses(
295295
case OSSC_default:
296296
P.ParseOmpSsSimpleClauseImpl(CKind, SimpleData);
297297
break;
298+
case OSSC_chunksize:
299+
case OSSC_grainsize:
298300
case OSSC_weakconcurrent:
299301
case OSSC_reduction:
300302
case OSSC_weakreduction:
@@ -501,6 +503,7 @@ Parser::DeclGroupPtrTy Parser::ParseOmpSsDeclarativeDirectiveWithExtDecl(
501503
case OSSD_taskloop:
502504
case OSSD_taskloop_for:
503505
case OSSD_taskwait:
506+
case OSSD_release:
504507
Diag(Tok, diag::err_oss_unexpected_directive)
505508
<< 1 << getOmpSsDirectiveName(DKind);
506509
break;
@@ -534,6 +537,10 @@ Parser::DeclGroupPtrTy Parser::ParseOmpSsDeclarativeDirectiveWithExtDecl(
534537
/// executable-directive:
535538
/// annot_pragma_ompss 'taskwait'
536539
/// annot_pragma_ompss 'task'
540+
/// annot_pragma_ompss 'task for'
541+
/// annot_pragma_ompss 'taskloop'
542+
/// annot_pragma_ompss 'taskloop for'
543+
/// annot_pragma_ompss 'release'
537544
/// annot_pragma_ompss_end
538545
///
539546
StmtResult Parser::ParseOmpSsDeclarativeOrExecutableDirective(
@@ -551,6 +558,7 @@ StmtResult Parser::ParseOmpSsDeclarativeOrExecutableDirective(
551558
bool HasAssociatedStatement = true;
552559
switch (DKind) {
553560
case OSSD_taskwait:
561+
case OSSD_release:
554562
HasAssociatedStatement = false;
555563
LLVM_FALLTHROUGH;
556564
case OSSD_task_for:
@@ -675,7 +683,9 @@ Parser::OSSClauseList Parser::ParseOmpSsClauses(OmpSsDirectiveKind DKind, Source
675683
// Consume final annot_pragma_ompss_end.
676684
ConsumeAnnotationToken();
677685

678-
Actions.ActOnOmpSsAfterClauseGathering(Clauses);
686+
// 'release' does not need clause analysis
687+
if (DKind != OSSD_release)
688+
Actions.ActOnOmpSsAfterClauseGathering(Clauses);
679689

680690
return Clauses;
681691
}
@@ -1220,7 +1230,7 @@ bool Parser::ParseOmpSsVarList(OmpSsDirectiveKind DKind,
12201230
Tok.isNot(tok::annot_pragma_ompss_end))) {
12211231
// Parse variable
12221232
ExprResult VarExpr =
1223-
Actions.CorrectDelayedTyposInExpr(ParseOSSAssignmentExpression(Kind));
1233+
Actions.CorrectDelayedTyposInExpr(ParseOSSAssignmentExpression(DKind, Kind));
12241234
if (VarExpr.isUsable()) {
12251235
Vars.push_back(VarExpr.get());
12261236
} else {

clang/lib/Sema/SemaExceptionSpec.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,10 @@ CanThrowResult Sema::canThrow(const Stmt *S) {
14921492
// OmpSs
14931493
case Stmt::OSSTaskDirectiveClass:
14941494
case Stmt::OSSTaskwaitDirectiveClass:
1495+
case Stmt::OSSReleaseDirectiveClass:
1496+
case Stmt::OSSTaskForDirectiveClass:
1497+
case Stmt::OSSTaskLoopDirectiveClass:
1498+
case Stmt::OSSTaskLoopForDirectiveClass:
14951499
case Stmt::ReturnStmtClass:
14961500
case Stmt::SEHExceptStmtClass:
14971501
case Stmt::SEHFinallyStmtClass:

0 commit comments

Comments
 (0)