diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2014-06-25 06:52:00 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-06-25 06:52:00 +0000 |
commit | 3f3078bf289bec6116f4b43221e8aa7609106405 (patch) | |
tree | ea341fc59b6eddf8137f07681839c174ea360793 | |
parent | e74fa2a6cd5e37067db371fbffd7f6c9e7491b61 (diff) | |
download | clang-3f3078bf289bec6116f4b43221e8aa7609106405.tar.gz clang-3f3078bf289bec6116f4b43221e8aa7609106405.tar.bz2 clang-3f3078bf289bec6116f4b43221e8aa7609106405.tar.xz |
[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
-rw-r--r-- | include/clang/AST/StmtOpenMP.h | 6 | ||||
-rw-r--r-- | lib/AST/Stmt.cpp | 32 | ||||
-rw-r--r-- | lib/Sema/SemaOpenMP.cpp | 27 |
3 files changed, 36 insertions, 29 deletions
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<OMPClause *> 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<OMPClause *> 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<OMPClause *> Clauses, - Stmt *AssociatedStmt) { +OMPSimdDirective * +OMPSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc, + SourceLocation EndLoc, unsigned CollapsedNum, + ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSimdDirective), llvm::alignOf<OMPClause *>()); - 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<OMPClause *>()); - 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<OMPClause *> Clauses, - Stmt *AssociatedStmt) { +OMPForDirective * +OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc, + SourceLocation EndLoc, unsigned CollapsedNum, + ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPForDirective), llvm::alignOf<OMPClause *>()); 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<ForStmt>(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<OMPClause *> Clauses) { @@ -1540,24 +1543,28 @@ StmtResult Sema::ActOnOpenMPSimdDirective(ArrayRef<OMPClause *> 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<OMPClause *> 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, |