diff options
author | Arpith Chacko Jacob <acjacob@us.ibm.com> | 2016-02-03 15:46:42 +0000 |
---|---|---|
committer | Arpith Chacko Jacob <acjacob@us.ibm.com> | 2016-02-03 15:46:42 +0000 |
commit | 05bebb578a54774d9fc530600157dcf8bbd09532 (patch) | |
tree | 47f8b62ccca6d89437e7dbeeddb0f231bab50ebf /clang/lib/Sema/SemaOpenMP.cpp | |
parent | 23aea0d5d056d51070dc68ce609ee3c5b6eb5a38 (diff) | |
download | bcm5719-llvm-05bebb578a54774d9fc530600157dcf8bbd09532.tar.gz bcm5719-llvm-05bebb578a54774d9fc530600157dcf8bbd09532.zip |
[OpenMP] Parsing + sema for target parallel for directive.
Summary:
This patch adds parsing + sema for the target parallel for directive along with testcases.
Reviewers: ABataev
Differential Revision: http://reviews.llvm.org/D16759
llvm-svn: 259654
Diffstat (limited to 'clang/lib/Sema/SemaOpenMP.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 161 |
1 files changed, 159 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index b219e92ebeb..09cbca50696 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1630,7 +1630,8 @@ void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) { } case OMPD_target_data: case OMPD_target: - case OMPD_target_parallel: { + case OMPD_target_parallel: + case OMPD_target_parallel_for: { Sema::CapturedParamNameType Params[] = { std::make_pair(StringRef(), QualType()) // __context with shared vars }; @@ -1807,6 +1808,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | parallel | atomic | * | // | parallel | target | * | // | parallel | target parallel | * | + // | parallel | target parallel | * | + // | | for | | // | parallel | target enter | * | // | | data | | // | parallel | target exit | * | @@ -1841,6 +1844,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | for | atomic | * | // | for | target | * | // | for | target parallel | * | + // | for | target parallel | * | + // | | for | | // | for | target enter | * | // | | data | | // | for | target exit | * | @@ -1875,6 +1880,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | master | atomic | * | // | master | target | * | // | master | target parallel | * | + // | master | target parallel | * | + // | | for | | // | master | target enter | * | // | | data | | // | master | target exit | * | @@ -1908,6 +1915,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | critical | atomic | * | // | critical | target | * | // | critical | target parallel | * | + // | critical | target parallel | * | + // | | for | | // | critical | target enter | * | // | | data | | // | critical | target exit | * | @@ -1942,6 +1951,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | simd | atomic | | // | simd | target | | // | simd | target parallel | | + // | simd | target parallel | | + // | | for | | // | simd | target enter | | // | | data | | // | simd | target exit | | @@ -1976,6 +1987,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | for simd | atomic | | // | for simd | target | | // | for simd | target parallel | | + // | for simd | target parallel | | + // | | for | | // | for simd | target enter | | // | | data | | // | for simd | target exit | | @@ -2010,6 +2023,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | parallel for simd| atomic | | // | parallel for simd| target | | // | parallel for simd| target parallel | | + // | parallel for simd| target parallel | | + // | | for | | // | parallel for simd| target enter | | // | | data | | // | parallel for simd| target exit | | @@ -2044,6 +2059,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | sections | atomic | * | // | sections | target | * | // | sections | target parallel | * | + // | sections | target parallel | * | + // | | for | | // | sections | target enter | * | // | | data | | // | sections | target exit | * | @@ -2078,6 +2095,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | section | atomic | * | // | section | target | * | // | section | target parallel | * | + // | section | target parallel | * | + // | | for | | // | section | target enter | * | // | | data | | // | section | target exit | * | @@ -2112,6 +2131,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | single | atomic | * | // | single | target | * | // | single | target parallel | * | + // | single | target parallel | * | + // | | for | | // | single | target enter | * | // | | data | | // | single | target exit | * | @@ -2146,6 +2167,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | parallel for | atomic | * | // | parallel for | target | * | // | parallel for | target parallel | * | + // | parallel for | target parallel | * | + // | | for | | // | parallel for | target enter | * | // | | data | | // | parallel for | target exit | * | @@ -2180,6 +2203,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | parallel sections| atomic | * | // | parallel sections| target | * | // | parallel sections| target parallel | * | + // | parallel sections| target parallel | * | + // | | for | | // | parallel sections| target enter | * | // | | data | | // | parallel sections| target exit | * | @@ -2214,6 +2239,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | task | atomic | * | // | task | target | * | // | task | target parallel | * | + // | task | target parallel | * | + // | | for | | // | task | target enter | * | // | | data | | // | task | target exit | * | @@ -2248,6 +2275,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | ordered | atomic | * | // | ordered | target | * | // | ordered | target parallel | * | + // | ordered | target parallel | * | + // | | for | | // | ordered | target enter | * | // | | data | | // | ordered | target exit | * | @@ -2282,6 +2311,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | atomic | atomic | | // | atomic | target | | // | atomic | target parallel | | + // | atomic | target parallel | | + // | | for | | // | atomic | target enter | | // | | data | | // | atomic | target exit | | @@ -2316,6 +2347,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | target | atomic | * | // | target | target | | // | target | target parallel | | + // | target | target parallel | | + // | | for | | // | target | target enter | | // | | data | | // | target | target exit | | @@ -2350,6 +2383,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | target parallel | atomic | * | // | target parallel | target | | // | target parallel | target parallel | | + // | target parallel | target parallel | | + // | | for | | // | target parallel | target enter | | // | | data | | // | target parallel | target exit | | @@ -2362,6 +2397,69 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | target parallel | taskloop simd | * | // | target parallel | distribute | | // +------------------+-----------------+------------------------------------+ + // | target parallel | parallel | * | + // | for | | | + // | target parallel | for | * | + // | for | | | + // | target parallel | for simd | * | + // | for | | | + // | target parallel | master | * | + // | for | | | + // | target parallel | critical | * | + // | for | | | + // | target parallel | simd | * | + // | for | | | + // | target parallel | sections | * | + // | for | | | + // | target parallel | section | * | + // | for | | | + // | target parallel | single | * | + // | for | | | + // | target parallel | parallel for | * | + // | for | | | + // | target parallel |parallel for simd| * | + // | for | | | + // | target parallel |parallel sections| * | + // | for | | | + // | target parallel | task | * | + // | for | | | + // | target parallel | taskyield | * | + // | for | | | + // | target parallel | barrier | * | + // | for | | | + // | target parallel | taskwait | * | + // | for | | | + // | target parallel | taskgroup | * | + // | for | | | + // | target parallel | flush | * | + // | for | | | + // | target parallel | ordered | * | + // | for | | | + // | target parallel | atomic | * | + // | for | | | + // | target parallel | target | | + // | for | | | + // | target parallel | target parallel | | + // | for | | | + // | target parallel | target parallel | | + // | for | for | | + // | target parallel | target enter | | + // | for | data | | + // | target parallel | target exit | | + // | for | data | | + // | target parallel | teams | | + // | for | | | + // | target parallel | cancellation | | + // | for | point | ! | + // | target parallel | cancel | ! | + // | for | | | + // | target parallel | taskloop | * | + // | for | | | + // | target parallel | taskloop simd | * | + // | for | | | + // | target parallel | distribute | | + // | for | | | + // +------------------+-----------------+------------------------------------+ // | teams | parallel | * | // | teams | for | + | // | teams | for simd | + | @@ -2384,6 +2482,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | teams | atomic | + | // | teams | target | + | // | teams | target parallel | + | + // | teams | target parallel | + | + // | | for | | // | teams | target enter | + | // | | data | | // | teams | target exit | + | @@ -2418,6 +2518,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | taskloop | atomic | * | // | taskloop | target | * | // | taskloop | target parallel | * | + // | taskloop | target parallel | * | + // | | for | | // | taskloop | target enter | * | // | | data | | // | taskloop | target exit | * | @@ -2451,6 +2553,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | taskloop simd | atomic | | // | taskloop simd | target | | // | taskloop simd | target parallel | | + // | taskloop simd | target parallel | | + // | | for | | // | taskloop simd | target enter | | // | | data | | // | taskloop simd | target exit | | @@ -2485,6 +2589,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | distribute | atomic | * | // | distribute | target | | // | distribute | target parallel | | + // | distribute | target parallel | | + // | | for | | // | distribute | target enter | | // | | data | | // | distribute | target exit | | @@ -2561,7 +2667,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, (ParentRegion == OMPD_parallel || ParentRegion == OMPD_target_parallel)) || (CancelRegion == OMPD_for && - (ParentRegion == OMPD_for || ParentRegion == OMPD_parallel_for)) || + (ParentRegion == OMPD_for || ParentRegion == OMPD_parallel_for || + ParentRegion == OMPD_target_parallel_for)) || (CancelRegion == OMPD_taskgroup && ParentRegion == OMPD_task) || (CancelRegion == OMPD_sections && (ParentRegion == OMPD_section || ParentRegion == OMPD_sections || @@ -2924,6 +3031,12 @@ StmtResult Sema::ActOnOpenMPExecutableDirective( AllowedNameModifiers.push_back(OMPD_target); AllowedNameModifiers.push_back(OMPD_parallel); break; + case OMPD_target_parallel_for: + Res = ActOnOpenMPTargetParallelForDirective( + ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA); + AllowedNameModifiers.push_back(OMPD_target); + AllowedNameModifiers.push_back(OMPD_parallel); + break; case OMPD_cancellation_point: assert(ClausesWithImplicit.empty() && "No clauses are allowed for 'omp cancellation point' directive"); @@ -5710,6 +5823,50 @@ Sema::ActOnOpenMPTargetParallelDirective(ArrayRef<OMPClause *> Clauses, AStmt); } +StmtResult Sema::ActOnOpenMPTargetParallelForDirective( + ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, + SourceLocation EndLoc, + llvm::DenseMap<ValueDecl *, Expr *> &VarsWithImplicitDSA) { + if (!AStmt) + return StmtError(); + + CapturedStmt *CS = cast<CapturedStmt>(AStmt); + // 1.2.2 OpenMP Language Terminology + // Structured block - An executable statement with a single entry at the + // top and a single exit at the bottom. + // The point of exit cannot be a branch out of the structured block. + // longjmp() and throw() must not violate the entry/exit criteria. + CS->getCapturedDecl()->setNothrow(); + + OMPLoopDirective::HelperExprs B; + // In presence of clause 'collapse' or 'ordered' with number of loops, it will + // define the nested loops number. + unsigned NestedLoopCount = + CheckOpenMPLoop(OMPD_target_parallel_for, getCollapseNumberExpr(Clauses), + getOrderedNumberExpr(Clauses), AStmt, *this, *DSAStack, + VarsWithImplicitDSA, B); + if (NestedLoopCount == 0) + return StmtError(); + + assert((CurContext->isDependentContext() || B.builtAll()) && + "omp target parallel for loop exprs were not built"); + + if (!CurContext->isDependentContext()) { + // Finalize the clauses that need pre-built expressions for CodeGen. + for (auto C : Clauses) { + if (auto LC = dyn_cast<OMPLinearClause>(C)) + if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), + B.NumIterations, *this, CurScope)) + return StmtError(); + } + } + + getCurFunction()->setHasBranchProtectedScope(); + return OMPTargetParallelForDirective::Create(Context, StartLoc, EndLoc, + NestedLoopCount, Clauses, AStmt, + B, DSAStack->isCancelRegion()); +} + /// \brief Check for existence of a map clause in the list of clauses. static bool HasMapClause(ArrayRef<OMPClause *> Clauses) { for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); |