]> granicus.if.org Git - clang/commitdiff
Revert "[OPENMP]Fix PR41767: diagnose DSA for variables in clauses with default(none)."
authorRoman Lebedev <lebedev.ri@gmail.com>
Thu, 9 May 2019 10:47:45 +0000 (10:47 +0000)
committerRoman Lebedev <lebedev.ri@gmail.com>
Thu, 9 May 2019 10:47:45 +0000 (10:47 +0000)
This implementation isn't sound as per the standard.
It erroneously diagnoses e.g. the following case:
```
$ cat test.cpp
void f(int n) {
 #pragma omp parallel default(none) if(n)
    ;
}
```
```
$ ./bin/clang -fopenmp test.cpp
test.cpp:2:40: error: variable 'n' must have explicitly specified data sharing attributes
 #pragma omp parallel default(none) if(n)
                                       ^
test.cpp:2:31: note: explicit data sharing attribute requested here
 #pragma omp parallel default(none) if(n)
                              ^
1 error generated.
```

As per OpenMP Application Programming Interface Version 5.0 November 2018:
* 2.19.4.1default Clause
  The default clause explicitly determines the data-sharing attributes of
  variables that are referenced *in a parallel, teams, or task generating
  construct and would otherwise be implicitly determined
  (see Section 2.19.1.1 on page 270).
* 2.6.1 Determining the Number of Threads for a parallel Region
  Using a variable in an if or num_threads clause expression of a parallel
  construct causes an implicit reference to the variable in all enclosing
  constructs. The if clause expression and the num_threads clause expression
  are evaluated in the context outside of the parallel construct,

This reverts commit r360073.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@360326 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOpenMP.cpp
test/OpenMP/distribute_parallel_for_ast_print.cpp
test/OpenMP/distribute_parallel_for_simd_ast_print.cpp
test/OpenMP/parallel_for_ast_print.cpp
test/OpenMP/parallel_for_schedule_messages.cpp
test/OpenMP/target_parallel_for_ast_print.cpp
test/OpenMP/target_parallel_for_simd_ast_print.cpp
test/OpenMP/target_teams_distribute_parallel_for_if_messages.cpp

index c6c3a6b590176da39b95088f8c3924eb2f62f873..276f1506c4babf8201f8eea7c7c6935a02f4fb1e 100644 (file)
@@ -750,8 +750,7 @@ bool isImplicitTaskingRegion(OpenMPDirectiveKind DKind) {
 }
 
 bool isImplicitOrExplicitTaskingRegion(OpenMPDirectiveKind DKind) {
-  return isImplicitTaskingRegion(DKind) || isOpenMPTaskingDirective(DKind) ||
-         DKind == OMPD_unknown;
+  return isImplicitTaskingRegion(DKind) || isOpenMPTaskingDirective(DKind) || DKind == OMPD_unknown;
 }
 
 } // namespace
@@ -2561,17 +2560,9 @@ public:
         E->containsUnexpandedParameterPack() || E->isInstantiationDependent())
       return;
     if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
-      // Check the datasharing rules for the expressions in the clauses.
-      if (!CS) {
-        if (auto *CED = dyn_cast<OMPCapturedExprDecl>(VD))
-          if (!CED->hasAttr<OMPCaptureNoInitAttr>()) {
-            Visit(CED->getInit());
-            return;
-          }
-      }
       VD = VD->getCanonicalDecl();
       // Skip internally declared variables.
-      if (VD->hasLocalStorage() && CS && !CS->capturesVariable(VD))
+      if (VD->hasLocalStorage() && !CS->capturesVariable(VD))
         return;
 
       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, /*FromParent=*/false);
@@ -2582,7 +2573,7 @@ public:
       // Skip internally declared static variables.
       llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
           OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
