]> granicus.if.org Git - clang/commitdiff
[OPENMP][NVPTX]Emit shared memory buffer for reduction as 128 bytes
authorAlexey Bataev <a.bataev@hotmail.com>
Tue, 18 Dec 2018 21:01:42 +0000 (21:01 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Tue, 18 Dec 2018 21:01:42 +0000 (21:01 +0000)
buffer.

Seems to me, nvlink has a bug with the proper support of the weakly
linked symbols. It does not allow to define several shared memory buffer
with the different sizes even with the weak linkage. Instead we always
use 128 bytes buffer to prevent nvlink from the error message emission.

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

lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
test/OpenMP/nvptx_data_sharing.cpp
test/OpenMP/nvptx_distribute_parallel_generic_mode_codegen.cpp
test/OpenMP/nvptx_parallel_codegen.cpp
test/OpenMP/nvptx_parallel_for_codegen.cpp
test/OpenMP/nvptx_target_codegen.cpp
test/OpenMP/nvptx_target_teams_distribute_codegen.cpp
test/OpenMP/nvptx_target_teams_distribute_parallel_for_codegen.cpp
test/OpenMP/nvptx_target_teams_distribute_parallel_for_simd_codegen.cpp
test/OpenMP/nvptx_teams_codegen.cpp
test/OpenMP/nvptx_teams_reduction_codegen.cpp

index 59086d219b020675359e7b8c2c153ed98d3f02af..5e2676bf1677bb6fef6f4ea025fe72632780deea 100644 (file)
@@ -4518,6 +4518,22 @@ void CGOpenMPRuntimeNVPTX::clear() {
       Records.UseSharedMemory->setInitializer(
           llvm::ConstantInt::get(CGM.Int16Ty, UseSharedMemory ? 1 : 0));
     }
+    // Allocate SharedMemorySize buffer for the shared memory.
+    // FIXME: nvlink does not handle weak linkage correctly (object with the
+    // different size are reported as erroneous).
+    // Restore this code as sson as nvlink is fixed.
+    if (!SharedStaticRD->field_empty()) {
+      llvm::APInt ArySize(/*numBits=*/64, SharedMemorySize);
+      QualType SubTy = C.getConstantArrayType(
+          C.CharTy, ArySize, ArrayType::Normal, /*IndexTypeQuals=*/0);
+      auto *Field = FieldDecl::Create(
+          C, SharedStaticRD, SourceLocation(), SourceLocation(), nullptr, SubTy,
+          C.getTrivialTypeSourceInfo(SubTy, SourceLocation()),
+          /*BW=*/nullptr, /*Mutable=*/false,
+          /*InitStyle=*/ICIS_NoInit);
+      Field->setAccess(AS_public);
+      SharedStaticRD->addDecl(Field);
+    }
     SharedStaticRD->completeDefinition();
     if (!SharedStaticRD->field_empty()) {
       QualType StaticTy = C.getRecordType(SharedStaticRD);
index ed3c88b577165d7ecdfe774a3e70067ca0f3aa26..3baee007fa8086b2405585037ab2edfd7ccccf80 100644 (file)
@@ -26,7 +26,7 @@ void test_ds(){
     }
   }
 }
-// CK1: [[MEM_TY:%.+]] = type { [8 x i8] }
+// CK1: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CK1-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CK1-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CK1-DAG: [[KERNEL_SIZE:@.+]] = internal unnamed_addr constant i64 8
index a84962c4d815a80370767acfbbbda9a3137fb3aa..4e763bd139ec93dc37d00be9c83abd131cc923d3 100644 (file)
@@ -21,7 +21,7 @@ int main(int argc, char **argv) {
   return 0;
 }
 
-// CHECK: [[MEM_TY:%.+]] = type { [84 x i8] }
+// CHECK: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CHECK-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CHECK-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CHECK-DAG: [[KERNEL_SIZE:@.+]] = internal unnamed_addr constant i{{64|32}} 84
index 3dcf33017984816b7df9a00ee6bc4ab636eaec53..821897cc0f77a3d49970d6a450c78eaf574f9565 100644 (file)
@@ -72,7 +72,7 @@ int bar(int n){
   return a;
 }
 
-// CHECK: [[MEM_TY:%.+]] = type { [4 x i8] }
+// CHECK: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CHECK-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CHECK-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CHECK-DAG: [[KERNEL_SIZE:@.+]] = internal unnamed_addr constant i{{64|32}} 4
index 25a7a15693a2a03ef2c37adeb00a4ebaa715eeca..6a8601f3ae7060498ee45e6c6eecf5de244f15d5 100644 (file)
@@ -30,7 +30,7 @@ int bar(int n){
   return a;
 }
 
