]> granicus.if.org Git - clang/commitdiff
[OpenMP] Add a new version of the SPMD deinit kernel function
authorGheorghe-Teodor Bercea <gheorghe-teod.bercea@ibm.com>
Thu, 29 Nov 2018 20:53:49 +0000 (20:53 +0000)
committerGheorghe-Teodor Bercea <gheorghe-teod.bercea@ibm.com>
Thu, 29 Nov 2018 20:53:49 +0000 (20:53 +0000)
Summary: This patch adds a new runtime for the SPMD deinit kernel function which replaces the previous function. The new function takes as argument the flag which signals whether the runtime is required or not. This enables the compiler to optimize out the part of the deinit function which are not needed.

Reviewers: ABataev, caomhin

Reviewed By: ABataev

Subscribers: jholewinski, guansong, cfe-commits

Differential Revision: https://reviews.llvm.org/D54970

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@347915 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
test/OpenMP/nvptx_target_parallel_codegen.cpp
test/OpenMP/nvptx_target_parallel_proc_bind_codegen.cpp
test/OpenMP/nvptx_target_parallel_reduction_codegen.cpp
test/OpenMP/nvptx_target_teams_codegen.cpp
test/OpenMP/nvptx_target_teams_distribute_parallel_for_codegen.cpp
test/OpenMP/nvptx_target_teams_distribute_parallel_for_generic_mode_codegen.cpp
test/OpenMP/nvptx_target_teams_distribute_parallel_for_simd_codegen.cpp
test/OpenMP/nvptx_teams_reduction_codegen.cpp