-      if (VD->hasGlobalStorage() && CS && !CS->capturesVariable(VD) &&
+      if (VD->hasGlobalStorage() && !CS->capturesVariable(VD) &&
           (!Res || *Res != OMPDeclareTargetDeclAttr::MT_Link))
         return;
 
@@ -4195,90 +4186,6 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
 
   ErrorFound = Res.isInvalid() || ErrorFound;
 
-  // Check variables in the clauses if default(none) was specified.
-  if (DSAStack->getDefaultDSA() == DSA_none) {
-    DSAAttrChecker DSAChecker(DSAStack, *this, nullptr);
-    for (OMPClause *C : Clauses) {
-      switch (C->getClauseKind()) {
-      case OMPC_num_threads:
-      case OMPC_dist_schedule:
-        // Do not analyse if no parent teams directive.
-        if (isOpenMPTeamsDirective(DSAStack->getCurrentDirective()))
-          break;
-        continue;
-      case OMPC_if:
-        if ((isOpenMPTeamsDirective(DSAStack->getCurrentDirective()) &&
-             cast<OMPIfClause>(C)->getNameModifier() != OMPD_target) ||
-            isOpenMPParallelDirective(DSAStack->getCurrentDirective()))
-          break;
-        continue;
-      case OMPC_schedule:
-        break;
-      case OMPC_ordered:
-      case OMPC_device:
-      case OMPC_num_teams:
-      case OMPC_thread_limit:
-      case OMPC_priority:
-      case OMPC_grainsize:
-      case OMPC_num_tasks:
-      case OMPC_hint:
-      case OMPC_collapse:
-      case OMPC_safelen:
-      case OMPC_simdlen:
-      case OMPC_final:
-      case OMPC_default:
-      case OMPC_proc_bind:
-      case OMPC_private:
-      case OMPC_firstprivate:
-      case OMPC_lastprivate:
-      case OMPC_shared:
-      case OMPC_reduction:
-      case OMPC_task_reduction:
-      case OMPC_in_reduction:
-      case OMPC_linear:
-      case OMPC_aligned:
-      case OMPC_copyin:
-      case OMPC_copyprivate:
-      case OMPC_nowait:
-      case OMPC_untied:
-      case OMPC_mergeable:
-      case OMPC_allocate:
-      case OMPC_read:
-      case OMPC_write:
-      case OMPC_update:
-      case OMPC_capture:
-      case OMPC_seq_cst:
-      case OMPC_depend:
-      case OMPC_threads:
-      case OMPC_simd:
-      case OMPC_map:
-      case OMPC_nogroup:
-      case OMPC_defaultmap:
-      case OMPC_to:
-      case OMPC_from:
-      case OMPC_use_device_ptr:
-      case OMPC_is_device_ptr:
-        continue;
-      case OMPC_allocator:
-      case OMPC_flush:
-      case OMPC_threadprivate:
-      case OMPC_uniform:
-      case OMPC_unknown:
-      case OMPC_unified_address:
-      case OMPC_unified_shared_memory:
-      case OMPC_reverse_offload:
-      case OMPC_dynamic_allocators:
-      case OMPC_atomic_default_mem_order:
-        llvm_unreachable("Unexpected clause");
-      }
-      for (Stmt *CC : C->children()) {
-        if (CC)
-          DSAChecker.Visit(CC);
-      }
-    }
-    for (auto &P : DSAChecker.getVarsWithInheritedDSA())
-      VarsWithInheritedDSA[P.getFirst()] = P.getSecond();
-  }
   for (const auto &P : VarsWithInheritedDSA) {
     Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable)
         << P.first << P.second->getSourceRange();
index 3b32d08eb36a496847aff2e273fb041887b9abd4..56bae3965b6754794a83f084c3cc0a95e6aee745 100644 (file)
@@ -122,8 +122,8 @@ void foo(int argc, char **argv) {
   [&]() {
 #pragma omp target
 #pragma omp teams
-#pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
-    // CHECK: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
+#pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)
+    // CHECK: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)
     for (int i = 0; i < 2; ++i)
 // CHECK: for (int i = 0; i < 2; ++i)
       [&]() {
@@ -156,8 +156,8 @@ int main(int argc, char **argv) {
 #pragma omp threadprivate(g)
 #pragma omp target
 #pragma omp teams
-#pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
-  // CHECK: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
+#pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)
+  // CHECK: #pragma omp distribute parallel for schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)
   for (int i = 0; i < 2; ++i)
     a = 2;
 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
index 137a7460f5fdd69029abbd0b585ca7fdbc272766..db3300ed29db4c218a8f67e8480862144490957a 100644 (file)
@@ -123,8 +123,8 @@ int main(int argc, char **argv) {
 #pragma omp threadprivate(g)
 #pragma omp target
 #pragma omp teams
-#pragma omp distribute parallel for simd schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
-  // CHECK: #pragma omp distribute parallel for simd schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a) shared(argc)
+#pragma omp distribute parallel for simd schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)
+  // CHECK: #pragma omp distribute parallel for simd schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)
   for (int i = 0; i < 2; ++i)
     a = 2;
 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
index 06b6ab3b666fff19a142d83724c461d327460592..8e02ec40c284c22c17bdacf525d412ea50910ca1 100644 (file)
@@ -132,8 +132,8 @@ int main(int argc, char **argv) {
 // CHECK: static int a;
   static float g;
 #pragma omp threadprivate(g)
-#pragma omp parallel for schedule(guided, argc) default(none) copyin(g) linear(a) shared(argc)
-  // CHECK: #pragma omp parallel for schedule(guided, argc) default(none) copyin(g) linear(a) shared(argc)
+#pragma omp parallel for schedule(guided, argc) default(none) copyin(g) linear(a)
+  // CHECK: #pragma omp parallel for schedule(guided, argc) default(none) copyin(g) linear(a)
   for (int i = 0; i < 2; ++i)
     a = 2;
 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
index dfdd36dddde1348773b48b63d9ccd3e8511017a3..5664529956b103ce867dfc32ae19f3e720a26e03 100644 (file)
@@ -50,8 +50,6 @@ T tmain(T argc, S **argv) {
   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
   #pragma omp parallel for schedule (static, N) // expected-error {{argument to 'schedule' clause must be a strictly positive integer value}}
   for (T i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
-  #pragma omp parallel for schedule (static, argc+argv[0][0]) default(none) // expected-error 2 {{variable 'argv' must have explicitly specified data sharing attributes}} expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}} expected-note 4 {{explicit data sharing attribute requested here}}
-  for (T i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
   return argc;
 }
 
index 80c20baca0b96dcafa926a47102c1337a7ab3c99..5e22ef3dd8e1382a35c4f283fe9c214a25417e01 100644 (file)
@@ -176,8 +176,8 @@ int main(int argc, char **argv) {
 // CHECK: static int a;
   static float g;
 #pragma omp threadprivate(g)
-#pragma omp target parallel for schedule(guided, argc) default(none) linear(a) shared(argc)
-  // CHECK: #pragma omp target parallel for schedule(guided, argc) default(none) linear(a) shared(argc)
+#pragma omp target parallel for schedule(guided, argc) default(none) linear(a)
+  // CHECK: #pragma omp target parallel for schedule(guided, argc) default(none) linear(a)
   for (int i = 0; i < 2; ++i)
     a = 2;
 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
index a368b8a088d59da73eac94281c1744ab326e9313..4ac606d90eaa77e9a31d16ae594fa49090af9e7c 100644 (file)
@@ -200,8 +200,8 @@ int main(int argc, char **argv) {
 // CHECK: int clen = 5;
   static float g;
 #pragma omp threadprivate(g)
-#pragma omp target parallel for simd schedule(guided, argc) default(none) linear(a) shared(argc)
-  // CHECK: #pragma omp target parallel for simd schedule(guided, argc) default(none) linear(a) shared(argc)
+#pragma omp target parallel for simd schedule(guided, argc) default(none) linear(a)
+  // CHECK: #pragma omp target parallel for simd schedule(guided, argc) default(none) linear(a)
   for (int i = 0; i < 2; ++i)
     a = 2;
 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
index 328e191ed35ee7b70ebacf79f1fecd35f8b3996d..6f990f7bd28e143688e1f7de99a1f7870e3e80f6 100644 (file)
@@ -106,8 +106,6 @@ int main(int argc, char **argv) {
   for (i = 0; i < argc; ++i) foo();
 #pragma omp target teams distribute parallel for if(distribute : argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp target teams distribute parallel for'}}
   for (i = 0; i < argc; ++i) foo();
-#pragma omp target teams distribute parallel for default(none) if(argc+argv[0][0]) // expected-error {{variable 'argv' must have explicitly specified data sharing attributes}} expected-error {{variable 'argc' must have explicitly specified data sharing attributes}} expected-note 2 {{explicit data sharing attribute requested here}}
-  for (i = 0; i < argc; ++i) foo();
 
   return tmain(argc, argv);
 }