[PATCH] D59646: [PR40778][PR41157][OpenCL] Prevent implicit initialization of local address space objects
Anastasia Stulova via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 25 05:39:14 PDT 2019
Anastasia updated this revision to Diff 192087.
Anastasia marked 2 inline comments as done.
Anastasia added a comment.
Fixed typo in the comment.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D59646/new/
https://reviews.llvm.org/D59646
Files:
lib/Sema/SemaDecl.cpp
test/CodeGenOpenCLCXX/addrspace-of-this.cl
test/CodeGenOpenCLCXX/local_addrspace_init.cl
Index: test/CodeGenOpenCLCXX/local_addrspace_init.cl
===================================================================
--- /dev/null
+++ test/CodeGenOpenCLCXX/local_addrspace_init.cl
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -triple spir -cl-std=c++ -emit-llvm -O0 -o - | FileCheck %s
+
+// Test that we don't initialize local address space objects.
+//CHECK: @_ZZ4testvE1i = internal addrspace(3) global i32 undef
+//CHECK: @_ZZ4testvE2ii = internal addrspace(3) global %class.C undef
+class C {
+ int i;
+};
+
+kernel void test() {
+ __local int i;
+ __local C ii;
+ //FIXME: In OpenCL C we don't accept initializers for local address space variables.
+ //User defined initialization could make sense, but would it mean that all work
+ //items need to execute it? Potentially disallowing any initialization would make
+ //things easier and assingments can be used to set specific values. This rules should
+ // make it consistent with OpenCL C.
+ //__local C c();
+}
Index: test/CodeGenOpenCLCXX/addrspace-of-this.cl
===================================================================
--- test/CodeGenOpenCLCXX/addrspace-of-this.cl
+++ test/CodeGenOpenCLCXX/addrspace-of-this.cl
@@ -150,15 +150,13 @@
TEST(__local)
// COMMON-LABEL: _Z11test__localv
-// EXPL: @__cxa_guard_acquire
-// Test the address space of 'this' when invoking a constructor for an object in non-default address space
-// EXPL: call void @_ZNU3AS41CC1Ev(%class.C addrspace(4)* addrspacecast (%class.C addrspace(3)* @_ZZ11test__localvE1c to %class.C addrspace(4)*))
+// Test that we don't initialize an object in local address space
+// EXPL-NOT: call void @_ZNU3AS41CC1Ev(%class.C addrspace(4)* addrspacecast (%class.C addrspace(3)* @_ZZ11test__localvE1c to %class.C addrspace(4)*))
// Test the address space of 'this' when invoking a method.
// COMMON: %call = call i32 @_ZNU3AS41C3getEv(%class.C addrspace(4)* addrspacecast (%class.C addrspace(3)* @_ZZ11test__localvE1c to %class.C addrspace(4)*))
-
// Test the address space of 'this' when invoking copy-constructor.
// COMMON: [[C1GEN:%[0-9]+]] = addrspacecast %class.C* %c1 to %class.C addrspace(4)*
// EXPL: call void @_ZNU3AS41CC1ERU3AS4KS_(%class.C addrspace(4)* [[C1GEN]], %class.C addrspace(4)* dereferenceable(4) addrspacecast (%class.C addrspace(3)* @_ZZ11test__localvE1c to %class.C addrspace(4)*))
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -11645,7 +11645,10 @@
setFunctionHasBranchProtectedScope();
}
}
-
+ // In OpenCL we don't allow to initialize objects in local address space.
+ if (getLangOpts().OpenCL &&
+ Var->getType().getAddressSpace() == LangAS::opencl_local)
+ return;
// C++03 [dcl.init]p9:
// If no initializer is specified for an object, and the
// object is of (possibly cv-qualified) non-POD class type (or
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D59646.192087.patch
Type: text/x-patch
Size: 2955 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190325/1f273d76/attachment.bin>
More information about the cfe-commits
mailing list