Author: Alexey Bataev
Date: 2019-12-11T12:30:18-05:00
New Revision: 7b774b7cd48562e3af3405b1e5c54ea58bd142a6

URL: 
https://github.com/llvm/llvm-project/commit/7b774b7cd48562e3af3405b1e5c54ea58bd142a6
DIFF: 
https://github.com/llvm/llvm-project/commit/7b774b7cd48562e3af3405b1e5c54ea58bd142a6.diff

LOG: [OPENMP50]Add if clause in teams distribute simd directive.

According to OpenMP 5.0, if clause can be used in for simd directive. If
condition in the if clause if false, the non-vectorized version of the
loop must be executed.

Added: 
    clang/test/OpenMP/teams_distribute_simd_if_messages.cpp

Modified: 
    clang/include/clang/Basic/OpenMPKinds.def
    clang/lib/Basic/OpenMPKinds.cpp
    clang/lib/Sema/SemaOpenMP.cpp
    clang/test/OpenMP/teams_distribute_simd_ast_print.cpp
    clang/test/OpenMP/teams_distribute_simd_codegen.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/OpenMPKinds.def 
b/clang/include/clang/Basic/OpenMPKinds.def
index 7333d94e2cfc..19ad34888b68 100644
--- a/clang/include/clang/Basic/OpenMPKinds.def
+++ b/clang/include/clang/Basic/OpenMPKinds.def
@@ -878,6 +878,7 @@ OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(aligned)
 OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(safelen)
 OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(simdlen)
 OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(allocate)
+OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(if)
 
 // Clauses allowed for OpenMP directive 'teams distribute parallel for simd'
 OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(firstprivate)

diff  --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp
index 51fe587de999..6dadfce1eb83 100644
--- a/clang/lib/Basic/OpenMPKinds.cpp
+++ b/clang/lib/Basic/OpenMPKinds.cpp
@@ -808,6 +808,8 @@ bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind 
DKind,
     }
     break;
   case OMPD_teams_distribute_simd:
