From: Alexey Bataev Date: Thu, 25 Apr 2019 16:21:13 +0000 (+0000) Subject: [OPENMP] Improved check for the linear dependency in the non-rectangular X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=95b64a39967af2818c21254a8e1992a0e0e07c47;p=clang [OPENMP] Improved check for the linear dependency in the non-rectangular loop nests. Added a checks that the initializer/condition expressions depend only only of the single previous loop iteration variable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359200 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 5237456361..238c9eec70 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -9172,6 +9172,8 @@ def err_omp_expected_private_copy_for_allocate : Error< "the referenced item is not found in any private clause on the same directive">; def err_omp_stmt_depends_on_loop_counter : Error< "the loop %select{initializer|condition}0 expression depends on the current loop control variable">; +def err_omp_invariant_or_linear_dependancy : Error< + "expected loop invariant expression or ' * %0 + ' kind of expression">; } // end of OpenMP category let CategoryName = "Related Result Type Issue" in { diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index a5afce42cb..8aaa1848a6 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -4715,6 +4715,7 @@ class LoopCounterRefChecker final Sema &SemaRef; DSAStackTy &Stack; const ValueDecl *CurLCDecl = nullptr; + const ValueDecl *DepDecl = nullptr; bool IsInitializer = true; public: @@ -4728,6 +4729,18 @@ public: return false; } const auto &&Data = Stack.isLoopControlVariable(VD); + if (DepDecl && Data.first) { + SmallString<128> Name; + llvm::raw_svector_ostream OS(Name); + DepDecl->getNameForDiagnostic(OS, SemaRef.getPrintingPolicy(), + /*Qualified=*/true); + SemaRef.Diag(E->getExprLoc(), + diag::err_omp_invariant_or_linear_dependancy) + << OS.str(); + return false; + } + if (Data.first) + DepDecl = VD; return Data.first; } return false; @@ -4742,16 +4755,27 @@ public: return false; } const auto &&Data = Stack.isLoopControlVariable(VD); + if (DepDecl && Data.first) { + SmallString<128> Name; + llvm::raw_svector_ostream OS(Name); + DepDecl->getNameForDiagnostic(OS, SemaRef.getPrintingPolicy(), + /*Qualified=*/true); + SemaRef.Diag(E->getExprLoc(), + diag::err_omp_invariant_or_linear_dependancy) + << OS.str(); + return false; + } + if (Data.first) + DepDecl = VD; return Data.first; } return false; } bool VisitStmt(const Stmt *S) { - for (const Stmt *Child : S->children()) { - if (Child && Visit(Child)) - return true; - } - return false; + bool Res = true; + for (const Stmt *Child : S->children()) + Res = Child && Visit(Child) && Res; + return Res; } explicit LoopCounterRefChecker(Sema &SemaRef, DSAStackTy &Stack, const ValueDecl *CurLCDecl, bool IsInitializer) diff --git a/test/OpenMP/for_loop_messages.cpp b/test/OpenMP/for_loop_messages.cpp index 01c96add28..f3fba6781b 100644 --- a/test/OpenMP/for_loop_messages.cpp +++ b/test/OpenMP/for_loop_messages.cpp @@ -293,6 +293,12 @@ int test_iteration_spaces() { for (ii = ii * 10 + 25; ii < ii / ii - 23; ii += 1) c[ii] = a[ii]; +// expected-error@+3 {{expected loop invariant expression or ' * ii + ' kind of expression}} +#pragma omp for collapse(2) + for (ii = 10 + 25; ii < 1000; ii += 1) + for (kk = ii * 10 + 25; kk < ii / ii - 23; kk += 1) + ; + #pragma omp parallel // expected-note@+2 {{defined as firstprivate}} // expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be firstprivate, predetermined as private}} @@ -603,7 +609,7 @@ int test_with_random_access_iterator() { template class TC { - int ii; + int ii, iii; public: int dotest_lt(IT begin, IT end) { #pragma omp parallel @@ -613,6 +619,14 @@ public: for (ii = ii * 10 + 25; ii < ii / ii - 23; ii += 1) ; +#pragma omp parallel +// expected-error@+4 2 {{expected loop invariant expression or ' * ii + ' kind of expression}} +// expected-error@+3 {{expected loop invariant expression or ' * TC::ii + ' kind of expression}} +#pragma omp for collapse(2) + for (ii = 10 + 25; ii < 1000; ii += 1) + for (iii = ii * 10 + 25; iii < ii / ii - 23; iii += 1) + ; + #pragma omp parallel // expected-note@+3 {{loop step is expected to be positive due to this condition}} // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}