summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Belevich <tra@google.com>2015-09-10 17:26:58 +0000
committerArtem Belevich <tra@google.com>2015-09-10 17:26:58 +0000
commitda1851ca58dc72ed781f0c36b6ef9c42ba9acf89 (patch)
treec243bebd46df4f8275bd5091f9882322fb883236
parent170fd9cb6e3b6654e9b646a262610d73f4efe961 (diff)
downloadbcm5719-llvm-da1851ca58dc72ed781f0c36b6ef9c42ba9acf89.tar.gz
bcm5719-llvm-da1851ca58dc72ed781f0c36b6ef9c42ba9acf89.zip
[CUDA] Allow trivial constructors as initializer for __shared__ variables.
Differential Revision: http://reviews.llvm.org/D12739 llvm-svn: 247307
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp6
-rw-r--r--clang/test/CodeGenCUDA/address-spaces.cu14
2 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 8f0259d502a..bbc01cba633 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -2165,8 +2165,10 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
if (getLangOpts().CPlusPlus && getLangOpts().CUDAIsDevice
&& D->hasAttr<CUDASharedAttr>()) {
if (InitExpr) {
- Error(D->getLocation(),
- "__shared__ variable cannot have an initialization.");
+ const auto *C = dyn_cast<CXXConstructExpr>(InitExpr);
+ if (C == nullptr || !C->getConstructor()->hasTrivialBody())
+ Error(D->getLocation(),
+ "__shared__ variable cannot have an initialization.");
}
Init = llvm::UndefValue::get(getTypes().ConvertType(ASTTy));
} else if (!InitExpr) {
diff --git a/clang/test/CodeGenCUDA/address-spaces.cu b/clang/test/CodeGenCUDA/address-spaces.cu
index 5e7ff66b699..31cba958e15 100644
--- a/clang/test/CodeGenCUDA/address-spaces.cu
+++ b/clang/test/CodeGenCUDA/address-spaces.cu
@@ -25,6 +25,8 @@ struct MyStruct {
// CHECK: @_ZZ5func3vE1a = internal addrspace(3) global float 0.000000e+00
// CHECK: @_ZZ5func4vE1a = internal addrspace(3) global float 0.000000e+00
// CHECK: @b = addrspace(3) global float undef
+// CHECK: @c = addrspace(3) global %struct.c undef
+// CHECK @d = addrspace(3) global %struct.d undef
__device__ void foo() {
// CHECK: load i32, i32* addrspacecast (i32 addrspace(1)* @i to i32*)
@@ -117,3 +119,15 @@ __device__ int construct_shared_struct() {
return t.getData();
// CHECK: call i32 @_ZN14StructWithCtor7getDataEv(%struct.StructWithCtor* addrspacecast (%struct.StructWithCtor addrspace(3)* @_ZZ23construct_shared_structvE1t to %struct.StructWithCtor*))
}
+
+// Make sure we allow __shared__ structures with default or empty constructors.
+struct c {
+ int i;
+};
+__shared__ struct c c;
+
+struct d {
+ int i;
+ d() {}
+};
+__shared__ struct d d;
OpenPOWER on IntegriCloud