-// CHECK: [[MEM_TY:%.+]] = type { [4 x i8] }
+// CHECK: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CHECK-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CHECK-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CHECK-DAG: [[KERNEL_SIZE:@.+]] = internal unnamed_addr constant i{{64|32}} 4
index db608eff598da9b81b23f357c3642d6fffa8cee0..033ed1e684eac0471c850cfccbb748db208f239d 100644 (file)
@@ -18,7 +18,7 @@
 // CHECK-DAG: {{@__omp_offloading_.+l362}}_exec_mode = weak constant i8 1
 // CHECK-DAG: {{@__omp_offloading_.+l380}}_exec_mode = weak constant i8 1
 // CHECK-DAG: {{@__omp_offloading_.+l345}}_exec_mode = weak constant i8 1
-// CHECK-DAG: [[MAP_TY:%.+]] = type { [{{8|4}} x i8] }
+// CHECK-DAG: [[MAP_TY:%.+]] = type { [128 x i8] }
 // CHECK-DAG: [[GLOB_TY:%.+]] = type { i32* }
 
 __thread int id;
index ba99d17bdc22f5463e9fffa40ac6de6a9df4d443..a13762549c0e3774cf70f015dfb2be445100d5d0 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef HEADER
 #define HEADER
 
-// CHECK: [[MEM_TY:%.+]] = type { [4 x i8] }
+// CHECK: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CHECK-DAG: {{@__omp_offloading_.+}}_l19_exec_mode = weak constant i8 1
 // CHECK-DAG: internal unnamed_addr constant i{{64|32}} 4
 
index 0c06a60e441e2f0b247127d1c1a9b49222caddca..5f003dd6ccf31dca97edd27e879af937f31b34fe 100644 (file)
@@ -67,7 +67,7 @@ int bar(int n){
   return a;
 }
 
-// CHECK-DAG: [[MEM_TY:%.+]] = type { [4 x i8] }
+// CHECK-DAG: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CHECK-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CHECK-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CHECK-DAG: [[KERNEL_SIZE:@.+]] = internal unnamed_addr constant i{{64|32}} 4
index 5a828af687700574d30d0ec9143d993e57fc4eeb..c4db1bc579923822198b396dfc6e9c5f782b05ea 100644 (file)
@@ -62,7 +62,7 @@ int bar(int n){
   return a;
 }
 
-// CHECK-DAG: [[MEM_TY:%.+]] = type { [4 x i8] }
+// CHECK-DAG: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CHECK-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CHECK-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CHECK-DAG: [[KERNEL_SIZE:@.+]] = internal unnamed_addr constant i{{64|32}} 4
index 4965a50781c43d3676f674982edb5b0ad73e4179..b259a4b9380a1ae1bf6af72f9c4769fb9d998733 100644 (file)
@@ -27,7 +27,7 @@ int main (int argc, char **argv) {
   return tmain(argv);
 }
 
-// CK1: [[MEM_TY:%.+]] = type { [{{4|8}} x i8] }
+// CK1: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CK1-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CK1-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CK1-DAG: [[KERNEL_SIZE1:@.+]] = internal unnamed_addr constant i{{64|32}} 4
@@ -114,7 +114,7 @@ int main (int argc, char **argv) {
   return tmain(argv);
 }
 
-// CK2: [[MEM_TY:%.+]] = type { [{{4|8}} x i8] }
+// CK2: [[MEM_TY:%.+]] = type { [128 x i8] }
 // CK2-DAG: [[SHARED_GLOBAL_RD:@.+]] = common addrspace(3) global [[MEM_TY]] zeroinitializer
 // CK2-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CK2-DAG: [[KERNEL_SIZE1:@.+]] = internal unnamed_addr constant i{{64|32}} 4
index 65c147bd9298f961018a50111af1db3ce998719a..818f0739b2ee4dcd8022834b17850b1e3fca31c3 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef HEADER
 #define HEADER
 
-// CHECK: [[MAP_TY:%.+]] = type { [16 x i8] }
+// CHECK: [[MAP_TY:%.+]] = type { [128 x i8] }
 
 // CHECK-DAG: [[KERNEL_PTR:@.+]] = internal addrspace(3) global i8* null
 // CHECK-DAG: [[KERNEL_SHARED1:@.+]] = internal unnamed_addr constant i16 1