index def3ba7c41f5d1daad2c1d242a4f2204edf82e1d..d4b599eeff40d7d72ff2b4528620a344102ada52 100644 (file)
@@ -33,8 +33,8 @@ enum OpenMPRTLFunctionNVPTX {
   /// Call to void __kmpc_spmd_kernel_init(kmp_int32 thread_limit,
   /// int16_t RequiresOMPRuntime, int16_t RequiresDataSharing);
   OMPRTL_NVPTX__kmpc_spmd_kernel_init,
-  /// Call to void __kmpc_spmd_kernel_deinit();
-  OMPRTL_NVPTX__kmpc_spmd_kernel_deinit,
+  /// Call to void __kmpc_spmd_kernel_deinit_v2(int16_t RequiresOMPRuntime);
+  OMPRTL_NVPTX__kmpc_spmd_kernel_deinit_v2,
   /// Call to void __kmpc_kernel_prepare_parallel(void
   /// *outlined_function, int16_t
   /// IsOMPRuntimeInitialized);
@@ -1413,8 +1413,11 @@ void CGOpenMPRuntimeNVPTX::emitSPMDEntryFooter(CodeGenFunction &CGF,
 
   CGF.EmitBlock(OMPDeInitBB);
   // DeInitialize the OMP state in the runtime; called by all active threads.
+  llvm::Value *Args[] = {/*RequiresOMPRuntime=*/
+                         CGF.Builder.getInt16(RequiresFullRuntime ? 1 : 0)};
   CGF.EmitRuntimeCall(
-      createNVPTXRuntimeFunction(OMPRTL_NVPTX__kmpc_spmd_kernel_deinit), None);
+      createNVPTXRuntimeFunction(
+          OMPRTL_NVPTX__kmpc_spmd_kernel_deinit_v2), Args);
   CGF.EmitBranch(EST.ExitBB);
 
   CGF.EmitBlock(EST.ExitBB);
@@ -1597,11 +1600,12 @@ CGOpenMPRuntimeNVPTX::createNVPTXRuntimeFunction(unsigned Function) {
     RTLFn = CGM.CreateRuntimeFunction(FnTy, "__kmpc_spmd_kernel_init");
     break;
   }
-  case OMPRTL_NVPTX__kmpc_spmd_kernel_deinit: {
-    // Build void __kmpc_spmd_kernel_deinit();
+  case OMPRTL_NVPTX__kmpc_spmd_kernel_deinit_v2: {
+    // Build void __kmpc_spmd_kernel_deinit_v2(int16_t RequiresOMPRuntime);
+    llvm::Type *TypeParams[] = {CGM.Int16Ty};
     auto *FnTy =
-        llvm::FunctionType::get(CGM.VoidTy, llvm::None, /*isVarArg*/ false);
-    RTLFn = CGM.CreateRuntimeFunction(FnTy, "__kmpc_spmd_kernel_deinit");
+        llvm::FunctionType::get(CGM.VoidTy, TypeParams, /*isVarArg*/ false);
+    RTLFn = CGM.CreateRuntimeFunction(FnTy, "__kmpc_spmd_kernel_deinit_v2");
     break;
   }
   case OMPRTL_NVPTX__kmpc_kernel_prepare_parallel: {
index bbde7bcff9309a3c544920135b96ff1513413649..7964d768d799cb8c72cd14062e6a73e59372f439 100644 (file)
@@ -68,7 +68,7 @@ int bar(int n){
   // CHECK: br label {{%?}}[[DONE:.+]]
   //
   // CHECK: [[DONE]]
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   // CHECK: br label {{%?}}[[EXIT:.+]]
   //
   // CHECK: [[EXIT]]
@@ -111,7 +111,7 @@ int bar(int n){
   // CHECK: br label {{%?}}[[DONE:.+]]
   //
   // CHECK: [[DONE]]
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   // CHECK: br label {{%?}}[[EXIT:.+]]
   //
   // CHECK: [[EXIT]]
index 905487fed711d4ef0ffd91a0ad504a0f11d0e462..4b32f9d87bcd020ce3f2aaea5b37dcdaa36f0d9d 100644 (file)
@@ -57,7 +57,7 @@ int bar(int n){
   // CHECK: br label {{%?}}[[DONE:.+]]
   //
   // CHECK: [[DONE]]
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   // CHECK: br label {{%?}}[[EXIT:.+]]
   //
   // CHECK: [[EXIT]]
@@ -79,7 +79,7 @@ int bar(int n){
   // CHECK: br label {{%?}}[[DONE:.+]]
   //
   // CHECK: [[DONE]]
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   // CHECK: br label {{%?}}[[EXIT:.+]]
   //
   // CHECK: [[EXIT]]
@@ -100,7 +100,7 @@ int bar(int n){
   // CHECK: br label {{%?}}[[DONE:.+]]
   //
   // CHECK: [[DONE]]
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   // CHECK: br label {{%?}}[[EXIT:.+]]
   //
   // CHECK: [[EXIT]]
index 1687c8ea761bf5a4ed5a96b66c15b9d84fca1cc7..965ff9e4fbbf88a62baff51ff5e07aa2a23c2e29 100644 (file)
@@ -60,7 +60,7 @@ int bar(int n){
   //
   // CHECK: [[EXECUTE]]
   // CHECK: {{call|invoke}} void [[PFN:@.+]](i32*
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   //
   //
   // define internal void [[PFN]](
@@ -254,7 +254,7 @@ int bar(int n){
   //
   // CHECK: [[EXECUTE]]
   // CHECK: {{call|invoke}} void [[PFN1:@.+]](i32*
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   //
   //
   // define internal void [[PFN1]](
@@ -527,7 +527,7 @@ int bar(int n){
   //
   // CHECK: [[EXECUTE]]
   // CHECK: {{call|invoke}} void [[PFN2:@.+]](i32*
-  // CHECK: call void @__kmpc_spmd_kernel_deinit()
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
   //
   //
   // define internal void [[PFN2]](
index c62d2545249bac1303e85844e6378604d769283d..33c8b065d3cf2c95d7fbfe6f6d173c3fd742f9c6 100644 (file)
@@ -234,7 +234,7 @@ int bar(int n){
 // CHECK: call void [[L0:@.+]](i32* %{{.+}}, i32* %{{.+}}, i16* %{{.*}})
 // CHECK-NOT: call void @__kmpc_end_serialized_parallel(
 // CHECK-NOT: call void @__kmpc_data_sharing_pop_stack(
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
 // CHECK: ret
 
 // CHECK: define internal void [[L0]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i16* dereferenceable
index 79315717ae60a7103b44df2edf5f65edd158fc77..0c06a60e441e2f0b247127d1c1a9b49222caddca 100644 (file)
@@ -84,7 +84,7 @@ int bar(int n){
 // CHECK: {{call|invoke}} void [[OUTL1:@.+]](
 // CHECK: call void @__kmpc_for_static_fini(
 // CHECK: call void @__kmpc_restore_team_static_memory(i16 1)
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL1]](
@@ -98,7 +98,7 @@ int bar(int n){
 // CHECK: call void @__kmpc_for_static_init_4({{.+}}, {{.+}}, {{.+}} 91,
 // CHECK: {{call|invoke}} void [[OUTL2:@.+]](
 // CHECK: call void @__kmpc_for_static_fini(
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL2]](
@@ -112,7 +112,7 @@ int bar(int n){
 // CHECK: call void @__kmpc_for_static_init_4({{.+}}, {{.+}}, {{.+}} 91,
 // CHECK: {{call|invoke}} void [[OUTL3:@.+]](
 // CHECK: call void @__kmpc_for_static_fini(
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL3]](
@@ -204,7 +204,7 @@ int bar(int n){
 
 // CHECK: [[DIST_INNER_LOOP_END]]:
 // CHECK: call void @__kmpc_for_static_fini(
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL4]](
index 946447532539333000918806f2fd448a99bc6414..f7ce26296139b36b3cca5c13f75f2840bcea3f13 100644 (file)
@@ -32,7 +32,7 @@ int main(int argc, char **argv) {
 
 // CHECK: call void @__kmpc_for_static_fini(%struct.ident_t* @
 
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 
 // CHECK: define internal void [[PARALLEL]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i{{64|32}} %{{.+}}, i{{64|32}} %{{.+}}, i{{64|32}} [[ARGC:%.+]], i32* dereferenceable{{.*}})
 // CHECK-NOT: call i8* @__kmpc_data_sharing_push_stack(
index 2e9ceb129b47f5d8aeff903c6954525bb3c5bb9a..5a828af687700574d30d0ec9143d993e57fc4eeb 100644 (file)
@@ -79,7 +79,7 @@ int bar(int n){
 // CHECK: {{call|invoke}} void [[OUTL1:@.+]](
 // CHECK: call void @__kmpc_for_static_fini(
 // CHECK: call void @__kmpc_restore_team_static_memory(i16 1)
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL1]](
@@ -93,7 +93,7 @@ int bar(int n){
 // CHECK: call void @__kmpc_for_static_init_4({{.+}}, {{.+}}, {{.+}} 91,
 // CHECK: {{call|invoke}} void [[OUTL2:@.+]](
 // CHECK: call void @__kmpc_for_static_fini(
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL2]](
@@ -107,7 +107,7 @@ int bar(int n){
 // CHECK: call void @__kmpc_for_static_init_4({{.+}}, {{.+}}, {{.+}} 91,
 // CHECK: {{call|invoke}} void [[OUTL3:@.+]](
 // CHECK: call void @__kmpc_for_static_fini(
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL3]](
@@ -123,7 +123,7 @@ int bar(int n){
 // CHECK: call void @__kmpc_for_static_init_4({{.+}}, {{.+}}, {{.+}} 91, {{.+}}, {{.+}}, {{.+}}* [[COMB_UB]],
 // CHECK: {{call|invoke}} void [[OUTL4:@.+]](
 // CHECK: call void @__kmpc_for_static_fini(
-// CHECK: call void @__kmpc_spmd_kernel_deinit()
+// CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 0)
 // CHECK: ret void
 
 // CHECK: define internal void [[OUTL4]](
index d0a31b0238647e118552d0bd0526327cedf98b3a..97a128866a4057b26a857c8a6299312aed7f46a1 100644 (file)
@@ -98,6 +98,7 @@ int bar(int n){
   // CHECK: define {{.*}}void [[T2:@__omp_offloading_.+template.+l43]](
   //
   // CHECK: {{call|invoke}} void [[T2]]_worker()
+
   //
   // CHECK: call void @__kmpc_kernel_init(
   //
@@ -176,7 +177,7 @@ int bar(int n){
   //
   // CHECK: [[EXIT]]
   // call void @__kmpc_restore_team_static_memory(i16 1)
-  // CHECK: call void @__kmpc_spmd_kernel_deinit(
+  // CHECK: call void @__kmpc_spmd_kernel_deinit_v2(i16 1)
 
   // CHECK: define internal void [[OUTLINED]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable{{.+}}, i16* dereferenceable{{.+}})
   //
@@ -286,7 +287,6 @@ int bar(int n){
   // CHECK: [[MAXV:%.+]] = phi i16 [ [[MAX1]], %[[DO_MAX]] ], [ [[MAX2]], %[[MAX_ELSE]] ]
   // CHECK: store i16 [[MAXV]], i16* [[VAR2_LHS]],
   // CHECK: ret void
-
   //
   // Shuffle and reduce function
   // CHECK: define internal void [[PAR_SHUFFLE_REDUCE_FN]](i8*, i16 {{.*}}, i16 {{.*}}, i16 {{.*}})