r255001 - Add parse and sema for OpenMP distribute directive and all its clauses excluding dist_schedule.

NAKAMURA Takumi via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 8 06:06:44 PST 2015


It crashes on i686-clang. See
http://bb.pgr.jp/builders/clang-3stage-i686-linux/builds/4055
Investigating.

#6  0xf7ea482f in operator delete(void*) () from /usr/lib32/libstdc++.so.6
#7  0x0bef8cce in llvm::DenseMap<clang::VarDecl*,
llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::VarDecl*>,
llvm::detail::DenseSetPair<clang::VarDecl*> >::~DenseMap (this=0xf2419d8)
    at llvm/include/llvm/ADT/DenseMap.h:575
#8  0x0bef8c86 in llvm::DenseSet<clang::VarDecl*,
llvm::DenseMapInfo<clang::VarDecl*> >::~DenseSet (this=0xf2419d8)
    at llvm/include/llvm/ADT/DenseSet.h:39
#9  0x0cf988a4 in (anonymous
namespace)::DSAStackTy::SharingMapTy::~SharingMapTy (this=0xf2412c0)
    at clang/lib/Sema/SemaOpenMP.cpp:95
#10 0x0cf9e24b in llvm::SmallVectorTemplateBase<(anonymous
namespace)::DSAStackTy::SharingMapTy, false>::pop_back (this=0xf23fca0)
    at llvm/include/llvm/ADT/SmallVector.h:245
#11 0x0cf68ed2 in (anonymous namespace)::DSAStackTy::pop (this=0xf23fca0)
    at clang/lib/Sema/SemaOpenMP.cpp:163
#12 0x0cf68a50 in clang::Sema::EndOpenMPDSABlock (this=0xf23e188,
    CurDirective=0xf2901a0)
    at clang/lib/Sema/SemaOpenMP.cpp:957
#13 0x0c603bf0 in
clang::Parser::ParseOpenMPDeclarativeOrExecutableDirective (
    this=0xf25d3c0, StandAloneAllowed=false)
    at clang/lib/Parse/ParseOpenMP.cpp:314
#14 0x0c61c641 in clang::Parser::ParseStatementOrDeclarationAfterAttributes
(
    this=0xf25d3c0, Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0,
    Attrs=...)
    at clang/lib/Parse/ParseStmt.cpp:349
#15 0x0c61b1e9 in clang::Parser::ParseStatementOrDeclaration
(this=0xf25d3c0,
    Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0)
    at clang/lib/Parse/ParseStmt.cpp:106
#16 0x0c61b064 in clang::Parser::ParseStatement (this=0xf25d3c0,
    TrailingElseLoc=0x0)
    at clang/lib/Parse/ParseStmt.cpp:42
#17 0x0c6039ff in
clang::Parser::ParseOpenMPDeclarativeOrExecutableDirective (
    this=0xf25d3c0, StandAloneAllowed=false)
    at clang/lib/Parse/ParseOpenMP.cpp:305
#18 0x0c61c641 in clang::Parser::ParseStatementOrDeclarationAfterAttributes
(
    this=0xf25d3c0, Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0,
    Attrs=...)
    at clang/lib/Parse/ParseStmt.cpp:349
#19 0x0c61b1e9 in clang::Parser::ParseStatementOrDeclaration
(this=0xf25d3c0,
    Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0)
    at clang/lib/Parse/ParseStmt.cpp:106
#20 0x0c61b064 in clang::Parser::ParseStatement (this=0xf25d3c0,
    TrailingElseLoc=0x0)
    at clang/lib/Parse/ParseStmt.cpp:42
#21 0x0c6039ff in
clang::Parser::ParseOpenMPDeclarativeOrExecutableDirective (
    this=0xf25d3c0, StandAloneAllowed=true)
    at clang/lib/Parse/ParseOpenMP.cpp:305
#22 0x0c61c641 in clang::Parser::ParseStatementOrDeclarationAfterAttributes
(
    this=0xf25d3c0, Stmts=..., OnlyStatement=false, TrailingElseLoc=0x0,
    Attrs=...)
    at clang/lib/Parse/ParseStmt.cpp:349
#23 0x0c61b1e9 in clang::Parser::ParseStatementOrDeclaration
(this=0xf25d3c0,
    Stmts=..., OnlyStatement=false, TrailingElseLoc=0x0)
    at clang/lib/Parse/ParseStmt.cpp:106
#24 0x0c625955 in clang::Parser::ParseCompoundStatementBody (this=0xf25d3c0,
    isStmtExpr=false)
    at clang/lib/Parse/ParseStmt.cpp:968
#25 0x0c62692d in clang::Parser::ParseFunctionStatementBody (this=0xf25d3c0,
    Decl=0xf27a948, BodyScope=...)
    at clang/lib/Parse/ParseStmt.cpp:1914
#26 0x0c53f639 in clang::Parser::ParseFunctionDefinition (this=0xf25d3c0,
    D=..., TemplateInfo=..., LateParsedAttrs=0xffffb630)
    at clang/lib/Parse/Parser.cpp:1147
#27 0x0c56c1ca in clang::Parser::ParseDeclGroup (this=0xf25d3c0, DS=...,
    Context=0, DeclEnd=0x0, FRI=0x0)
    at clang/lib/Parse/ParseDecl.cpp:1757
#28 0x0c53e13b in clang::Parser::ParseDeclOrFunctionDefInternal (
    this=0xf25d3c0, attrs=..., DS=..., AS=clang::AS_none)
    at clang/lib/Parse/Parser.cpp:927
#29 0x0c53d527 in clang::Parser::ParseDeclarationOrFunctionDefinition (
    this=0xf25d3c0, attrs=..., DS=0x0, AS=clang::AS_none)
    at clang/lib/Parse/Parser.cpp:943
#30 0x0c53c9c4 in clang::Parser::ParseExternalDeclaration (this=0xf25d3c0,
    attrs=..., DS=0x0)
    at clang/lib/Parse/Parser.cpp:801
#31 0x0c53b4af in clang::Parser::ParseTopLevelDecl (this=0xf25d3c0,
Result=...)
    at clang/lib/Parse/Parser.cpp:593
#32 0x0c535b0d in clang::ParseAST (S=..., PrintStats=false,
    SkipFunctionBodies=false)
    at clang/lib/Parse/ParseAST.cpp:161
#33 0x0b3bec76 in clang::ASTFrontendAction::ExecuteAction (this=0xf200980)
    at clang/lib/Frontend/FrontendAction.cpp:538
#34 0x0b3be581 in clang::FrontendAction::Execute (this=0xf200980)
    at clang/lib/Frontend/FrontendAction.cpp:439
