r342370 - [OpenCL] Allow blocks to capture arrays in OpenCL
Andrew Savonichev via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 17 04:19:42 PDT 2018
Author: asavonic
Date: Mon Sep 17 04:19:42 2018
New Revision: 342370
URL: http://llvm.org/viewvc/llvm-project?rev=342370&view=rev
Log:
[OpenCL] Allow blocks to capture arrays in OpenCL
Summary: Patch by Egor Churaev
Reviewers: Anastasia, yaxunl
Reviewed By: Anastasia
Subscribers: asavonic, bader, cfe-commits
Differential Revision: https://reviews.llvm.org/D51722
Added:
cfe/trunk/test/SemaOpenCL/block-array-capturing.cl
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=342370&r1=342369&r2=342370&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Sep 17 04:19:42 2018
@@ -14627,8 +14627,10 @@ static bool captureInBlock(BlockScopeInf
Expr *CopyExpr = nullptr;
bool ByRef = false;
- // Blocks are not allowed to capture arrays.
- if (CaptureType->isArrayType()) {
+ // Blocks are not allowed to capture arrays, excepting OpenCL.
+ // OpenCL v2.0 s1.12.5 (revision 40): arrays are captured by reference
+ // (decayed to pointers).
+ if (!S.getLangOpts().OpenCL && CaptureType->isArrayType()) {
if (BuildAndDiagnose) {
S.Diag(Loc, diag::err_ref_array_type);
S.Diag(Var->getLocation(), diag::note_previous_decl)
Added: cfe/trunk/test/SemaOpenCL/block-array-capturing.cl
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/block-array-capturing.cl?rev=342370&view=auto
==============================================================================
--- cfe/trunk/test/SemaOpenCL/block-array-capturing.cl (added)
+++ cfe/trunk/test/SemaOpenCL/block-array-capturing.cl Mon Sep 17 04:19:42 2018
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -O0 -cl-std=CL2.0 -triple spir64-unkown-unkown -emit-llvm %s -o -| FileCheck %s
+// expected-no-diagnostics
+
+typedef int (^block_t)();
+
+int block_typedef_kernel(global int* res) {
+ // CHECK: %{{.*}} = alloca <{ i32, i32, [3 x i32] }>
+ int a[3] = {1, 2, 3};
+ // CHECK: call void @llvm.memcpy{{.*}}
+ block_t b = ^() { return a[0]; };
+ return b();
+}
+
+// CHECK: define {{.*}} @__block_typedef_kernel_block_invoke
+// CHECK: %{{.*}} = getelementptr inbounds [3 x i32], [3 x i32] addrspace(4)* %{{.*}}, i64 0, i64 0
+// CHECK-NOT: call void @llvm.memcpy{{.*}}
More information about the cfe-commits
mailing list