[PATCH] [OPENMP] Bug fixes in threadprivate declaration and data sharing attributes processing.

Hal Finkel hfinkel at anl.gov
Wed Jan 15 21:44:28 PST 2014


Alexey,

I think this is fine to commit (and, generally speaking, we can do post-commit reviews for small bug fixes like this).

My general inclination is to use llvm::next and llvm::prior instead of writing Stack.rbegin() + 1 and Stack.rend() - 1, but we already have a number of these +-1 expressions on the DSA stack iterators, and we should keep everything consistent (and maybe change them all in a separate commit).

Thanks again,
Hal

----- Original Message -----
> From: "Alexey Bataev" <a.bataev at hotmail.com>
> To: dgregor at apple.com, hfinkel at anl.gov, cbergstrom at pathscale.com, "a bataev" <a.bataev at hotmail.com>
> Cc: cfe-commits at cs.uiuc.edu
> Sent: Thursday, December 19, 2013 10:24:33 PM
> Subject: [PATCH] [OPENMP] Bug fixes in threadprivate declaration and data sharing attributes processing.
> 
> Hi doug.gregor, hfinkel, cbergstrom,
> 
> http://llvm-reviews.chandlerc.com/D2451
> 
> Files:
>   test/OpenMP/threadprivate_ast_print.cpp
>   lib/Sema/SemaOpenMP.cpp
> 
> Index: test/OpenMP/threadprivate_ast_print.cpp
> ===================================================================
> --- test/OpenMP/threadprivate_ast_print.cpp
> +++ test/OpenMP/threadprivate_ast_print.cpp
> @@ -2,8 +2,6 @@
>  // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
>  // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only
>  -verify %s -ast-print
>  // expected-no-diagnostics
> -// FIXME: This test has been crashing since r186647.
> -// REQUIRES: disabled
>  
>  #ifndef HEADER
>  #define HEADER
> Index: lib/Sema/SemaOpenMP.cpp
> ===================================================================
> --- lib/Sema/SemaOpenMP.cpp
> +++ lib/Sema/SemaOpenMP.cpp
> @@ -82,6 +82,9 @@
>    typedef SmallVector<SharingMapTy, 8>::reverse_iterator
>    reverse_iterator;
>  
>    DSAVarData getDSA(StackTy::reverse_iterator Iter, VarDecl *D);
> +
> +  /// \brief Checks if the variable is a local for OpenMP region.
> +  bool isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator Iter);
>  public:
>    explicit DSAStackTy(Sema &S) : Stack(1), Actions(S) { }
>  
> @@ -98,9 +101,6 @@
>    /// \brief Adds explicit data sharing attribute to the specified
>    declaration.
>    void addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A);
>  
> -  /// \brief Checks if the variable is a local for OpenMP region.
> -  bool isOpenMPLocal(VarDecl *D);
> -
>    /// \brief Returns data sharing attributes from top of the stack
>    for the
>    /// specified declaration.
>    DSAVarData getTopDSA(VarDecl *D);
> @@ -152,7 +152,21 @@
>  
>      return DVar;
>    }
> +
>    DVar.DKind = Iter->Directive;
> +  // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables
> Referenced
> +  // in a Construct, C/C++, predetermined, p.1]
> +  // Variables with automatic storage duration that are declared in
> a scope
> +  // inside the construct are private.
> +  if (DVar.DKind != OMPD_parallel) {
> +    if (isOpenMPLocal(D, Iter) && D->isLocalVarDecl() &&
> +        (D->getStorageClass() == SC_Auto ||
> +         D->getStorageClass() == SC_None)) {
> +      DVar.CKind = OMPC_private;
> +      return DVar;
> +    }
> +  }
> +
>    // Explicitly specified attributes and local variables with
>    predetermined
>    // attributes.
>    if (Iter->SharingMap.count(D)) {
> @@ -231,23 +245,23 @@
>    }
>  }
>  
> -bool DSAStackTy::isOpenMPLocal(VarDecl *D) {
> -  Scope *CurScope = getCurScope();
> -  while (CurScope && !CurScope->isDeclScope(D))
> -    CurScope = CurScope->getParent();
> -  while (CurScope && !CurScope->isOpenMPDirectiveScope())
> -    CurScope = CurScope->getParent();
> -  bool isOpenMPLocal = !!CurScope;
> -  if (!isOpenMPLocal) {
> -    CurScope = getCurScope();
> -    while (CurScope && !CurScope->isOpenMPDirectiveScope())
> +bool DSAStackTy::isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator
> Iter) {
> +  if (Stack.size() > 2) {
> +    reverse_iterator I = Iter, E = Stack.rend() - 1;
> +    Scope *TopScope = 0;
> +    while (I != E &&
> +           I->Directive != OMPD_parallel) {
> +      ++I;
> +    }
> +    if (I == E) return false;
> +    TopScope = I->CurScope ? I->CurScope->getParent() : 0;
> +    Scope *CurScope = getCurScope();
> +    while (CurScope != TopScope && !CurScope->isDeclScope(D)) {
>        CurScope = CurScope->getParent();
> -    isOpenMPLocal =
> -      CurScope &&
> -      isa<CapturedDecl>(D->getDeclContext()) &&
> -
>      CurScope->getFnParent()->getEntity()->Encloses(D->getDeclContext());
> +    }
> +    return CurScope != TopScope;
>    }
> -  return isOpenMPLocal;
> +  return false;
>  }
>  
>  DSAStackTy::DSAVarData DSAStackTy::getTopDSA(VarDecl *D) {
> @@ -270,11 +284,13 @@
>    // in a Construct, C/C++, predetermined, p.1]
>    // Variables with automatic storage duration that are declared in
>    a scope
>    // inside the construct are private.
> -  if (isOpenMPLocal(D) && D->isLocalVarDecl() &&
> -      (D->getStorageClass() == SC_Auto ||
> -       D->getStorageClass() == SC_None)) {
> -    DVar.CKind = OMPC_private;
> -    return DVar;
> +  OpenMPDirectiveKind Kind = getCurrentDirective();
> +  if (Kind != OMPD_parallel) {
> +    if (isOpenMPLocal(D, Stack.rbegin() + 1) && D->isLocalVarDecl()
> &&
> +        (D->getStorageClass() == SC_Auto ||
> +         D->getStorageClass() == SC_None))
> +      DVar.CKind = OMPC_private;
> +      return DVar;
>    }
>  
>    // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables
>    Referenced
> @@ -319,7 +335,7 @@
>    // in a Construct, C/C++, predetermined, p.7]
>    //  Variables with static storage duration that are declared in a
>    scope
>    //  inside the construct are shared.
> -  if (isOpenMPLocal(D) && D->isStaticLocal()) {
> +  if (D->isStaticLocal()) {
>      DVar.CKind = OMPC_shared;
>      return DVar;
>    }
> @@ -567,10 +583,13 @@
>  
>      Vars.push_back(*I);
>    }
> -  return Vars.empty() ?
> -              0 : OMPThreadPrivateDecl::Create(Context,
> -
>                                               getCurLexicalContext(),
> -                                               Loc, Vars);
> +  OMPThreadPrivateDecl *D = 0;
> +  if (!Vars.empty()) {
> +    D = OMPThreadPrivateDecl::Create(Context,
> getCurLexicalContext(), Loc,
> +                                     Vars);
> +    D->setAccess(AS_public);
> +  }
> +  return D;
>  }
>  
>  namespace {
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the cfe-commits mailing list