From f3056a38b3f1230a629f2cf93b7edb5ba42eb20d Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Tue, 2 Feb 2016 04:59:52 +0000 Subject: [PATCH] [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 --- lib/Sema/SemaOpenMP.cpp | 11 ++++++----- test/OpenMP/nesting_of_regions.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 1300de10b2..f61d959e89 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -1925,7 +1925,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | simd | for simd | | // | simd | master | | // | simd | critical | | - // | simd | simd | | + // | simd | simd | * | // | simd | sections | | // | simd | section | | // | simd | single | | @@ -1959,7 +1959,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | for simd | for simd | | // | for simd | master | | // | for simd | critical | | - // | for simd | simd | | + // | for simd | simd | * | // | for simd | sections | | // | for simd | section | | // | for simd | single | | @@ -1993,7 +1993,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | parallel for simd| for simd | | // | parallel for simd| master | | // | parallel for simd| critical | | - // | parallel for simd| simd | | + // | parallel for simd| simd | * | // | parallel for simd| sections | | // | parallel for simd| section | | // | parallel for simd| single | | @@ -2434,7 +2434,7 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, // | taskloop simd | for simd | | // | taskloop simd | master | | // | taskloop simd | critical | | - // | taskloop simd | simd | | + // | taskloop simd | simd | * | // | taskloop simd | sections | | // | taskloop simd | section | | // | taskloop simd | single | | @@ -2509,7 +2509,8 @@ static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, ShouldBeInTargetRegion, ShouldBeInTeamsRegion } Recommend = NoRecommend; - if (isOpenMPSimdDirective(ParentRegion) && CurrentRegion != OMPD_ordered) { + if (isOpenMPSimdDirective(ParentRegion) && CurrentRegion != OMPD_ordered && + CurrentRegion != OMPD_simd) { // OpenMP [2.16, Nesting of Regions] // OpenMP constructs may not be nested inside a simd region. // OpenMP [2.8.1,simd Construct, Restrictions] diff --git a/test/OpenMP/nesting_of_regions.cpp b/test/OpenMP/nesting_of_regions.cpp index 4fa6cac01a..4cd0b81af6 100644 --- a/test/OpenMP/nesting_of_regions.cpp +++ b/test/OpenMP/nesting_of_regions.cpp @@ -137,7 +137,7 @@ void foo() { } #pragma omp simd 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) ; } @@ -468,7 +468,7 @@ void foo() { } #pragma omp for simd 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) ; } @@ -1730,7 +1730,7 @@ void foo() { } #pragma omp parallel for simd 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) ; } @@ -3504,7 +3504,7 @@ void foo() { } #pragma omp simd 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) ; } @@ -3818,7 +3818,7 @@ void foo() { } #pragma omp for simd 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) ; } @@ -5053,7 +5053,7 @@ void foo() { } #pragma omp parallel for simd 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) ; } -- 2.50.1