+    if (OpenMPVersion < 50 && CKind == OMPC_if)
+      return false;
     switch (CKind) {
 #define OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(Name)                              
\
   case OMPC_##Name:                                                            
\

diff  --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 3eaad2fd1536..4f4c4d2e887d 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -4741,6 +4741,8 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
   case OMPD_teams_distribute_simd:
     Res = ActOnOpenMPTeamsDistributeSimdDirective(
         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
+    if (LangOpts.OpenMP >= 50)
+      AllowedNameModifiers.push_back(OMPD_simd);
     break;
   case OMPD_teams_distribute_parallel_for_simd:
     Res = ActOnOpenMPTeamsDistributeParallelForSimdDirective(
@@ -10768,6 +10770,11 @@ static OpenMPDirectiveKind 
getOpenMPCaptureRegionForClause(
           (NameModifier == OMPD_unknown || NameModifier == OMPD_simd))
         CaptureRegion = OMPD_target;
       break;
+    case OMPD_teams_distribute_simd:
+      if (OpenMPVersion >= 50 &&
+          (NameModifier == OMPD_unknown || NameModifier == OMPD_simd))
+        CaptureRegion = OMPD_teams;
+      break;
     case OMPD_cancel:
     case OMPD_parallel:
     case OMPD_parallel_master:
@@ -10812,7 +10819,6 @@ static OpenMPDirectiveKind 
getOpenMPCaptureRegionForClause(
     case OMPD_ordered:
     case OMPD_atomic:
     case OMPD_teams_distribute:
-    case OMPD_teams_distribute_simd:
     case OMPD_requires:
       llvm_unreachable("Unexpected OpenMP directive with if-clause");
     case OMPD_unknown:

diff  --git a/clang/test/OpenMP/teams_distribute_simd_ast_print.cpp 
b/clang/test/OpenMP/teams_distribute_simd_ast_print.cpp
index 27e8c5a11a36..e1ed535e75bf 100644
--- a/clang/test/OpenMP/teams_distribute_simd_ast_print.cpp
+++ b/clang/test/OpenMP/teams_distribute_simd_ast_print.cpp
@@ -1,10 +1,16 @@
-// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | 
FileCheck %s
+// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | 
FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
-// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify 
%s -ast-print -Wno-openmp-mapping | FileCheck %s
+// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify 
%s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK 
--check-prefix=OMP45
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -DOMP5 -ast-print %s 
-Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 
-emit-pch -o %t %s
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -DOMP5 -std=c++11 -include-pch 
%t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s 
--check-prefix=CHECK --check-prefix=OMP50
 
-// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | 
FileCheck %s
+// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | 
FileCheck %s --check-prefix=CHECK --check-prefix=OMP45
 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
-// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only 
-verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
+// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only 
-verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK 
--check-prefix=OMP45
+// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -ast-print 
%s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
+// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 
-emit-pch -o %t %s
+// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -DOMP5 -std=c++11 
-include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | 
FileCheck %s --check-prefix=CHECK --check-prefix=OMP50
 // expected-no-diagnostics
 
 #ifndef HEADER
@@ -53,7 +59,11 @@ class S7 : public T {
     const int slen1 = 8;
     const int slen2 = 8;
 #pragma omp target
+#ifdef OMP5
+#pragma omp teams distribute simd simdlen(slen1) safelen(slen2) 
aligned(arr:alen) if(arr[0])
+#else
 #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) 
aligned(arr:alen)
+#endif // OMP5
     for (int k = 0; k < a.a; ++k)
       ++a.a;
   }
@@ -65,7 +75,8 @@ class S7 : public T {
 // CHECK: #pragma omp target
 // CHECK-NEXT: #pragma omp teams distribute simd default(none) private(b) 
firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) 
thread_limit(d)
 // CHECK: #pragma omp target
-// CHECK-NEXT: #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) 
aligned(arr: alen)
+// OMP45-NEXT: #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) 
aligned(arr: alen)
+// OMP50-NEXT: #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) 
aligned(arr: alen) if(arr[0])
 // CHECK: #pragma omp target
 // CHECK-NEXT: #pragma omp teams distribute simd private(this->a) 
private(this->a) private(this->S::a)
 
@@ -150,7 +161,7 @@ T tmain(T argc) {
 // CHECK: #pragma omp target
 // CHECK-NEXT: #pragma omp teams distribute simd
 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
-// CHECK-NEXT: foo();  
+// CHECK-NEXT: foo();
 #pragma omp target
 #pragma omp teams distribute simd default(none), private(b) firstprivate(argc) 
shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)
     for (int k = 0; k < 10; ++k)
@@ -231,11 +242,16 @@ int main (int argc, char **argv) {
 // CHECK-NEXT: for (int k = 0; k < 10; ++k)
 // CHECK-NEXT: e += d + argc;
 #pragma omp target
+#ifdef OMP5
+#pragma omp teams distribute simd safelen(clen-1) aligned(arr:N+6) if(simd:b)
+#else
 #pragma omp teams distribute simd safelen(clen-1) aligned(arr:N+6)
+#endif
   for (int k = 0; k < 10; ++k)
     e += d + argc + arr[k];
 // CHECK: #pragma omp target
-// CHECK-NEXT: #pragma omp teams distribute simd safelen(clen - 1) 
aligned(arr: N + 6)
+// OMP45-NEXT: #pragma omp teams distribute simd safelen(clen - 1) 
aligned(arr: N + 6)
+// OMP50-NEXT: #pragma omp teams distribute simd safelen(clen - 1) 
aligned(arr: N + 6) if(simd: b)
 // CHECK-NEXT: for (int k = 0; k < 10; ++k)
 // CHECK-NEXT: e += d + argc + arr[k];
   return (0);

diff  --git a/clang/test/OpenMP/teams_distribute_simd_codegen.cpp 
b/clang/test/OpenMP/teams_distribute_simd_codegen.cpp
index 0f68328e67a6..b9ee8cc728fc 100644
--- a/clang/test/OpenMP/teams_distribute_simd_codegen.cpp
+++ b/clang/test/OpenMP/teams_distribute_simd_codegen.cpp
@@ -140,12 +140,18 @@ int teams_local_arg(void) {
 #endif // CK2
 
 // Test host codegen.
-// RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64
+// RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64 
--check-prefix OMP3_45
 // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-pch -o %t %s
-// RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify 
%s -emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64
-// RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK3 --check-prefix CK3-32
+// RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify 
%s -emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64 
--check-prefix OMP3_45
+// RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK3 --check-prefix CK3-32 --check-prefix OMP3_45
 // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple 
i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
-// RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32
+// RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32 
--check-prefix OMP3_45
+// RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-version=50 -DOMP5 -x c++ 
-triple powerpc64le-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK3 --check-prefix CK3-64 --check-prefix OMP3_50
+// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 
-triple powerpc64le-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify 
%s -emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64 
-check-prefix OMP3_50
+// RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-version=50 -DOMP5 -x c++ 
-triple i386-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK3 --check-prefix CK3-32 -check-prefix OMP3_50
+// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 
-triple i386-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -triple 
i386-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32 
-check-prefix OMP3_50
 
 // RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY2 %s
 // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c++ -std=c++11 -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-pch -o %t %s
@@ -153,6 +159,12 @@ int teams_local_arg(void) {
 // RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -x c++ -triple 
i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | 
FileCheck --check-prefix SIMD-ONLY2 %s
 // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c++ -std=c++11 -triple 
i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
 // RUN: %clang_cc1 -DCK3 -fopenmp-simd -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY2 %s
+// RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -x 
c++ -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck 
--check-prefix SIMD-ONLY2 %s
+// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-std=c++11 -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck 
--check-prefix SIMD-ONLY2 %s
+// RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -x 
c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm 
%s -o - | FileCheck --check-prefix SIMD-ONLY2 %s
+// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu 
-emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 
-include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix 
SIMD-ONLY2 %s
 // SIMD-ONLY2-NOT: {{__kmpc|__tgt}}
 #ifdef CK3
 
@@ -168,14 +180,19 @@ struct SS{
   // CK3: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 2, i8** 
%{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* %{{.+}}, i64* {{.+}}@{{[^,]+}}, i32 0, 
i32 0), i32 0, i32 1)
   // CK3: call void @[[OFFL1:.+]]([[SSI]]* %{{.+}})
     #pragma omp target
+#ifdef OMP5
+    #pragma omp teams distribute simd if(b)
+#else
     #pragma omp teams distribute simd
+#endif // OMP5
     for(int i = 0; i < X; i++) {
       a[i] = (T)0;
     }
 
       // outlined target region
   // CK3: define internal void @[[OFFL1]]([[SSI]]* {{.+}})
-  // CK3: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}} 
@[[OUTL1:.+]] to {{.+}}, {{.+}}, {{.+}})
+  // OMP3_45: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}} 
@[[OUTL1:.+]] to {{.+}}, {{.+}}, {{.+}})
+  // OMP3_50: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 2, {{.+}} 
@[[OUTL1:.+]] to {{.+}}, {{.+}}, {{.+}}, {{.+}})
   // CK3: ret void
 
   // CK3: define internal void @[[OUTL1]]({{.+}})
@@ -192,16 +209,24 @@ int teams_template_struct(void) {
   return V.foo();
 
 }
-// CK3: !{!"llvm.loop.vectorize.enable", i1 true}
+// CK3-DAG: !{!"llvm.loop.vectorize.enable", i1 true}
+// OMP3_45-NOT: !{!"llvm.loop.vectorize.enable", i1 false}
+// OMP3_50-DAG: !{!"llvm.loop.vectorize.enable", i1 false}
 #endif // CK3
 
 // Test host codegen.
-// RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-llvm %s -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64
+// RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-llvm %s -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64 
--check-prefix OMP4_45
 // RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -std=c++11 -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-pch -o %t %s
-// RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify 
%s -emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64
-// RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK4 --check-prefix CK4-32
+// RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify 
%s -emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64 
--check-prefix OMP4_45
+// RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK4 --check-prefix CK4-32 --check-prefix OMP4_45
 // RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -std=c++11 -triple 
i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
-// RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-32
+// RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-32 
--check-prefix OMP4_45
+// RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-version=50 -DOMP5 -x c++ 
-triple powerpc64le-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK4 --check-prefix CK4-64 --check-prefix OMP4_50
+// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 
-triple powerpc64le-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify 
%s -emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64 
--check-prefix OMP4_50
+// RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-version=50 -DOMP5 -x c++ 
-triple i386-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s 
--check-prefix CK4 --check-prefix CK4-32 --check-prefix OMP4_50
+// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 
-triple i386-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -triple 
i386-unknown-unknown -fopenmp -fopenmp-version=50 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-32 
--check-prefix OMP4_50
 
 // RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -x c++ -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY3 %s
 // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c++ -std=c++11 -triple 
powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-emit-pch -o %t %s
@@ -209,6 +234,12 @@ int teams_template_struct(void) {
 // RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -x c++ -triple 
i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | 
FileCheck --check-prefix SIMD-ONLY3 %s
 // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c++ -std=c++11 -triple 
i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
 // RUN: %clang_cc1 -DCK4 -fopenmp-simd -x c++ -triple i386-unknown-unknown 
-fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s 
-emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY3 %s
+// RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -x 
c++ -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck 
--check-prefix SIMD-ONLY3 %s
+// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-std=c++11 -triple powerpc64le-unknown-unknown 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck 
--check-prefix SIMD-ONLY3 %s
+// RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -x 
c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm 
%s -o - | FileCheck --check-prefix SIMD-ONLY3 %s
+// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu 
-emit-pch -o %t %s
+// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ 
-triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 
-include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix 
SIMD-ONLY3 %s
 // SIMD-ONLY3-NOT: {{__kmpc|__tgt}}
 
 #ifdef CK4
@@ -230,7 +261,11 @@ int main (int argc, char **argv) {
   int n = 100;
   int a[n];
 #pragma omp target
+#ifdef OMP5
+#pragma omp teams distribute simd if(simd:argc)
+#else
 #pragma omp teams distribute simd
+#endif // OMP5
   for(int i = 0; i < n; i++) {
     a[i] = 0;
   }
@@ -238,13 +273,15 @@ int main (int argc, char **argv) {
 }
 
 // CK4:  define {{.*}}i32 @{{[^,]+}}(i{{.+}}{{.+}} %[[ARGC:.+]], {{.+}})
-// CK4:   call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 3, i8** 
%{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}, i64* {{.+}}@{{[^,]+}}, i32 0, 
i32 0), i32 0, i32 1)
+// OMP4_45:   call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 3, i8** 
%{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}, i64* {{.+}}@{{[^,]+}}, i32 0, 
i32 0), i32 0, i32 1)
+// OMP4_50:   call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 4, i8** 
%{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}, i64* {{.+}}@{{[^,]+}}, i32 0, 
i32 0), i32 0, i32 1)
 // CK4: call void @[[OFFL1:.+]]({{.+}})
 // CK4: {{%.+}} = call{{.*}} i32 @[[TMAIN:.+]]({{.+}})
 // CK4:  ret
 
 // CK4:  define {{.*}}void @[[OFFL1]]({{.+}})
