summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/OpenMPKinds.cpp
diff options
context:
space:
mode:
authorArpith Chacko Jacob <acjacob@us.ibm.com>2017-01-18 15:14:52 +0000
committerArpith Chacko Jacob <acjacob@us.ibm.com>2017-01-18 15:14:52 +0000
commit68019578a3f9e708b70300ef1746d6586188fcc3 (patch)
treeb6b355df945a7d98cdee64073883d8ab3b6454e6 /clang/lib/Basic/OpenMPKinds.cpp
parent771db6f895e43d2ba01ab157506ffa0e07bb1666 (diff)
downloadbcm5719-llvm-68019578a3f9e708b70300ef1746d6586188fcc3.tar.gz
bcm5719-llvm-68019578a3f9e708b70300ef1746d6586188fcc3.zip
[OpenMP] Codegen support for 'target parallel' on the host.
This patch adds support for codegen of 'target parallel' on the host. It is also the first combined directive that requires two or more captured statements. Support for this functionality is included in the patch. A combined directive such as 'target parallel' has two captured statements, one for the 'target' and the other for the 'parallel' region. Two captured statements are required because each has different implicit parameters (see SemaOpenMP.cpp). For example, the 'parallel' has 'global_tid' and 'bound_tid' while the 'target' does not. The patch adds support for handling multiple captured statements based on the combined directive. When codegen'ing the 'target parallel' directive, the 'target' outlined function is created using the outer captured statement and the 'parallel' outlined function is created using the inner captured statement. Reviewers: ABataev Differential Revision: https://reviews.llvm.org/D28753 llvm-svn: 292374
Diffstat (limited to 'clang/lib/Basic/OpenMPKinds.cpp')
-rw-r--r--clang/lib/Basic/OpenMPKinds.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp
index 905c3693d37..02055010e7e 100644
--- a/clang/lib/Basic/OpenMPKinds.cpp
+++ b/clang/lib/Basic/OpenMPKinds.cpp
@@ -863,3 +863,101 @@ bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) {
Kind == OMPD_target_teams_distribute_parallel_for_simd ||
Kind == OMPD_target_teams_distribute_simd;
}
+
+ArrayRef<OpenMPDirectiveKind>
+clang::getOpenMPCaptureRegions(OpenMPDirectiveKind DKind) {
+ assert(DKind <= OMPD_unknown);
+ switch (DKind) {
+ case OMPD_parallel:
+ case OMPD_parallel_for:
+ case OMPD_parallel_for_simd:
+ case OMPD_parallel_sections:
+ return {OMPD_parallel};
+ case OMPD_teams:
+ return {OMPD_teams};
+ case OMPD_target_teams:
+ return {OMPD_target_teams};
+ case OMPD_simd:
+ return {OMPD_simd};
+ case OMPD_for:
+ return {OMPD_for};
+ case OMPD_for_simd:
+ return {OMPD_for_simd};
+ case OMPD_sections:
+ return {OMPD_sections};
+ case OMPD_section:
+ return {OMPD_section};
+ case OMPD_single:
+ return {OMPD_single};
+ case OMPD_master:
+ return {OMPD_master};
+ case OMPD_critical:
+ return {OMPD_critical};
+ case OMPD_taskgroup:
+ return {OMPD_taskgroup};
+ case OMPD_distribute:
+ return {OMPD_distribute};
+ case OMPD_ordered:
+ return {OMPD_ordered};
+ case OMPD_atomic:
+ return {OMPD_atomic};
+ case OMPD_target_data:
+ return {OMPD_target_data};
+ case OMPD_target:
+ return {OMPD_target};
+ case OMPD_target_parallel_for:
+ return {OMPD_target_parallel_for};
+ case OMPD_target_parallel_for_simd:
+ return {OMPD_target_parallel_for_simd};
+ case OMPD_target_simd:
+ return {OMPD_target_simd};
+ case OMPD_task:
+ return {OMPD_task};
+ case OMPD_taskloop:
+ return {OMPD_taskloop};
+ case OMPD_taskloop_simd:
+ return {OMPD_taskloop_simd};
+ case OMPD_distribute_parallel_for_simd:
+ return {OMPD_distribute_parallel_for_simd};
+ case OMPD_distribute_simd:
+ return {OMPD_distribute_simd};
+ case OMPD_distribute_parallel_for:
+ return {OMPD_distribute_parallel_for};
+ case OMPD_teams_distribute:
+ return {OMPD_teams_distribute};
+ case OMPD_teams_distribute_simd:
+ return {OMPD_teams_distribute_simd};
+ case OMPD_teams_distribute_parallel_for_simd:
+ return {OMPD_teams_distribute_parallel_for_simd};
+ case OMPD_teams_distribute_parallel_for:
+ return {OMPD_teams_distribute_parallel_for};
+ case OMPD_target_teams_distribute:
+ return {OMPD_target_teams_distribute};
+ case OMPD_target_teams_distribute_parallel_for:
+ return {OMPD_target_teams_distribute_parallel_for};
+ case OMPD_target_teams_distribute_parallel_for_simd:
+ return {OMPD_target_teams_distribute_parallel_for_simd};
+ case OMPD_target_teams_distribute_simd:
+ return {OMPD_target_teams_distribute_simd};
+ case OMPD_target_parallel:
+ return {OMPD_target, OMPD_parallel};
+ case OMPD_threadprivate:
+ case OMPD_taskyield:
+ case OMPD_barrier:
+ case OMPD_taskwait:
+ case OMPD_cancellation_point:
+ case OMPD_cancel:
+ case OMPD_flush:
+ case OMPD_target_enter_data:
+ case OMPD_target_exit_data:
+ case OMPD_declare_reduction:
+ case OMPD_declare_simd:
+ case OMPD_declare_target:
+ case OMPD_end_declare_target:
+ case OMPD_target_update:
+ llvm_unreachable("OpenMP Directive is not allowed");
+ case OMPD_unknown:
+ llvm_unreachable("Unknown OpenMP directive");
+ }
+ return {OMPD_unknown};
+}
OpenPOWER on IntegriCloud