From: Alexey Bataev Date: Wed, 25 Jun 2014 06:52:00 +0000 (+0000) Subject: [OPENMP] OMPSimdDirective and OMPForDirective: added initialization for CollapsedNum... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3f3078bf289bec6116f4b43221e8aa7609106405;p=clang [OPENMP] OMPSimdDirective and OMPForDirective: added initialization for CollapsedNum member. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211672 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/StmtOpenMP.h b/include/clang/AST/StmtOpenMP.h index a2583dce3f..7bf74eed8c 100644 --- a/include/clang/AST/StmtOpenMP.h +++ b/include/clang/AST/StmtOpenMP.h @@ -270,11 +270,12 @@ public: /// \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. /// static OMPSimdDirective *Create(const ASTContext &C, SourceLocation StartLoc, - SourceLocation EndLoc, + SourceLocation EndLoc, unsigned CollapsedNum, ArrayRef Clauses, Stmt *AssociatedStmt); @@ -338,11 +339,12 @@ public: /// \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. /// static OMPForDirective *Create(const ASTContext &C, SourceLocation StartLoc, - SourceLocation EndLoc, + SourceLocation EndLoc, unsigned CollapsedNum, ArrayRef Clauses, Stmt *AssociatedStmt); diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index ead73fc38b..c0aee62ae7 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -1334,17 +1334,16 @@ OMPParallelDirective *OMPParallelDirective::CreateEmpty(const ASTContext &C, return new (Mem) OMPParallelDirective(NumClauses); } -OMPSimdDirective *OMPSimdDirective::Create(const ASTContext &C, - SourceLocation StartLoc, - SourceLocation EndLoc, - ArrayRef Clauses, - Stmt *AssociatedStmt) { +OMPSimdDirective * +OMPSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc, + SourceLocation EndLoc, unsigned CollapsedNum, + ArrayRef Clauses, Stmt *AssociatedStmt) { unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSimdDirective), llvm::alignOf()); - void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + - sizeof(Stmt *)); - OMPSimdDirective *Dir = new (Mem) OMPSimdDirective(StartLoc, EndLoc, - 1, Clauses.size()); + void *Mem = + C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); + OMPSimdDirective *Dir = new (Mem) + OMPSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); Dir->setClauses(Clauses); Dir->setAssociatedStmt(AssociatedStmt); return Dir; @@ -1356,22 +1355,21 @@ OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C, EmptyShell) { unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSimdDirective), llvm::alignOf()); - void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses + - sizeof(Stmt *)); + void *Mem = + C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); return new (Mem) OMPSimdDirective(CollapsedNum, NumClauses); } -OMPForDirective *OMPForDirective::Create(const ASTContext &C, - SourceLocation StartLoc, - SourceLocation EndLoc, - ArrayRef Clauses, - Stmt *AssociatedStmt) { +OMPForDirective * +OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc, + SourceLocation EndLoc, unsigned CollapsedNum, + ArrayRef Clauses, Stmt *AssociatedStmt) { unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPForDirective), llvm::alignOf()); void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); OMPForDirective *Dir = - new (Mem) OMPForDirective(StartLoc, EndLoc, 1, Clauses.size()); + new (Mem) OMPForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); Dir->setClauses(Clauses); Dir->setAssociatedStmt(AssociatedStmt); return Dir; diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 5cf47c0ac1..aef7ae5a59 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -1500,8 +1500,11 @@ static Stmt *IgnoreContainerStmts(Stmt *S, bool IgnoreCaptured) { } /// \brief Called on a for stmt to check itself and nested loops (if any). -static bool CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *NestedLoopCountExpr, - Stmt *AStmt, Sema &SemaRef, DSAStackTy &DSA) { +/// \return Returns 0 if one of the collapsed stmts is not canonical for loop, +/// number of collapsed loops otherwise. +static unsigned CheckOpenMPLoop(OpenMPDirectiveKind DKind, + Expr *NestedLoopCountExpr, Stmt *AStmt, + Sema &SemaRef, DSAStackTy &DSA) { unsigned NestedLoopCount = 1; if (NestedLoopCountExpr) { // Found 'collapse' clause - calculate collapse number. @@ -1515,14 +1518,14 @@ static bool CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *NestedLoopCountExpr for (unsigned Cnt = 0; Cnt < NestedLoopCount; ++Cnt) { if (CheckOpenMPIterationSpace(DKind, CurStmt, SemaRef, DSA, Cnt, NestedLoopCount, NestedLoopCountExpr)) - return true; + return 0; // Move on to the next nested for loop, or to the loop body. CurStmt = IgnoreContainerStmts(cast(CurStmt)->getBody(), false); } // FIXME: Build resulting iteration space for IR generation (collapsing // iteration spaces when loop count > 1 ('collapse' clause)). - return false; + return NestedLoopCount; } static Expr *GetCollapseNumberExpr(ArrayRef Clauses) { @@ -1540,24 +1543,28 @@ StmtResult Sema::ActOnOpenMPSimdDirective(ArrayRef Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) { // In presence of clause 'collapse', it will define the nested loops number. - if (CheckOpenMPLoop(OMPD_simd, GetCollapseNumberExpr(Clauses), - AStmt, *this, *DSAStack)) + unsigned NestedLoopCount = CheckOpenMPLoop( + OMPD_simd, GetCollapseNumberExpr(Clauses), AStmt, *this, *DSAStack); + if (NestedLoopCount == 0) return StmtError(); getCurFunction()->setHasBranchProtectedScope(); - return OMPSimdDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); + return OMPSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, + Clauses, AStmt); } StmtResult Sema::ActOnOpenMPForDirective(ArrayRef Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) { // In presence of clause 'collapse', it will define the nested loops number. - if (CheckOpenMPLoop(OMPD_for, GetCollapseNumberExpr(Clauses), - AStmt, *this, *DSAStack)) + unsigned NestedLoopCount = CheckOpenMPLoop( + OMPD_for, GetCollapseNumberExpr(Clauses), AStmt, *this, *DSAStack); + if (NestedLoopCount == 0) return StmtError(); getCurFunction()->setHasBranchProtectedScope(); - return OMPForDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); + return OMPForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, + Clauses, AStmt); } OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,