Author: abataev Date: Wed Nov 22 13:12:03 2017 New Revision: 318881 URL: http://llvm.org/viewvc/llvm-project?rev=318881&view=rev Log: [OPENMP] Add support for cancel constructs in `target teams distribute parallel for`.
Add support for cancel/cancellation point directives inside `target teams distribute parallel for` directives. Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h cfe/trunk/lib/AST/StmtOpenMP.cpp cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/lib/Serialization/ASTReaderStmt.cpp cfe/trunk/lib/Serialization/ASTWriterStmt.cpp cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_ast_print.cpp Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtOpenMP.h?rev=318881&r1=318880&r2=318881&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/StmtOpenMP.h (original) +++ cfe/trunk/include/clang/AST/StmtOpenMP.h Wed Nov 22 13:12:03 2017 @@ -957,8 +957,13 @@ public: T->getStmtClass() == OMPTargetSimdDirectiveClass || T->getStmtClass() == OMPTeamsDistributeDirectiveClass || T->getStmtClass() == OMPTeamsDistributeSimdDirectiveClass || - T->getStmtClass() == OMPTeamsDistributeParallelForSimdDirectiveClass || - T->getStmtClass() == OMPTeamsDistributeParallelForDirectiveClass; + T->getStmtClass() == + OMPTeamsDistributeParallelForSimdDirectiveClass || + T->getStmtClass() == OMPTeamsDistributeParallelForDirectiveClass || + T->getStmtClass() == + OMPTargetTeamsDistributeParallelForDirectiveClass || + T->getStmtClass() == + OMPTargetTeamsDistributeParallelForSimdDirectiveClass; } }; @@ -3799,6 +3804,8 @@ public: class OMPTargetTeamsDistributeParallelForDirective final : public OMPLoopDirective { friend class ASTStmtReader; + /// true if the construct has inner cancel directive. + bool HasCancel = false; /// Build directive with the given start and end location. /// @@ -3814,7 +3821,8 @@ class OMPTargetTeamsDistributeParallelFo : OMPLoopDirective(this, OMPTargetTeamsDistributeParallelForDirectiveClass, OMPD_target_teams_distribute_parallel_for, StartLoc, - EndLoc, CollapsedNum, NumClauses) {} + EndLoc, CollapsedNum, NumClauses), + HasCancel(false) {} /// Build an empty directive. /// @@ -3826,7 +3834,11 @@ class OMPTargetTeamsDistributeParallelFo : OMPLoopDirective( this, OMPTargetTeamsDistributeParallelForDirectiveClass, OMPD_target_teams_distribute_parallel_for, SourceLocation(), - SourceLocation(), CollapsedNum, NumClauses) {} + SourceLocation(), CollapsedNum, NumClauses), + HasCancel(false) {} + + /// Set cancel state. + void setHasCancel(bool Has) { HasCancel = Has; } public: /// Creates directive with a list of \a Clauses. @@ -3838,11 +3850,12 @@ public: /// \param Clauses List of clauses. /// \param AssociatedStmt Statement, associated with the directive. /// \param Exprs Helper expressions for CodeGen. + /// \param HasCancel true if this directive has inner cancel directive. /// static OMPTargetTeamsDistributeParallelForDirective * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, - Stmt *AssociatedStmt, const HelperExprs &Exprs); + Stmt *AssociatedStmt, const HelperExprs &Exprs, bool HasCancel); /// Creates an empty directive with the place for \a NumClauses clauses. /// @@ -3854,6 +3867,9 @@ public: CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell); + /// Return true if current directive has inner cancel directive. + bool hasCancel() const { return HasCancel; } + static bool classof(const Stmt *T) { return T->getStmtClass() == OMPTargetTeamsDistributeParallelForDirectiveClass; Modified: cfe/trunk/lib/AST/StmtOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtOpenMP.cpp?rev=318881&r1=318880&r2=318881&view=diff ============================================================================== --- cfe/trunk/lib/AST/StmtOpenMP.cpp (original) +++ cfe/trunk/lib/AST/StmtOpenMP.cpp Wed Nov 22 13:12:03 2017 @@ -1624,7 +1624,7 @@ OMPTargetTeamsDistributeParallelForDirec OMPTargetTeamsDistributeParallelForDirective::Create( const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, - const HelperExprs &Exprs) { + const HelperExprs &Exprs, bool HasCancel) { auto Size = llvm::alignTo(sizeof(OMPTargetTeamsDistributeParallelForDirective), alignof(OMPClause *)); @@ -1670,6 +1670,7 @@ OMPTargetTeamsDistributeParallelForDirec Dir->setCombinedCond(Exprs.DistCombinedFields.Cond); Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB); Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB); + Dir->HasCancel = HasCancel; return Dir; } Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=318881&r1=318880&r2=318881&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original) +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Wed Nov 22 13:12:03 2017 @@ -2014,6 +2014,9 @@ emitInnerParallelForWhenCombined(CodeGen HasCancel = D->hasCancel(); else if (const auto *D = dyn_cast<OMPDistributeParallelForDirective>(&S)) HasCancel = D->hasCancel(); + else if (const auto *D = + dyn_cast<OMPTargetTeamsDistributeParallelForDirective>(&S)) + HasCancel = D->hasCancel(); } CodeGenFunction::OMPCancelStackRAII CancelRegion(CGF, S.getDirectiveKind(), HasCancel); @@ -3949,7 +3952,8 @@ CodeGenFunction::getOMPCancelDestination Kind == OMPD_parallel_sections || Kind == OMPD_parallel_for || Kind == OMPD_distribute_parallel_for || Kind == OMPD_target_parallel_for || - Kind == OMPD_teams_distribute_parallel_for); + Kind == OMPD_teams_distribute_parallel_for || + Kind == OMPD_target_teams_distribute_parallel_for); return OMPCancelStack.getExitBlock(); } Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=318881&r1=318880&r2=318881&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Wed Nov 22 13:12:03 2017 @@ -2593,7 +2593,8 @@ static bool checkNestingOfRegions(Sema & (ParentRegion == OMPD_for || ParentRegion == OMPD_parallel_for || ParentRegion == OMPD_target_parallel_for || ParentRegion == OMPD_distribute_parallel_for || - ParentRegion == OMPD_teams_distribute_parallel_for)) || + ParentRegion == OMPD_teams_distribute_parallel_for || + ParentRegion == OMPD_target_teams_distribute_parallel_for)) || (CancelRegion == OMPD_taskgroup && ParentRegion == OMPD_task) || (CancelRegion == OMPD_sections && (ParentRegion == OMPD_section || ParentRegion == OMPD_sections || @@ -7324,7 +7325,8 @@ StmtResult Sema::ActOnOpenMPTargetTeamsD getCurFunction()->setHasBranchProtectedScope(); return OMPTargetTeamsDistributeParallelForDirective::Create( - Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); + Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, + DSAStack->isCancelRegion()); } StmtResult Sema::ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective( Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=318881&r1=318880&r2=318881&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original) +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Wed Nov 22 13:12:03 2017 @@ -2978,6 +2978,7 @@ void ASTStmtReader::VisitOMPTargetTeamsD void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForDirective( OMPTargetTeamsDistributeParallelForDirective *D) { VisitOMPLoopDirective(D); + D->setHasCancel(Record.readInt()); } void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForSimdDirective( Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=318881&r1=318880&r2=318881&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Wed Nov 22 13:12:03 2017 @@ -2636,6 +2636,7 @@ void ASTStmtWriter::VisitOMPTargetTeamsD void ASTStmtWriter::VisitOMPTargetTeamsDistributeParallelForDirective( OMPTargetTeamsDistributeParallelForDirective *D) { VisitOMPLoopDirective(D); + Record.push_back(D->hasCancel() ? 1 : 0); Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE; } Modified: cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_ast_print.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_ast_print.cpp?rev=318881&r1=318880&r2=318881&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_ast_print.cpp (original) +++ cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_ast_print.cpp Wed Nov 22 13:12:03 2017 @@ -24,8 +24,10 @@ protected: public: S7(typename T::type v) : a(v) { #pragma omp target teams distribute parallel for private(a) private(this->a) private(T::a) - for (int k = 0; k < a.a; ++k) + for (int k = 0; k < a.a; ++k) { ++this->a.a; +#pragma omp cancel for + } } S7 &operator=(S7 &s) { #pragma omp target teams distribute parallel for private(a) private(this->a) @@ -43,6 +45,7 @@ public: } }; // CHECK: #pragma omp target teams distribute parallel for private(this->a) private(this->a) private(T::a) +// CHECK: #pragma omp cancel for // CHECK: #pragma omp target teams distribute parallel for private(this->a) private(this->a) // CHECK: #pragma omp target teams distribute parallel for default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits