Skip to content

Commit 0b97894

Browse files
committed
[OPENMP50]Add if clause in teams distribute parallel for 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.
1 parent 6e3b606 commit 0b97894

File tree

5 files changed

+50
-18
lines changed

5 files changed

+50
-18
lines changed

clang/lib/CodeGen/CGStmtOpenMP.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4621,7 +4621,8 @@ void CodeGenFunction::EmitOMPTeamsDistributeParallelForSimdDirective(
46214621
CGF, OMPD_distribute, CodeGenDistribute, /*HasCancel=*/false);
46224622
CGF.EmitOMPReductionClauseFinal(S, /*ReductionKind=*/OMPD_teams);
46234623
};
4624-
emitCommonOMPTeamsDirective(*this, S, OMPD_distribute_parallel_for, CodeGen);
4624+
emitCommonOMPTeamsDirective(*this, S, OMPD_distribute_parallel_for_simd,
4625+
CodeGen);
46254626
emitPostUpdateForReductionClause(*this, S,
46264627
[](CodeGenFunction &) { return nullptr; });
46274628
}

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4748,6 +4748,8 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
47484748
Res = ActOnOpenMPTeamsDistributeParallelForSimdDirective(
47494749
ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
47504750
AllowedNameModifiers.push_back(OMPD_parallel);
4751+
if (LangOpts.OpenMP >= 50)
4752+
AllowedNameModifiers.push_back(OMPD_simd);
47514753
break;
47524754
case OMPD_teams_distribute_parallel_for:
47534755
Res = ActOnOpenMPTeamsDistributeParallelForDirective(
@@ -10724,8 +10726,14 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
1072410726
if (NameModifier == OMPD_unknown || NameModifier == OMPD_parallel)
1072510727
CaptureRegion = OMPD_teams;
1072610728
break;
10727-
case OMPD_teams_distribute_parallel_for:
1072810729
case OMPD_teams_distribute_parallel_for_simd:
10730+
if (OpenMPVersion >= 50 &&
10731+
(NameModifier == OMPD_unknown || NameModifier == OMPD_simd)) {
10732+
CaptureRegion = OMPD_parallel;
10733+
break;
10734+
}
10735+
LLVM_FALLTHROUGH;
10736+
case OMPD_teams_distribute_parallel_for:
1072910737
CaptureRegion = OMPD_teams;
1073010738
break;
1073110739
case OMPD_target_update:

clang/test/OpenMP/teams_distribute_parallel_for_simd_ast_print.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | FileCheck %s
1+
// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix CHECK --check-prefix OMP45
22
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3-
// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
3+
// 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
4+
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -DOMP5 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix CHECK --check-prefix OMP50
5+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 -emit-pch -o %t %s
6+
// 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
47

5-
// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | FileCheck %s
8+
// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix CHECK --check-prefix OMP45
69
// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7-
// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
10+
// 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
11+
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix CHECK --check-prefix OMP50
12+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -DOMP5 -x c++ -std=c++11 -emit-pch -o %t %s
13+
// 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
814
// expected-no-diagnostics
915

1016
#ifndef HEADER
@@ -150,13 +156,18 @@ T tmain(T argc) {
150156
// CHECK: for (int i = 0; i < 10; ++i)
151157
// CHECK-NEXT: foo();
152158
#pragma omp target
159+
#ifdef OMP5
160+
#pragma omp teams distribute parallel for simd if(simd:argc)
161+
#else
153162
#pragma omp teams distribute parallel for simd
163+
#endif // OMP5
154164
for (int i = 0; i < 10; ++i)
155165
foo();
156166
// CHECK: #pragma omp target
157-
// CHECK-NEXT: #pragma omp teams distribute parallel for simd
167+
// OMP45-NEXT: #pragma omp teams distribute parallel for simd
168+
// OMP50-NEXT: #pragma omp teams distribute parallel for simd if(simd: argc)
158169
// CHECK-NEXT: for (int i = 0; i < 10; ++i)
159-
// CHECK-NEXT: foo();
170+
// CHECK-NEXT: foo();
160171
#pragma omp target
161172
#pragma omp teams distribute parallel for simd default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)
162173
for (int k = 0; k < 10; ++k)

clang/test/OpenMP/teams_distribute_parallel_for_simd_if_codegen.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
1+
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP45
22
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
3-
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
3+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP45
4+
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -DOMP5 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP50
5+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -DOMP5 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
6+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -DOMP5 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix OMP50
47

58
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
69
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
710
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
11+
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -DOMP5 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
12+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -DOMP5 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
13+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -DOMP5 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
814
// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
915
// expected-no-diagnostics
1016
#ifndef HEADER
@@ -135,7 +141,8 @@ int main() {
135141
// CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_2]](
136142

137143
// CHECK: call void @__kmpc_for_static_init_4(
138-
// CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_4:@.+]] to void
144+
// OMP45: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_4:@.+]] to void
145+
// OMP50: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 3, {{.+}}* [[OMP_OUTLINED_4:@.+]] to void
139146
// CHECK: call void @__kmpc_serialized_parallel(
140147
// CHECK: call void [[OMP_OUTLINED_4:@.+]](
141148
// CHECK: call void @__kmpc_end_serialized_parallel(
@@ -187,6 +194,9 @@ int main() {
187194
// CHECK: call void @__kmpc_for_static_fini(
188195
// CHECK: ret void
189196

190-
// CHECK: !{!"llvm.loop.vectorize.enable", i1 true}
197+
// OMP45-NOT: !{!"llvm.loop.vectorize.enable", i1 false}
198+
// CHECK-DAG: !{!"llvm.loop.vectorize.enable", i1 true}
199+
// OMP50-DAG: !{!"llvm.loop.vectorize.enable", i1 false}
200+
// OMP45-NOT: !{!"llvm.loop.vectorize.enable", i1 false}
191201

192202
#endif

clang/test/OpenMP/teams_distribute_parallel_for_simd_if_messages.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ferror-limit 100 %s -Wuninitialized
1+
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -ferror-limit 100 %s -Wuninitialized
2+
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -ferror-limit 100 %s -Wuninitialized
23

3-
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ferror-limit 100 %s -Wuninitialized
4+
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -ferror-limit 100 %s -Wuninitialized
5+
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 %s -Wuninitialized
46

57
void foo() {
68
}
@@ -68,13 +70,13 @@ int tmain(T argc, S **argv) {
6870
#pragma omp teams distribute parallel for simd if(parallel : argc)
6971
for (i = 0; i < argc; ++i) foo();
7072
#pragma omp target
71-
#pragma omp teams distribute parallel for simd if(parallel : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp teams distribute parallel for simd'}}
73+
#pragma omp teams distribute parallel for simd if(parallel : argc) if (simd:argc) // omp45-error {{directive name modifier 'simd' is not allowed for '#pragma omp teams distribute parallel for simd'}}
7274
for (i = 0; i < argc; ++i) foo();
7375
#pragma omp target
7476
#pragma omp teams distribute parallel for simd if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp teams distribute parallel for simd' cannot contain more than one 'if' clause with 'parallel' name modifier}}
7577
for (i = 0; i < argc; ++i) foo();
7678
#pragma omp target
77-
#pragma omp teams distribute parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
79+
#pragma omp teams distribute parallel for simd if(parallel : argc) if (argc) // omp45-error {{no more 'if' clause is allowed}} omp50-error {{expected 'simd' directive name modifier}} expected-note {{previous clause with directive name modifier specified here}}
7880
for (i = 0; i < argc; ++i) foo();
7981
#pragma omp target
8082
#pragma omp teams distribute parallel for simd if(distribute : argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp teams distribute parallel for simd'}}
@@ -134,13 +136,13 @@ int main(int argc, char **argv) {
134136
#pragma omp teams distribute parallel for simd if(parallel : argc)
135137
for (i = 0; i < argc; ++i) foo();
136138
#pragma omp target
137-
#pragma omp teams distribute parallel for simd if(parallel : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp teams distribute parallel for simd'}}
139+
#pragma omp teams distribute parallel for simd if(parallel : argc) if (simd:argc) // omp45-error {{directive name modifier 'simd' is not allowed for '#pragma omp teams distribute parallel for simd'}}
138140
for (i = 0; i < argc; ++i) foo();
139141
#pragma omp target
140142
#pragma omp teams distribute parallel for simd if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp teams distribute parallel for simd' cannot contain more than one 'if' clause with 'parallel' name modifier}}
141143
for (i = 0; i < argc; ++i) foo();
142144
#pragma omp target
143-
#pragma omp teams distribute parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
145+
#pragma omp teams distribute parallel for simd if(parallel : argc) if (argc) //omp45-error {{no more 'if' clause is allowed}} omp50-error {{expected 'simd' directive name modifier}} expected-note {{previous clause with directive name modifier specified here}}
144146
for (i = 0; i < argc; ++i) foo();
145147
#pragma omp target
146148
#pragma omp teams distribute parallel for simd if(distribute : argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp teams distribute parallel for simd'}}

0 commit comments

Comments
 (0)