-// CK4: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 3, {{.+}} 
@[[OUTL1:.+]] to {{.+}}, {{.+}}, {{.+}})
+// OMP4_45: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 3, {{.+}} 
@[[OUTL1:.+]] to {{.+}}, {{.+}}, {{.+}})
+// OMP4_50: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 4, {{.+}} 
@[[OUTL1:.+]] to {{.+}}, {{.+}}, {{.+}})
 // CK4: ret void
 
 // CK4: define internal void @[[OUTL1]]({{.+}})
@@ -278,7 +315,9 @@ int main (int argc, char **argv) {
 // CK4: call void @__kmpc_for_static_fini(
 // CK4: ret void
 
-// CK4: !{!"llvm.loop.vectorize.enable", i1 true}
+// CK4-DAG: !{!"llvm.loop.vectorize.enable", i1 true}
+// OMP4_45-NOT: !{!"llvm.loop.vectorize.enable", i1 false}
+// OMP5_50-DAG: !{!"llvm.loop.vectorize.enable", i1 false}
 #endif // CK4
 #endif
 

diff  --git a/clang/test/OpenMP/teams_distribute_simd_if_messages.cpp 
b/clang/test/OpenMP/teams_distribute_simd_if_messages.cpp
new file mode 100644
index 000000000000..a35a8dfa1e50
--- /dev/null
+++ b/clang/test/OpenMP/teams_distribute_simd_if_messages.cpp
@@ -0,0 +1,101 @@
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 %s -Wuninitialized
+
+// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 %s -Wuninitialized
+
+void foo() {
+}
+
+bool foobool(int argc) {
+  return argc;
+}
+
+void xxx(int argc) {
+  int cond; // expected-note {{initialize the variable 'cond' to silence this 
warning}}
+#pragma omp teams distribute simd if(cond) // expected-warning {{variable 
'cond' is uninitialized when used here}}
+  for (int i = 0; i < 10; ++i)
+    ;
+}
+
+struct S1; // expected-note {{declared here}}
+
+template <class T, class S> // expected-note {{declared here}}
+int tmain(T argc, S **argv) {
+  T z;
+  int i;
+  #pragma omp teams distribute simd if // expected-error {{expected '(' after 
'if'}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if ( // expected-error {{expected 
expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if () // expected-error {{expected 
expression}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc // expected-error {{expected 
')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc)) // expected-warning {{extra 
tokens at the end of '#pragma omp teams distribute simd' are ignored}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc > 0 ? argv[1] : argv[2])
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (foobool(argc)), if (true) // 
expected-error {{directive '#pragma omp teams distribute simd' cannot contain 
more than one 'if' clause}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (S) // expected-error {{'S' does not 
refer to a value}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argv[1]=2) // expected-error 
{{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc argc) // expected-error 
{{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(argc + z)
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : // expected-error {{expected 
expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc // expected-error 
{{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc)
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(target : argc) // expected-error 
{{directive name modifier 'target' is not allowed for '#pragma omp teams 
distribute simd'}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc) if (simd :argc) // 
expected-error {{directive '#pragma omp teams distribute simd' cannot contain 
more than one 'if' clause with 'simd' name modifier}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc) if (argc) // expected-note 
{{previous clause with directive name modifier specified here}} expected-error 
{{no more 'if' clause is allowed}}
+  for (i = 0; i < argc; ++i) foo();
+
+  return 0;
+}
+
+int main(int argc, char **argv) {
+  int i, z;
+  #pragma omp teams distribute simd if // expected-error {{expected '(' after 
'if'}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if ( // expected-error {{expected 
expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if () // expected-error {{expected 
expression}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc // expected-error {{expected 
')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc)) // expected-warning {{extra 
tokens at the end of '#pragma omp teams distribute simd' are ignored}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc > 0 ? argv[1] : argv[2])
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (foobool(argc)), if (true) // 
expected-error {{directive '#pragma omp teams distribute simd' cannot contain 
more than one 'if' clause}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (S1) // expected-error {{'S1' does not 
refer to a value}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argv[1]=2) // expected-error 
{{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (argc argc) // expected-error 
{{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if (1 0) // expected-error {{expected 
')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(if(tmain(argc, argv) // expected-error 
{{expected expression}} expected-error {{expected ')'}} expected-note {{to 
match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : // expected-error {{expected 
expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc // expected-error 
{{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc + z) if (for:argc) // 
expected-error {{directive name modifier 'for' is not allowed for '#pragma omp 
teams distribute simd'}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc) if (simd :argc) // 
expected-error {{directive '#pragma omp teams distribute simd' cannot contain 
more than one 'if' clause with 'simd' name modifier}}
+  for (i = 0; i < argc; ++i) foo();
+  #pragma omp teams distribute simd if(simd : argc) if (argc) // expected-note 
{{previous clause with directive name modifier specified here}} expected-error 
{{no more 'if' clause is allowed}}
+  for (i = 0; i < argc; ++i) foo();
+
+  return tmain(argc, argv);
+}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to