[PATCH] D71475: [WIP][OPENMP] Try to fix linear clause crash by emitting alloca for step

Alexey Bataev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 17 09:55:31 PST 2019


ABataev added a comment.

The fixed patch. Several codegen tests require some adjustment.

  diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
  index afe0f1a..ecb0fb2 100644
  --- a/clang/lib/Sema/SemaOpenMP.cpp
  +++ b/clang/lib/Sema/SemaOpenMP.cpp
  @@ -919,6 +919,11 @@ static const Expr *getExprAsWritten(const Expr *E) {
  
     if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
       E = ICE->getSubExprAsWritten();
  +
  +  if (const auto *DRE = dyn_cast<DeclRefExpr>(E))
  +    if (const auto *CED = dyn_cast<OMPCapturedExprDecl>(DRE->getDecl()))
  +      E = getExprAsWritten(CED->getInit());
  +
     return E->IgnoreParens();
   }
  
  @@ -3830,6 +3835,9 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
             MarkDeclarationsReferencedInExpr(E);
           }
         }
  +      if (auto *LC = dyn_cast<OMPLinearClause>(Clause))
  +        if (Expr *E = LC->getStep())
  +          MarkDeclarationsReferencedInExpr(E);
         DSAStack->setForceVarCapturing(/*V=*/false);
       } else if (CaptureRegions.size() > 1 ||
                  CaptureRegions.back() != OMPD_unknown) {
  @@ -11396,12 +11404,88 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
         llvm_unreachable("Unknown OpenMP directive");
       }
       break;
  +  case OMPC_linear:
  +    switch (DKind) {
  +    case OMPD_taskloop_simd:
  +    case OMPD_master_taskloop_simd:
  +    case OMPD_parallel_master_taskloop_simd:
  +      CaptureRegion = OMPD_taskloop;
  +      break;
  +    case OMPD_target_simd:
  +      CaptureRegion = OMPD_target;
  +      break;
  +    case OMPD_target_teams_distribute_simd:
  +    case OMPD_teams_distribute_simd:
  +      CaptureRegion = OMPD_teams;
  +      break;
  +    case OMPD_target_parallel_for:
  +    case OMPD_target_parallel_for_simd:
  +    case OMPD_target_teams_distribute_parallel_for:
  +    case OMPD_target_teams_distribute_parallel_for_simd:
  +    case OMPD_teams_distribute_parallel_for:
  +    case OMPD_teams_distribute_parallel_for_simd:
  +    case OMPD_distribute_parallel_for:
  +    case OMPD_distribute_parallel_for_simd:
  +    case OMPD_parallel_for:
  +    case OMPD_parallel_for_simd:
  +      CaptureRegion = OMPD_parallel;
  +      break;
  +    case OMPD_simd:
  +    case OMPD_for:
  +    case OMPD_for_simd:
  +    case OMPD_distribute_simd:
  +      break;
  +    case OMPD_parallel_master_taskloop:
  +    case OMPD_task:
  +    case OMPD_taskloop:
  +    case OMPD_master_taskloop:
  +    case OMPD_target_update:
  +    case OMPD_target_enter_data:
  +    case OMPD_target_exit_data:
  +    case OMPD_target:
  +    case OMPD_target_teams:
  +    case OMPD_target_parallel:
  +    case OMPD_target_teams_distribute:
  +    case OMPD_target_data:
  +    case OMPD_teams:
  +    case OMPD_teams_distribute:
  +    case OMPD_cancel:
  +    case OMPD_parallel:
  +    case OMPD_parallel_master:
  +    case OMPD_parallel_sections:
  +    case OMPD_threadprivate:
  +    case OMPD_allocate:
  +    case OMPD_taskyield:
  +    case OMPD_barrier:
  +    case OMPD_taskwait:
  +    case OMPD_cancellation_point:
  +    case OMPD_flush:
  +    case OMPD_declare_reduction:
  +    case OMPD_declare_mapper:
  +    case OMPD_declare_simd:
  +    case OMPD_declare_variant:
  +    case OMPD_declare_target:
  +    case OMPD_end_declare_target:
  +    case OMPD_sections:
  +    case OMPD_section:
  +    case OMPD_single:
  +    case OMPD_master:
  +    case OMPD_critical:
  +    case OMPD_taskgroup:
  +    case OMPD_distribute:
  +    case OMPD_ordered:
  +    case OMPD_atomic:
  +    case OMPD_requires:
  +      llvm_unreachable("Unexpected OpenMP directive with linear-clause");
  +    case OMPD_unknown:
  +      llvm_unreachable("Unknown OpenMP directive");
  +    }
  +    break;
     case OMPC_firstprivate:
     case OMPC_lastprivate:
     case OMPC_reduction:
     case OMPC_task_reduction:
     case OMPC_in_reduction:
  -  case OMPC_linear:
     case OMPC_default:
     case OMPC_proc_bind:
     case OMPC_safelen:
  @@ -14377,6 +14461,16 @@ OMPClause *Sema::ActOnOpenMPLinearClause(
       if (Val.isInvalid())
         return nullptr;
       StepExpr = Val.get();
  +    OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
  +    OpenMPDirectiveKind CaptureRegion =
  +        getOpenMPCaptureRegionForClause(DKind, OMPC_linear, LangOpts.OpenMP);
  +    if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
  +      StepExpr = MakeFullExpr(StepExpr).get();
  +      llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
  +      StepExpr = tryBuildCapture(*this, StepExpr, Captures).get();
  +      for (const auto &Pair : Captures)
  +        ExprCaptures.push_back(Pair.second->getDecl());
  +    }
  
       // Build var to save the step value.
       VarDecl *SaveVar =
  @@ -14503,7 +14597,7 @@ static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV,
       ++CurPrivate;
     }
     if (Expr *S = Clause.getStep())
  -    UsedExprs.push_back(S);
  +    UsedExprs.push_back(getExprAsWritten(S));
     // Fill the remaining part with the nullptr.
     UsedExprs.append(Clause.varlist_size() + 1 - UsedExprs.size(), nullptr);
     Clause.setUpdates(Updates);


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71475/new/

https://reviews.llvm.org/D71475





More information about the cfe-commits mailing list