Browse Source

[OPENMP 4.0] Allow to use 'omp simd' directive inside other simd-regions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@259465 91177308-0d34-0410-b5e6-96231b3b80d8
Alexey Bataev 9 years ago
parent
commit
f3056a38b3
2 changed files with 12 additions and 11 deletions
  1. 6 5
      lib/Sema/SemaOpenMP.cpp
  2. 6 6
      test/OpenMP/nesting_of_regions.cpp

+ 6 - 5
lib/Sema/SemaOpenMP.cpp

@@ -1925,7 +1925,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
   // | simd             | for simd        |                                    |
   // | simd             | for simd        |                                    |
   // | simd             | master          |                                    |
   // | simd             | master          |                                    |
   // | simd             | critical        |                                    |
   // | simd             | critical        |                                    |
-  // | simd             | simd            |                                    |
+  // | simd             | simd            | *                                  |
   // | simd             | sections        |                                    |
   // | simd             | sections        |                                    |
   // | simd             | section         |                                    |
   // | simd             | section         |                                    |
   // | simd             | single          |                                    |
   // | simd             | single          |                                    |
@@ -1959,7 +1959,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
   // | for simd         | for simd        |                                    |
   // | for simd         | for simd        |                                    |
   // | for simd         | master          |                                    |
   // | for simd         | master          |                                    |
   // | for simd         | critical        |                                    |
   // | for simd         | critical        |                                    |
-  // | for simd         | simd            |                                    |
+  // | for simd         | simd            | *                                  |
   // | for simd         | sections        |                                    |
   // | for simd         | sections        |                                    |
   // | for simd         | section         |                                    |
   // | for simd         | section         |                                    |
   // | for simd         | single          |                                    |
   // | for simd         | single          |                                    |
@@ -1993,7 +1993,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
   // | parallel for simd| for simd        |                                    |
   // | parallel for simd| for simd        |                                    |
   // | parallel for simd| master          |                                    |
   // | parallel for simd| master          |                                    |
   // | parallel for simd| critical        |                                    |
   // | parallel for simd| critical        |                                    |
-  // | parallel for simd| simd            |                                    |
+  // | parallel for simd| simd            | *                                  |
   // | parallel for simd| sections        |                                    |
   // | parallel for simd| sections        |                                    |
   // | parallel for simd| section         |                                    |
   // | parallel for simd| section         |                                    |
   // | parallel for simd| single          |                                    |
   // | parallel for simd| single          |                                    |
@@ -2434,7 +2434,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
   // | taskloop simd    | for simd        |                                    |
   // | taskloop simd    | for simd        |                                    |
   // | taskloop simd    | master          |                                    |
   // | taskloop simd    | master          |                                    |
   // | taskloop simd    | critical        |                                    |
   // | taskloop simd    | critical        |                                    |
-  // | taskloop simd    | simd            |                                    |
+  // | taskloop simd    | simd            | *                                  |
   // | taskloop simd    | sections        |                                    |
   // | taskloop simd    | sections        |                                    |
   // | taskloop simd    | section         |                                    |
   // | taskloop simd    | section         |                                    |
   // | taskloop simd    | single          |                                    |
   // | taskloop simd    | single          |                                    |
@@ -2509,7 +2509,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
       ShouldBeInTargetRegion,
       ShouldBeInTargetRegion,
       ShouldBeInTeamsRegion
       ShouldBeInTeamsRegion
     } Recommend = NoRecommend;
     } Recommend = NoRecommend;
-    if (isOpenMPSimdDirective(ParentRegion) && CurrentRegion != OMPD_ordered) {
+    if (isOpenMPSimdDirective(ParentRegion) && CurrentRegion != OMPD_ordered &&
+        CurrentRegion != OMPD_simd) {
       // OpenMP [2.16, Nesting of Regions]
       // OpenMP [2.16, Nesting of Regions]
       // OpenMP constructs may not be nested inside a simd region.
       // OpenMP constructs may not be nested inside a simd region.
       // OpenMP [2.8.1,simd Construct, Restrictions]
       // OpenMP [2.8.1,simd Construct, Restrictions]

+ 6 - 6
test/OpenMP/nesting_of_regions.cpp

@@ -137,7 +137,7 @@ void foo() {
   }
   }
 #pragma omp simd
 #pragma omp simd
   for (int i = 0; i < 10; ++i) {
   for (int i = 0; i < 10; ++i) {
-#pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
+#pragma omp simd
     for (int i = 0; i < 10; ++i)
     for (int i = 0; i < 10; ++i)
       ;
       ;
   }
   }
@@ -468,7 +468,7 @@ void foo() {
   }
   }
 #pragma omp for simd
 #pragma omp for simd
   for (int i = 0; i < 10; ++i) {
   for (int i = 0; i < 10; ++i) {
-#pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
+#pragma omp simd
     for (int i = 0; i < 10; ++i)
     for (int i = 0; i < 10; ++i)
       ;
       ;
   }
   }
@@ -1730,7 +1730,7 @@ void foo() {
   }
   }
 #pragma omp parallel for simd
 #pragma omp parallel for simd
   for (int i = 0; i < 10; ++i) {
   for (int i = 0; i < 10; ++i) {
-#pragma omp simd// expected-error {{OpenMP constructs may not be nested inside a simd region}}
+#pragma omp simd
     for (int i = 0; i < 10; ++i)
     for (int i = 0; i < 10; ++i)
       ;
       ;
   }
   }
@@ -3504,7 +3504,7 @@ void foo() {
   }
   }
 #pragma omp simd
 #pragma omp simd
   for (int i = 0; i < 10; ++i) {
   for (int i = 0; i < 10; ++i) {
-#pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
+#pragma omp simd
     for (int i = 0; i < 10; ++i)
     for (int i = 0; i < 10; ++i)
       ;
       ;
   }
   }
@@ -3818,7 +3818,7 @@ void foo() {
   }
   }
 #pragma omp for simd
 #pragma omp for simd
   for (int i = 0; i < 10; ++i) {
   for (int i = 0; i < 10; ++i) {
-#pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
+#pragma omp simd
     for (int i = 0; i < 10; ++i)
     for (int i = 0; i < 10; ++i)
       ;
       ;
   }
   }
@@ -5053,7 +5053,7 @@ void foo() {
   }
   }
 #pragma omp parallel for simd
 #pragma omp parallel for simd
   for (int i = 0; i < 10; ++i) {
   for (int i = 0; i < 10; ++i) {
-#pragma omp simd// expected-error {{OpenMP constructs may not be nested inside a simd region}}
+#pragma omp simd
     for (int i = 0; i < 10; ++i)
     for (int i = 0; i < 10; ++i)
       ;
       ;
   }
   }