diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-04 22:11:23 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-04 22:11:23 +0000 | 
| commit | 0c75eea8f661a82866688fd1fc4465883c4dd7d5 (patch) | |
| tree | 96848f3b7cc25f95142a52b6dd2ba93f1de6e413 /lib/Sema/SemaOpenMP.cpp | |
| parent | bab175ec4b075c8076ba14c762900392533f6ee4 (diff) | |
Notes
Diffstat (limited to 'lib/Sema/SemaOpenMP.cpp')
| -rw-r--r-- | lib/Sema/SemaOpenMP.cpp | 64 | 
1 files changed, 60 insertions, 4 deletions
diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 804aadc0ff77e..edceb537df75d 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -1700,7 +1700,8 @@ void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) {    case OMPD_teams_distribute_parallel_for_simd:    case OMPD_teams_distribute_parallel_for:    case OMPD_target_teams_distribute: -  case OMPD_target_teams_distribute_parallel_for: { +  case OMPD_target_teams_distribute_parallel_for: +  case OMPD_target_teams_distribute_parallel_for_simd: {      QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);      QualType KmpInt32PtrTy =          Context.getPointerType(KmpInt32Ty).withConst().withRestrict(); @@ -2439,6 +2440,12 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(      AllowedNameModifiers.push_back(OMPD_target);      AllowedNameModifiers.push_back(OMPD_parallel);      break; +  case OMPD_target_teams_distribute_parallel_for_simd: +    Res = ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective( +        ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA); +    AllowedNameModifiers.push_back(OMPD_target); +    AllowedNameModifiers.push_back(OMPD_parallel); +    break;    case OMPD_declare_target:    case OMPD_end_declare_target:    case OMPD_threadprivate: @@ -6375,6 +6382,52 @@ StmtResult Sema::ActOnOpenMPTargetTeamsDistributeParallelForDirective(        Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);  } +StmtResult Sema::ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective( +    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' with number of loops, it will +  // define the nested loops number. +  auto NestedLoopCount = CheckOpenMPLoop( +      OMPD_target_teams_distribute_parallel_for_simd, +      getCollapseNumberExpr(Clauses), +      nullptr /*ordered not a clause on distribute*/, AStmt, *this, *DSAStack, +      VarsWithImplicitDSA, B); +  if (NestedLoopCount == 0) +    return StmtError(); + +  assert((CurContext->isDependentContext() || B.builtAll()) && +         "omp target teams distribute parallel for simd 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, +                                     DSAStack)) +          return StmtError(); +    } +  } + +  getCurFunction()->setHasBranchProtectedScope(); +  return OMPTargetTeamsDistributeParallelForSimdDirective::Create( +      Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); +} +  OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,                                               SourceLocation StartLoc,                                               SourceLocation LParenLoc, @@ -7397,7 +7450,8 @@ OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,      if (CurrDir == OMPD_target || CurrDir == OMPD_target_parallel ||          CurrDir == OMPD_target_teams ||          CurrDir == OMPD_target_teams_distribute || -        CurrDir == OMPD_target_teams_distribute_parallel_for) { +        CurrDir == OMPD_target_teams_distribute_parallel_for || +        CurrDir == OMPD_target_teams_distribute_parallel_for_simd) {        OpenMPClauseKind ConflictKind;        if (DSAStack->checkMappableExprComponentListsForDecl(                VD, /*CurrentRegionOnly=*/true, @@ -7657,7 +7711,8 @@ OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList,        if (CurrDir == OMPD_target || CurrDir == OMPD_target_parallel ||            CurrDir == OMPD_target_teams ||            CurrDir == OMPD_target_teams_distribute || -          CurrDir == OMPD_target_teams_distribute_parallel_for) { +          CurrDir == OMPD_target_teams_distribute_parallel_for || +          CurrDir == OMPD_target_teams_distribute_parallel_for_simd) {          OpenMPClauseKind ConflictKind;          if (DSAStack->checkMappableExprComponentListsForDecl(                  VD, /*CurrentRegionOnly=*/true, @@ -10175,7 +10230,8 @@ checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS,        // attribute clause on the same construct        if ((DKind == OMPD_target || DKind == OMPD_target_teams ||             DKind == OMPD_target_teams_distribute || -           DKind == OMPD_target_teams_distribute_parallel_for) && VD) { +           DKind == OMPD_target_teams_distribute_parallel_for || +           DKind == OMPD_target_teams_distribute_parallel_for_simd) && VD) {          auto DVar = DSAS->getTopDSA(VD, false);          if (isOpenMPPrivate(DVar.CKind)) {            SemaRef.Diag(ELoc, diag::err_omp_variable_in_given_clause_and_dsa)  | 