#35 0x0b355071 in clang::CompilerInstance::ExecuteAction (this=0xf1ff128,
    Act=...)
    at clang/lib/Frontend/CompilerInstance.cpp:841
#36 0x0b52d118 in clang::ExecuteCompilerInvocation (Clang=0xf1ff128)
    at clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:222
#37 0x086e8734 in cc1_main (Argv=...,
    Argv0=0xffffd7c0 "/home/tnakamura/llvm/2-32/bin/clang",
    MainAddr=0x86d7820 <GetExecutablePath(char const*, bool)>)
    at clang/tools/driver/cc1_main.cpp:116
#38 0x086d9823 in ExecuteCC1Tool (argv=..., Tool=...)
    at clang/tools/driver/driver.cpp:301
#39 0x086d8316 in main (argc_=8, argv_=0xffffd684)
    at clang/tools/driver/driver.cpp:366


On Tue, Dec 8, 2015 at 1:24 PM Carlo Bertolli via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: cbertol
> Date: Mon Dec  7 22:21:03 2015
> New Revision: 255001
>
> URL: http://llvm.org/viewvc/llvm-project?rev=255001&view=rev
> Log:
> Add parse and sema for OpenMP distribute directive and all its clauses
> excluding dist_schedule.
>
> Added:
>     cfe/trunk/test/OpenMP/distribute_ast_print.cpp
>     cfe/trunk/test/OpenMP/distribute_collapse_messages.cpp
>     cfe/trunk/test/OpenMP/distribute_firstprivate_messages.cpp
>     cfe/trunk/test/OpenMP/distribute_private_messages.cpp
> Modified:
>     cfe/trunk/include/clang-c/Index.h
>     cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>     cfe/trunk/include/clang/AST/StmtOpenMP.h
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/include/clang/Basic/OpenMPKinds.def
>     cfe/trunk/include/clang/Basic/OpenMPKinds.h
>     cfe/trunk/include/clang/Basic/StmtNodes.td
>     cfe/trunk/include/clang/Sema/Sema.h
>     cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>     cfe/trunk/lib/AST/StmtOpenMP.cpp
>     cfe/trunk/lib/AST/StmtPrinter.cpp
>     cfe/trunk/lib/AST/StmtProfile.cpp
>     cfe/trunk/lib/Basic/OpenMPKinds.cpp
>     cfe/trunk/lib/CodeGen/CGStmt.cpp
>     cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
>     cfe/trunk/lib/CodeGen/CodeGenFunction.h
>     cfe/trunk/lib/Parse/ParseOpenMP.cpp
>     cfe/trunk/lib/Sema/SemaOpenMP.cpp
>     cfe/trunk/lib/Sema/TreeTransform.h
>     cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>     cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
>     cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>     cfe/trunk/test/OpenMP/nesting_of_regions.cpp
>     cfe/trunk/tools/libclang/CIndex.cpp
>     cfe/trunk/tools/libclang/CXCursor.cpp
>
> Modified: cfe/trunk/include/clang-c/Index.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang-c/Index.h (original)
> +++ cfe/trunk/include/clang-c/Index.h Mon Dec  7 22:21:03 2015
> @@ -2264,7 +2264,11 @@ enum CXCursorKind {
>     */
>    CXCursor_OMPTaskLoopSimdDirective      = 259,
>
> -  CXCursor_LastStmt                      =
> CXCursor_OMPTaskLoopSimdDirective,
> +   /** \brief OpenMP distribute directive.
> +   */
> +  CXCursor_OMPDistributeDirective        = 260,
> +
> +  CXCursor_LastStmt                      =
> CXCursor_OMPDistributeDirective,
>
>    /**
>     * \brief Cursor that represents the translation unit itself.
>
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Dec  7 22:21:03
> 2015
> @@ -2439,6 +2439,9 @@ DEF_TRAVERSE_STMT(OMPTaskLoopDirective,
>  DEF_TRAVERSE_STMT(OMPTaskLoopSimdDirective,
>                    { TRY_TO(TraverseOMPExecutableDirective(S)); })
>
> +DEF_TRAVERSE_STMT(OMPDistributeDirective,
> +                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
> +
>  // OpenMP clauses.
>  template <typename Derived>
>  bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
>
> Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtOpenMP.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/StmtOpenMP.h (original)
> +++ cfe/trunk/include/clang/AST/StmtOpenMP.h Mon Dec  7 22:21:03 2015
> @@ -424,43 +424,50 @@ protected:
>    void setInc(Expr *Inc) { *std::next(child_begin(), IncOffset) = Inc; }
>    void setIsLastIterVariable(Expr *IL) {
>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>             "expected worksharing loop directive");
>      *std::next(child_begin(), IsLastIterVariableOffset) = IL;
>    }
>    void setLowerBoundVariable(Expr *LB) {
>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>             "expected worksharing loop directive");
>      *std::next(child_begin(), LowerBoundVariableOffset) = LB;
>    }
>    void setUpperBoundVariable(Expr *UB) {
>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>             "expected worksharing loop directive");
>      *std::next(child_begin(), UpperBoundVariableOffset) = UB;
>    }
>    void setStrideVariable(Expr *ST) {
>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>             "expected worksharing loop directive");
>      *std::next(child_begin(), StrideVariableOffset) = ST;
>    }
>    void setEnsureUpperBound(Expr *EUB) {
>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>             "expected worksharing loop directive");
>      *std::next(child_begin(), EnsureUpperBoundOffset) = EUB;
>    }
>    void setNextLowerBound(Expr *NLB) {
>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>             "expected worksharing loop directive");
>      *std::next(child_begin(), NextLowerBoundOffset) = NLB;
>    }
>    void setNextUpperBound(Expr *NUB) {
>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>             "expected worksharing loop directive");
>      *std::next(child_begin(), NextUpperBoundOffset) = NUB;
>    }
> @@ -683,7 +690,8 @@ public:
>             T->getStmtClass() == OMPParallelForDirectiveClass ||
>             T->getStmtClass() == OMPParallelForSimdDirectiveClass ||
>             T->getStmtClass() == OMPTaskLoopDirectiveClass ||
> -           T->getStmtClass() == OMPTaskLoopSimdDirectiveClass;
> +           T->getStmtClass() == OMPTaskLoopSimdDirectiveClass ||
> +           T->getStmtClass() == OMPDistributeDirectiveClass;
>    }
>  };
>
> @@ -2333,6 +2341,73 @@ public:
>    }
>  };
>
> +/// \brief This represents '#pragma omp distribute' directive.
> +///
> +/// \code
> +/// #pragma omp distribute private(a,b)
> +/// \endcode
> +/// In this example directive '#pragma omp distribute' has clauses
> 'private'
> +/// with the variables 'a' and 'b'
> +///
> +class OMPDistributeDirective : public OMPLoopDirective {
> +  friend class ASTStmtReader;
> +
> +  /// \brief Build directive with the given start and end location.
> +  ///
> +  /// \param StartLoc Starting location of the directive kind.
> +  /// \param EndLoc Ending location of the directive.
> +  /// \param CollapsedNum Number of collapsed nested loops.
> +  /// \param NumClauses Number of clauses.
> +  ///
> +  OMPDistributeDirective(SourceLocation StartLoc, SourceLocation EndLoc,
> +                         unsigned CollapsedNum, unsigned NumClauses)
> +      : OMPLoopDirective(this, OMPDistributeDirectiveClass,
> OMPD_distribute,
> +                         StartLoc, EndLoc, CollapsedNum, NumClauses)
> +        {}
> +
> +  /// \brief Build an empty directive.
> +  ///
> +  /// \param CollapsedNum Number of collapsed nested loops.
> +  /// \param NumClauses Number of clauses.
> +  ///
> +  explicit OMPDistributeDirective(unsigned CollapsedNum, unsigned
> NumClauses)
> +      : OMPLoopDirective(this, OMPDistributeDirectiveClass,
> OMPD_distribute,
> +                         SourceLocation(), SourceLocation(), CollapsedNum,
> +                         NumClauses)
> +        {}
> +
> +public:
> +  /// \brief Creates directive with a list of \a Clauses.
> +  ///
> +  /// \param C AST context.
> +  /// \param StartLoc Starting location of the directive kind.
> +  /// \param EndLoc Ending Location of the directive.
> +  /// \param CollapsedNum Number of collapsed loops.
> +  /// \param Clauses List of clauses.
> +  /// \param AssociatedStmt Statement, associated with the directive.
> +  /// \param Exprs Helper expressions for CodeGen.
> +    ///
> +  static OMPDistributeDirective *
> +  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation
> EndLoc,
> +         unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
> +         Stmt *AssociatedStmt, const HelperExprs &Exprs);
> +
> +  /// \brief Creates an empty directive with the place
> +  /// for \a NumClauses clauses.
> +  ///
> +  /// \param C AST context.
> +  /// \param CollapsedNum Number of collapsed nested loops.
> +  /// \param NumClauses Number of clauses.
> +  ///
> +  static OMPDistributeDirective *CreateEmpty(const ASTContext &C,
> +                                             unsigned NumClauses,
> +                                             unsigned CollapsedNum,
> EmptyShell);
> +
> +  static bool classof(const Stmt *T) {
> +    return T->getStmtClass() == OMPDistributeDirectiveClass;
> +  }
> +};
> +
>  } // end namespace clang
>
>  #endif
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Dec  7
> 22:21:03 2015
> @@ -7801,7 +7801,8 @@ def err_omp_prohibited_region : Error<
>    "region cannot be%select{| closely}0 nested inside '%1' region"
>    "%select{|; perhaps you forget to enclose 'omp %3' directive into a
> parallel region?|"
>    "; perhaps you forget to enclose 'omp %3' directive into a for or a
> parallel for region with 'ordered' clause?|"
> -  "; perhaps you forget to enclose 'omp %3' directive into a target
> region?}2">;
> +  "; perhaps you forget to enclose 'omp %3' directive into a target
> region?|"
> +  "; perhaps you forget to enclose 'omp %3' directive into a teams
> region?}2">;
>  def err_omp_prohibited_region_simd : Error<
>    "OpenMP constructs may not be nested inside a simd region">;
>  def err_omp_prohibited_region_atomic : Error<
> @@ -7920,6 +7921,12 @@ def err_omp_wrong_ordered_loop_count : E
>    "the parameter of the 'ordered' clause must be greater than or equal to
> the parameter of the 'collapse' clause">;
>  def note_collapse_loop_count : Note<
>    "parameter of the 'collapse' clause">;
> +def err_omp_firstprivate_distribute_private_teams : Error<
> +  "private variable in '#pragma omp teams' cannot be firstprivate in
> '#pragma omp distribute'">;
> +def err_omp_firstprivate_and_lastprivate_in_distribute : Error<
> +  "lastprivate variable cannot be firstprivate in '#pragma omp
> distribute'">;
> +def err_omp_firstprivate_distribute_in_teams_reduction : Error<
> +  "reduction variable in '#pragma omp teams' cannot be firstprivate in
> '#pragma omp distribute'">;
>  } // end of OpenMP category
>
>  let CategoryName = "Related Result Type Issue" in {
>
> Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.def
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.def?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/OpenMPKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/OpenMPKinds.def Mon Dec  7 22:21:03 2015
> @@ -75,6 +75,9 @@
>  #ifndef OPENMP_TASKLOOP_SIMD_CLAUSE
>  #  define OPENMP_TASKLOOP_SIMD_CLAUSE(Name)
>  #endif
> +#ifndef OPENMP_DISTRIBUTE_CLAUSE
> +#define OPENMP_DISTRIBUTE_CLAUSE(Name)
> +#endif
>  #ifndef OPENMP_DEFAULT_KIND
>  #  define OPENMP_DEFAULT_KIND(Name)
>  #endif
> @@ -123,6 +126,7 @@ OPENMP_DIRECTIVE_EXT(for_simd, "for simd
>  OPENMP_DIRECTIVE_EXT(cancellation_point, "cancellation point")
>  OPENMP_DIRECTIVE(taskloop)
>  OPENMP_DIRECTIVE_EXT(taskloop_simd, "taskloop simd")
> +OPENMP_DIRECTIVE(distribute)
>
>  // OpenMP clauses.
>  OPENMP_CLAUSE(if, OMPIfClause)
> @@ -388,6 +392,12 @@ OPENMP_TASKLOOP_SIMD_CLAUSE(simdlen)
>  OPENMP_TASKLOOP_SIMD_CLAUSE(grainsize)
>  OPENMP_TASKLOOP_SIMD_CLAUSE(nogroup)
>
> +// Clauses allowed for OpenMP directive 'distribute'
> +OPENMP_DISTRIBUTE_CLAUSE(private)
> +OPENMP_DISTRIBUTE_CLAUSE(firstprivate)
> +OPENMP_DISTRIBUTE_CLAUSE(lastprivate)
> +OPENMP_DISTRIBUTE_CLAUSE(collapse)
> +
>  #undef OPENMP_TASKLOOP_SIMD_CLAUSE
>  #undef OPENMP_TASKLOOP_CLAUSE
>  #undef OPENMP_LINEAR_KIND
> @@ -415,3 +425,4 @@ OPENMP_TASKLOOP_SIMD_CLAUSE(nogroup)
>  #undef OPENMP_FOR_CLAUSE
>  #undef OPENMP_FOR_SIMD_CLAUSE
>  #undef OPENMP_MAP_KIND
> +#undef OPENMP_DISTRIBUTE_CLAUSE
>
> Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/OpenMPKinds.h (original)
> +++ cfe/trunk/include/clang/Basic/OpenMPKinds.h Mon Dec  7 22:21:03 2015
> @@ -141,6 +141,13 @@ bool isOpenMPTeamsDirective(OpenMPDirect
>  /// otherwise - false.
>  bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind);
>
> +/// \brief Checks if the specified directive is a distribute directive.
> +/// \param DKind Specified directive.
> +/// \return true - the directive is a distribute-directive like 'omp
> +/// distribute',
> +/// otherwise - false.
> +bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind);
> +
>  /// \brief Checks if the specified clause is one of private clauses like
>  /// 'private', 'firstprivate', 'reduction' etc..
>  /// \param Kind Clause kind.
>
> Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
> +++ cfe/trunk/include/clang/Basic/StmtNodes.td Mon Dec  7 22:21:03 2015
> @@ -221,4 +221,4 @@ def OMPCancellationPointDirective : DStm
>  def OMPCancelDirective : DStmt<OMPExecutableDirective>;
>  def OMPTaskLoopDirective : DStmt<OMPLoopDirective>;
>  def OMPTaskLoopSimdDirective : DStmt<OMPLoopDirective>;
> -
> +def OMPDistributeDirective : DStmt<OMPLoopDirective>;
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Mon Dec  7 22:21:03 2015
> @@ -7961,6 +7961,12 @@ public:
>        ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
>        SourceLocation EndLoc,
>        llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA);
> +  /// \brief Called on well-formed '\#pragma omp distribute' after parsing
> +  /// of the associated statement.
> +  StmtResult ActOnOpenMPDistributeDirective(
> +      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
> +      SourceLocation EndLoc,
> +      llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA);
>
>    OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind,
>                                           Expr *Expr,
>
> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Mon Dec  7
> 22:21:03 2015
> @@ -1449,6 +1449,7 @@ namespace clang {
>        STMT_OMP_CANCEL_DIRECTIVE,
>        STMT_OMP_TASKLOOP_DIRECTIVE,
>        STMT_OMP_TASKLOOP_SIMD_DIRECTIVE,
> +      STMT_OMP_DISTRIBUTE_DIRECTIVE,
>        EXPR_OMP_ARRAY_SECTION,
>
>        // ARC
>
> Modified: cfe/trunk/lib/AST/StmtOpenMP.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtOpenMP.cpp (original)
> +++ cfe/trunk/lib/AST/StmtOpenMP.cpp Mon Dec  7 22:21:03 2015
> @@ -832,3 +832,48 @@ OMPTaskLoopSimdDirective::CreateEmpty(co
>    return new (Mem) OMPTaskLoopSimdDirective(CollapsedNum, NumClauses);
>  }
>
> +OMPDistributeDirective *OMPDistributeDirective::Create(
> +    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
> +    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt
> *AssociatedStmt,
> +    const HelperExprs &Exprs) {
> +  unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPDistributeDirective),
> +                                           llvm::alignOf<OMPClause *>());
> +  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
> +                         sizeof(Stmt *) *
> +                             numLoopChildren(CollapsedNum,
> OMPD_distribute));
> +  OMPDistributeDirective *Dir = new (Mem)
> +      OMPDistributeDirective(StartLoc, EndLoc, CollapsedNum,
> Clauses.size());
> +  Dir->setClauses(Clauses);
> +  Dir->setAssociatedStmt(AssociatedStmt);
> +  Dir->setIterationVariable(Exprs.IterationVarRef);
> +  Dir->setLastIteration(Exprs.LastIteration);
> +  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
> +  Dir->setPreCond(Exprs.PreCond);
> +  Dir->setCond(Exprs.Cond);
> +  Dir->setInit(Exprs.Init);
> +  Dir->setInc(Exprs.Inc);
> +  Dir->setIsLastIterVariable(Exprs.IL);
> +  Dir->setLowerBoundVariable(Exprs.LB);
> +  Dir->setUpperBoundVariable(Exprs.UB);
> +  Dir->setStrideVariable(Exprs.ST);
> +  Dir->setEnsureUpperBound(Exprs.EUB);
> +  Dir->setNextLowerBound(Exprs.NLB);
> +  Dir->setNextUpperBound(Exprs.NUB);
> +  Dir->setCounters(Exprs.Counters);
> +  Dir->setPrivateCounters(Exprs.PrivateCounters);
> +  Dir->setInits(Exprs.Inits);
> +  Dir->setUpdates(Exprs.Updates);
> +  Dir->setFinals(Exprs.Finals);
> +  return Dir;
> +}
> +
> +OMPDistributeDirective *
> +OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned
> NumClauses,
> +                                    unsigned CollapsedNum, EmptyShell) {
> +  unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPDistributeDirective),
> +                                           llvm::alignOf<OMPClause *>());
> +  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
> +                         sizeof(Stmt *) *
> +                             numLoopChildren(CollapsedNum,
> OMPD_distribute));
> +  return new (Mem) OMPDistributeDirective(CollapsedNum, NumClauses);
> +}
>
> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Mon Dec  7 22:21:03 2015
> @@ -1057,6 +1057,11 @@ void StmtPrinter::VisitOMPTaskLoopSimdDi
>    PrintOMPExecutableDirective(Node);
>  }
>
> +void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective
> *Node) {
> +  Indent() << "#pragma omp distribute ";
> +  PrintOMPExecutableDirective(Node);
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  //  Expr printing methods.
>
>  //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/lib/AST/StmtProfile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtProfile.cpp (original)
> +++ cfe/trunk/lib/AST/StmtProfile.cpp Mon Dec  7 22:21:03 2015
> @@ -599,6 +599,11 @@ void StmtProfiler::VisitOMPTaskLoopSimdD
>    VisitOMPLoopDirective(S);
>  }
>
> +void StmtProfiler::VisitOMPDistributeDirective(
> +    const OMPDistributeDirective *S) {
> +  VisitOMPLoopDirective(S);
> +}
> +
>  void StmtProfiler::VisitExpr(const Expr *S) {
>    VisitStmt(S);
>  }
>
> Modified: cfe/trunk/lib/Basic/OpenMPKinds.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/OpenMPKinds.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/OpenMPKinds.cpp (original)
> +++ cfe/trunk/lib/Basic/OpenMPKinds.cpp Mon Dec  7 22:21:03 2015
> @@ -436,6 +436,16 @@ bool clang::isAllowedClauseForDirective(
>        break;
>      }
>      break;
> +  case OMPD_distribute:
> +    switch (CKind) {
> +#define OPENMP_DISTRIBUTE_CLAUSE(Name)
>      \
> +  case OMPC_##Name:
>       \
> +    return true;
> +#include "clang/Basic/OpenMPKinds.def"
> +    default:
> +      break;
> +    }
> +    break;
>    case OMPD_unknown:
>    case OMPD_threadprivate:
>    case OMPD_section:
> @@ -455,7 +465,8 @@ bool clang::isOpenMPLoopDirective(OpenMP
>    return DKind == OMPD_simd || DKind == OMPD_for || DKind ==
> OMPD_for_simd ||
>           DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
>           DKind == OMPD_taskloop ||
> -         DKind == OMPD_taskloop_simd; // TODO add next directives.
> +         DKind == OMPD_taskloop_simd ||
> +         DKind == OMPD_distribute; // TODO add next directives.
>  }
>
>  bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) {
> @@ -490,6 +501,10 @@ bool clang::isOpenMPSimdDirective(OpenMP
>           DKind == OMPD_taskloop_simd; // TODO add next directives.
>  }
>
> +bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) {
> +  return Kind == OMPD_distribute; // TODO add next directives.
> +}
> +
>  bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) {
>    return Kind == OMPC_private || Kind == OMPC_firstprivate ||
>           Kind == OMPC_lastprivate || Kind == OMPC_linear ||
>
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Mon Dec  7 22:21:03 2015
> @@ -262,6 +262,9 @@ void CodeGenFunction::EmitStmt(const Stm
>    case Stmt::OMPTaskLoopSimdDirectiveClass:
>      EmitOMPTaskLoopSimdDirective(cast<OMPTaskLoopSimdDirective>(*S));
>      break;
> +case Stmt::OMPDistributeDirectiveClass:
> +    EmitOMPDistributeDirective(cast<OMPDistributeDirective>(*S));
> +       break;
>    }
>  }
>
>
> Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Mon Dec  7 22:21:03 2015
> @@ -2045,6 +2045,11 @@ void CodeGenFunction::EmitOMPFlushDirect
>    }(), S.getLocStart());
>  }
>
> +void CodeGenFunction::EmitOMPDistributeDirective(
> +    const OMPDistributeDirective &S) {
> +  llvm_unreachable("CodeGen for 'omp distribute' is not supported yet.");
> +}
> +
>  static llvm::Function *emitOutlinedOrderedFunction(CodeGenModule &CGM,
>                                                     const CapturedStmt *S)
> {
>    CodeGenFunction CGF(CGM, /*suppressNewContext=*/true);
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Dec  7 22:21:03 2015
> @@ -2339,6 +2339,7 @@ public:
>    void EmitOMPCancelDirective(const OMPCancelDirective &S);
>    void EmitOMPTaskLoopDirective(const OMPTaskLoopDirective &S);
>    void EmitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective &S);
> +  void EmitOMPDistributeDirective(const OMPDistributeDirective &S);
>
>    /// \brief Emit inner loop of the worksharing/simd construct.
>    ///
>
> Modified: cfe/trunk/lib/Parse/ParseOpenMP.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseOpenMP.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseOpenMP.cpp Mon Dec  7 22:21:03 2015
> @@ -140,6 +140,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
>    case OMPD_target_data:
>    case OMPD_taskloop:
>    case OMPD_taskloop_simd:
> +  case OMPD_distribute:
>      Diag(Tok, diag::err_omp_unexpected_directive)
>          << getOpenMPDirectiveName(DKind);
>      break;
> @@ -160,7 +161,8 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
>  ///         'parallel for' | 'parallel sections' | 'task' | 'taskyield' |
>  ///         'barrier' | 'taskwait' | 'flush' | 'ordered' | 'atomic' |
>  ///         'for simd' | 'parallel for simd' | 'target' | 'target data' |
> -///         'taskgroup' | 'teams' | 'taskloop' | 'taskloop simd' {clause}
> +///         'taskgroup' | 'teams' | 'taskloop' | 'taskloop simd' {clause}
> |
> +///         'distribute'
>  ///         annot_pragma_openmp_end
>  ///
>  StmtResult
> @@ -237,7 +239,8 @@ Parser::ParseOpenMPDeclarativeOrExecutab
>    case OMPD_taskgroup:
>    case OMPD_target_data:
>    case OMPD_taskloop:
> -  case OMPD_taskloop_simd: {
> +  case OMPD_taskloop_simd:
> +  case OMPD_distribute: {
>      ConsumeToken();
>      // Parse directive name of the 'critical' directive if any.
>      if (DKind == OMPD_critical) {
>
> Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Mon Dec  7 22:21:03 2015
> @@ -1568,6 +1568,14 @@ void Sema::ActOnOpenMPRegionStart(OpenMP
>                               Params);
>      break;
>    }
> +  case OMPD_distribute: {
> +    Sema::CapturedParamNameType Params[] = {
> +        std::make_pair(StringRef(), QualType()) // __context with shared
> vars
> +    };
> +    ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope,
> CR_OpenMP,
> +                             Params);
> +    break;
> +  }
>    case OMPD_threadprivate:
>    case OMPD_taskyield:
>    case OMPD_barrier:
> @@ -1652,6 +1660,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | parallel         | cancel          | !
>       |
>    // | parallel         | taskloop        | *
>       |
>    // | parallel         | taskloop simd   | *
>       |
> +  // | parallel         | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | for              | parallel        | *
>       |
>    // | for              | for             | +
>       |
> @@ -1680,6 +1689,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | for              | cancel          | !
>       |
>    // | for              | taskloop        | *
>       |
>    // | for              | taskloop simd   | *
>       |
> +  // | for              | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | master           | parallel        | *
>       |
>    // | master           | for             | +
>       |
> @@ -1708,6 +1718,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | master           | cancel          |
>       |
>    // | master           | taskloop        | *
>       |
>    // | master           | taskloop simd   | *
>       |
> +  // | master           | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | critical         | parallel        | *
>       |
>    // | critical         | for             | +
>       |
> @@ -1735,6 +1746,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | critical         | cancel          |
>       |
>    // | critical         | taskloop        | *
>       |
>    // | critical         | taskloop simd   | *
>       |
> +  // | critical         | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | simd             | parallel        |
>       |
>    // | simd             | for             |
>       |
> @@ -1763,6 +1775,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | simd             | cancel          |
>       |
>    // | simd             | taskloop        |
>       |
>    // | simd             | taskloop simd   |
>       |
> +  // | simd             | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | for simd         | parallel        |
>       |
>    // | for simd         | for             |
>       |
> @@ -1791,6 +1804,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | for simd         | cancel          |
>       |
>    // | for simd         | taskloop        |
>       |
>    // | for simd         | taskloop simd   |
>       |
> +  // | for simd         | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | parallel for simd| parallel        |
>       |
>    // | parallel for simd| for             |
>       |
> @@ -1819,6 +1833,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | parallel for simd| cancel          |
>       |
>    // | parallel for simd| taskloop        |
>       |
>    // | parallel for simd| taskloop simd   |
>       |
> +  // | parallel for simd| distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | sections         | parallel        | *
>       |
>    // | sections         | for             | +
>       |
> @@ -1847,6 +1862,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | sections         | cancel          | !
>       |
>    // | sections         | taskloop        | *
>       |
>    // | sections         | taskloop simd   | *
>       |
> +  // | sections         | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | section          | parallel        | *
>       |
>    // | section          | for             | +
>       |
> @@ -1875,6 +1891,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | section          | cancel          | !
>       |
>    // | section          | taskloop        | *
>       |
>    // | section          | taskloop simd   | *
>       |
> +  // | section          | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | single           | parallel        | *
>       |
>    // | single           | for             | +
>       |
> @@ -1903,6 +1920,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | single           | cancel          |
>       |
>    // | single           | taskloop        | *
>       |
>    // | single           | taskloop simd   | *
>       |
> +  // | single           | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | parallel for     | parallel        | *
>       |
>    // | parallel for     | for             | +
>       |
> @@ -1931,6 +1949,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | parallel for     | cancel          | !
>       |
>    // | parallel for     | taskloop        | *
>       |
>    // | parallel for     | taskloop simd   | *
>       |
> +  // | parallel for     | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | parallel sections| parallel        | *
>       |
>    // | parallel sections| for             | +
>       |
> @@ -1959,6 +1978,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | parallel sections| cancel          | !
>       |
>    // | parallel sections| taskloop        | *
>       |
>    // | parallel sections| taskloop simd   | *
>       |
> +  // | parallel sections| distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | task             | parallel        | *
>       |
>    // | task             | for             | +
>       |
> @@ -1987,6 +2007,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | task             | cancel          | !
>       |
>    // | task             | taskloop        | *
>       |
>    // | task             | taskloop simd   | *
>       |
> +  // | task             | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | ordered          | parallel        | *
>       |
>    // | ordered          | for             | +
>       |
> @@ -2015,6 +2036,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | ordered          | cancel          |
>       |
>    // | ordered          | taskloop        | *
>       |
>    // | ordered          | taskloop simd   | *
>       |
> +  // | ordered          | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | atomic           | parallel        |
>       |
>    // | atomic           | for             |
>       |
> @@ -2043,6 +2065,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | atomic           | cancel          |
>       |
>    // | atomic           | taskloop        |
>       |
>    // | atomic           | taskloop simd   |
>       |
> +  // | atomic           | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | target           | parallel        | *
>       |
>    // | target           | for             | *
>       |
> @@ -2071,6 +2094,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | target           | cancel          |
>       |
>    // | target           | taskloop        | *
>       |
>    // | target           | taskloop simd   | *
>       |
> +  // | target           | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | teams            | parallel        | *
>       |
>    // | teams            | for             | +
>       |
> @@ -2099,6 +2123,7 @@ static bool CheckNestingOfRegions(Sema &
>    // | teams            | cancel          |
>       |
>    // | teams            | taskloop        | +
>       |
>    // | teams            | taskloop simd   | +
>       |
> +  // | teams            | distribute      | !
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | taskloop         | parallel        | *
>       |
>    // | taskloop         | for             | +
>       |
> @@ -2126,6 +2151,7 @@ static bool CheckNestingOfRegions(Sema &
>    // |                  | point           |
>       |
>    // | taskloop         | cancel          |
>       |
>    // | taskloop         | taskloop        | *
>       |
> +  // | taskloop         | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    // | taskloop simd    | parallel        |
>       |
>    // | taskloop simd    | for             |
>       |
> @@ -2154,6 +2180,36 @@ static bool CheckNestingOfRegions(Sema &
>    // | taskloop simd    | cancel          |
>       |
>    // | taskloop simd    | taskloop        |
>       |
>    // | taskloop simd    | taskloop simd   |
>       |
> +  // | taskloop simd    | distribute      |
>       |
> +  //
> +------------------+-----------------+------------------------------------+
> +  // | distribute       | parallel        | *
>       |
> +  // | distribute       | for             | *
>       |
> +  // | distribute       | for simd        | *
>       |
> +  // | distribute       | master          | *
>       |
> +  // | distribute       | critical        | *
>       |
> +  // | distribute       | simd            | *
>       |
> +  // | distribute       | sections        | *
>       |
> +  // | distribute       | section         | *
>       |
> +  // | distribute       | single          | *
>       |
> +  // | distribute       | parallel for    | *
>       |
> +  // | distribute       |parallel for simd| *
>       |
> +  // | distribute       |parallel sections| *
>       |
> +  // | distribute       | task            | *
>       |
> +  // | distribute       | taskyield       | *
>       |
> +  // | distribute       | barrier         | *
>       |
> +  // | distribute       | taskwait        | *
>       |
> +  // | distribute       | taskgroup       | *
>       |
> +  // | distribute       | flush           | *
>       |
> +  // | distribute       | ordered         | +
>       |
> +  // | distribute       | atomic          | *
>       |
> +  // | distribute       | target          |
>       |
> +  // | distribute       | teams           |
>       |
> +  // | distribute       | cancellation    | +
>       |
> +  // |                  | point           |
>       |
> +  // | distribute       | cancel          | +
>       |
> +  // | distribute       | taskloop        | *
>       |
> +  // | distribute       | taskloop simd   | *
>       |
> +  // | distribute       | distribute      |
>       |
>    //
> +------------------+-----------------+------------------------------------+
>    if (Stack->getCurScope()) {
>      auto ParentRegion = Stack->getParentDirective();
> @@ -2163,7 +2219,8 @@ static bool CheckNestingOfRegions(Sema &
>        NoRecommend,
>        ShouldBeInParallelRegion,
>        ShouldBeInOrderedRegion,
> -      ShouldBeInTargetRegion
> +      ShouldBeInTargetRegion,
> +      ShouldBeInTeamsRegion
>      } Recommend = NoRecommend;
>      if (isOpenMPSimdDirective(ParentRegion) && CurrentRegion !=
> OMPD_ordered) {
>        // OpenMP [2.16, Nesting of Regions]
> @@ -2303,10 +2360,17 @@ static bool CheckNestingOfRegions(Sema &
>        // distribute, parallel, parallel sections, parallel workshare, and
> the
>        // parallel loop and parallel loop SIMD constructs are the only
> OpenMP
>        // constructs that can be closely nested in the teams region.
> -      // TODO: add distribute directive.
> -      NestingProhibited = !isOpenMPParallelDirective(CurrentRegion);
> +      NestingProhibited = !isOpenMPParallelDirective(CurrentRegion) &&
> +                          !isOpenMPDistributeDirective(CurrentRegion);
>        Recommend = ShouldBeInParallelRegion;
>      }
> +    if (!NestingProhibited && isOpenMPDistributeDirective(CurrentRegion))
> {
> +      // OpenMP 4.5 [2.17 Nesting of Regions]
> +      // The region associated with the distribute construct must be
> strictly
> +      // nested inside a teams region
> +      NestingProhibited = !isOpenMPTeamsDirective(ParentRegion);
> +      Recommend = ShouldBeInTeamsRegion;
> +    }
>      if (NestingProhibited) {
>        SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region)
>            << CloseNesting << getOpenMPDirectiveName(ParentRegion) <<
> Recommend
> @@ -2574,6 +2638,10 @@ StmtResult Sema::ActOnOpenMPExecutableDi
>                                             EndLoc, VarsWithInheritedDSA);
>      AllowedNameModifiers.push_back(OMPD_taskloop);
>      break;
> +  case OMPD_distribute:
> +    Res = ActOnOpenMPDistributeDirective(ClausesWithImplicit, AStmt,
> StartLoc,
> +                                         EndLoc, VarsWithInheritedDSA);
> +    break;
>    case OMPD_threadprivate:
>      llvm_unreachable("OpenMP Directive is not allowed");
>    case OMPD_unknown:
> @@ -3402,7 +3470,8 @@ static bool CheckOpenMPIterationSpace(
>            : OMPC_private;
>    if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
>          DVar.CKind != OMPC_threadprivate && DVar.CKind !=
> PredeterminedCKind) ||
> -       ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop) &&
> +       ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop ||
> +        isOpenMPDistributeDirective(DKind)) &&
>          !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
>          DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate &&
>          DVar.CKind != OMPC_threadprivate)) &&
> @@ -3441,7 +3510,8 @@ static bool CheckOpenMPIterationSpace(
>    ResultIterSpace.PreCond = ISC.BuildPreCond(DSA.getCurScope(),
> For->getCond());
>    ResultIterSpace.NumIterations = ISC.BuildNumIterations(
>        DSA.getCurScope(), (isOpenMPWorksharingDirective(DKind) ||
> -                          isOpenMPTaskLoopDirective(DKind)));
> +                          isOpenMPTaskLoopDirective(DKind) ||
> +                          isOpenMPDistributeDirective(DKind)));
>    ResultIterSpace.CounterVar = ISC.BuildCounterVar();
>    ResultIterSpace.PrivateCounterVar = ISC.BuildPrivateCounterVar();
>    ResultIterSpace.CounterInit = ISC.BuildCounterInit();
> @@ -3749,7 +3819,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>    QualType VType = LastIteration.get()->getType();
>    // Build variables passed into runtime, nesessary for worksharing
> directives.
>    ExprResult LB, UB, IL, ST, EUB;
> -  if (isOpenMPWorksharingDirective(DKind) ||
> isOpenMPTaskLoopDirective(DKind)) {
> +  if (isOpenMPWorksharingDirective(DKind) ||
> isOpenMPTaskLoopDirective(DKind) ||
> +      isOpenMPDistributeDirective(DKind)) {
>      // Lower bound variable, initialized with zero.
>      VarDecl *LBDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.lb");
>      LB = buildDeclRefExpr(SemaRef, LBDecl, VType, InitLoc);
> @@ -3798,7 +3869,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>      VarDecl *IVDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.iv");
>      IV = buildDeclRefExpr(SemaRef, IVDecl, VType, InitLoc);
>      Expr *RHS = (isOpenMPWorksharingDirective(DKind) ||
> -                 isOpenMPTaskLoopDirective(DKind))
> +                 isOpenMPTaskLoopDirective(DKind) ||
> +                 isOpenMPDistributeDirective(DKind))
>                      ? LB.get()
>                      : SemaRef.ActOnIntegerConstant(SourceLocation(),
> 0).get();
>      Init = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, IV.get(),
> RHS);
> @@ -3808,7 +3880,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>    // Loop condition (IV < NumIterations) or (IV <= UB) for worksharing
> loops.
>    SourceLocation CondLoc;
>    ExprResult Cond =
> -      (isOpenMPWorksharingDirective(DKind) ||
> isOpenMPTaskLoopDirective(DKind))
> +      (isOpenMPWorksharingDirective(DKind) ||
> +       isOpenMPTaskLoopDirective(DKind) ||
> isOpenMPDistributeDirective(DKind))
>            ? SemaRef.BuildBinOp(CurScope, CondLoc, BO_LE, IV.get(),
> UB.get())
>            : SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, IV.get(),
>                                 NumIterations.get());
> @@ -3828,7 +3901,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>    // Increments for worksharing loops (LB = LB + ST; UB = UB + ST).
>    // Used for directives with static scheduling.
>    ExprResult NextLB, NextUB;
> -  if (isOpenMPWorksharingDirective(DKind) ||
> isOpenMPTaskLoopDirective(DKind)) {
> +  if (isOpenMPWorksharingDirective(DKind) ||
> isOpenMPTaskLoopDirective(DKind) ||
> +      isOpenMPDistributeDirective(DKind)) {
>      // LB + ST
>      NextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, LB.get(),
> ST.get());
>      if (!NextLB.isUsable())
> @@ -5345,6 +5419,32 @@ StmtResult Sema::ActOnOpenMPTaskLoopSimd
>                                            NestedLoopCount, Clauses,
> AStmt, B);
>  }
>
> +StmtResult Sema::ActOnOpenMPDistributeDirective(
> +    ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
> +    SourceLocation EndLoc,
> +    llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
> +  if (!AStmt)
> +    return StmtError();
> +
> +  assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
> +  OMPLoopDirective::HelperExprs B;
> +  // In presence of clause 'collapse' with number of loops, it will
> +  // define the nested loops number.
> +  unsigned NestedLoopCount =
> +      CheckOpenMPLoop(OMPD_distribute, 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 for loop exprs were not built");
> +
> +  getCurFunction()->setHasBranchProtectedScope();
> +  return OMPDistributeDirective::Create(Context, StartLoc, EndLoc,
> +                                        NestedLoopCount, Clauses, AStmt,
> B);
> +}
> +
>  OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr
> *Expr,
>                                               SourceLocation StartLoc,
>                                               SourceLocation LParenLoc,
> @@ -6381,6 +6481,49 @@ OMPClause *Sema::ActOnOpenMPFirstprivate
>            continue;
>          }
>        }
> +
> +      // OpenMP 4.5 [2.15.3.4, Restrictions, p.3]
> +      // A list item that is private within a teams region must not
> appear in a
> +      // firstprivate clause on a distribute construct if any of the
> distribute
> +      // regions arising from the distribute construct ever bind to any
> of the
> +      // teams regions arising from the teams construct.
> +      // OpenMP 4.5 [2.15.3.4, Restrictions, p.3]
> +      // A list item that appears in a reduction clause of a teams
> construct
> +      // must not appear in a firstprivate clause on a distribute
> construct if
> +      // any of the distribute regions arising from the distribute
> construct
> +      // ever bind to any of the teams regions arising from the teams
> construct.
> +      // OpenMP 4.5 [2.10.8, Distribute Construct, p.3]
> +      // A list item may appear in a firstprivate or lastprivate clause
> but not
> +      // both.
> +      if (CurrDir == OMPD_distribute) {
> +        DVar = DSAStack->hasInnermostDSA(VD,
> MatchesAnyClause(OMPC_private),
> +                                         [](OpenMPDirectiveKind K) ->
> bool {
> +                                           return
> isOpenMPTeamsDirective(K);
> +                                         },
> +                                         false);
> +        if (DVar.CKind == OMPC_private &&
> isOpenMPTeamsDirective(DVar.DKind)) {
> +          Diag(ELoc, diag::err_omp_firstprivate_distribute_private_teams);
> +          ReportOriginalDSA(*this, DSAStack, VD, DVar);
> +          continue;
> +        }
> +        DVar = DSAStack->hasInnermostDSA(VD,
> MatchesAnyClause(OMPC_reduction),
> +                                         [](OpenMPDirectiveKind K) ->
> bool {
> +                                           return
> isOpenMPTeamsDirective(K);
> +                                         },
> +                                         false);
> +        if (DVar.CKind == OMPC_reduction &&
> +            isOpenMPTeamsDirective(DVar.DKind)) {
> +          Diag(ELoc,
> diag::err_omp_firstprivate_distribute_in_teams_reduction);
> +          ReportOriginalDSA(*this, DSAStack, VD, DVar);
> +          continue;
> +        }
> +        DVar = DSAStack->getTopDSA(VD, false);
> +        if (DVar.CKind == OMPC_lastprivate) {
> +          Diag(ELoc,
> diag::err_omp_firstprivate_and_lastprivate_in_distribute);
> +          ReportOriginalDSA(*this, DSAStack, VD, DVar);
> +          continue;
> +        }
> +      }
>      }
>
>      // Variably modified types are not supported for tasks.
> @@ -6577,6 +6720,18 @@ OMPClause *Sema::ActOnOpenMPLastprivateC
>      if (AssignmentOp.isInvalid())
>        continue;
>
> +    // OpenMP 4.5 [2.10.8, Distribute Construct, p.3]
> +    // A list item may appear in a firstprivate or lastprivate clause but
> not
> +    // both.
> +    if (CurrDir == OMPD_distribute) {
> +      DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
> +      if (DVar.CKind == OMPC_firstprivate) {
> +        Diag(ELoc,
> diag::err_omp_firstprivate_and_lastprivate_in_distribute);
> +        ReportOriginalDSA(*this, DSAStack, VD, DVar);
> +        continue;
> +      }
> +    }
> +
>      if (TopDVar.CKind != OMPC_firstprivate)
>        DSAStack->addDSA(VD, DE, OMPC_lastprivate);
>      Vars.push_back(DE);
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Mon Dec  7 22:21:03 2015
> @@ -7386,6 +7386,17 @@ StmtResult TreeTransform<Derived>::Trans
>    return Res;
>  }
>
> +template <typename Derived>
> +StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
> +    OMPDistributeDirective *D) {
> +  DeclarationNameInfo DirName;
> +  getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName,
> nullptr,
> +                                             D->getLocStart());
> +  StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
> +  getDerived().getSema().EndOpenMPDSABlock(Res.get());
> +  return Res;
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // OpenMP clause transformation
>
>  //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Mon Dec  7 22:21:03 2015
> @@ -2441,6 +2441,10 @@ void ASTStmtReader::VisitOMPTaskLoopSimd
>    VisitOMPLoopDirective(D);
>  }
>
> +void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective
> *D) {
> +  VisitOMPLoopDirective(D);
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // ASTReader Implementation
>
>  //===----------------------------------------------------------------------===//
> @@ -3079,6 +3083,14 @@ Stmt *ASTReader::ReadStmtFromStream(Modu
>        break;
>      }
>
> +    case STMT_OMP_DISTRIBUTE_DIRECTIVE: {
> +      unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
> +      unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
> +      S = OMPDistributeDirective::CreateEmpty(Context, NumClauses,
> CollapsedNum,
> +                                              Empty);
> +      break;
> +    }
> +
>      case EXPR_CXX_OPERATOR_CALL:
>        S = new (Context) CXXOperatorCallExpr(Context, Empty);
>        break;
>
> Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Mon Dec  7 22:21:03 2015
> @@ -2261,6 +2261,11 @@ void ASTStmtWriter::VisitOMPTaskLoopSimd
>    Code = serialization::STMT_OMP_TASKLOOP_SIMD_DIRECTIVE;
>  }
>
> +void ASTStmtWriter::VisitOMPDistributeDirective(OMPDistributeDirective
> *D) {
> +  VisitOMPLoopDirective(D);
> +  Code = serialization::STMT_OMP_DISTRIBUTE_DIRECTIVE;
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // ASTWriter Implementation
>
>  //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=255001&r1=255000&r2=255001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Mon Dec  7 22:21:03
> 2015
> @@ -831,6 +831,7 @@ void ExprEngine::Visit(const Stmt *S, Ex
>      case Stmt::OMPCancelDirectiveClass:
>      case Stmt::OMPTaskLoopDirectiveClass:
>      case Stmt::OMPTaskLoopSimdDirectiveClass:
> +    case Stmt::OMPDist
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151208/3fb02e52/attachment-0001.html>


More information about the cfe-commits mailing list