diff options
| author | Scott Linder <scott@scottlinder.com> | 2018-08-07 15:52:49 +0000 |
|---|---|---|
| committer | Scott Linder <scott@scottlinder.com> | 2018-08-07 15:52:49 +0000 |
| commit | f8b3df4decd9ff887451779b511fa7dc8936e3a9 (patch) | |
| tree | 3582e1e345de8a377cba90008e5159667eee4372 /clang/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl | |
| parent | 950576bdf82aba26456c24061e72cf5e8999b608 (diff) | |
| download | bcm5719-llvm-f8b3df4decd9ff887451779b511fa7dc8936e3a9.tar.gz bcm5719-llvm-f8b3df4decd9ff887451779b511fa7dc8936e3a9.zip | |
[OpenCL] Restore r338899 (reverted in r338904), fixing stack-use-after-return
Always emit alloca in entry block for enqueue_kernel builtin.
Ensures the statically sized alloca is not converted to DYNAMIC_STACKALLOC
later because it is not in the entry block.
llvm-svn: 339150
Diffstat (limited to 'clang/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl')
| -rw-r--r-- | clang/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/clang/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl b/clang/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl new file mode 100644 index 00000000000..00c4755c1cc --- /dev/null +++ b/clang/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -emit-llvm -o - -triple amdgcn < %s | FileCheck %s --check-prefixes=COMMON,AMDGPU +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -emit-llvm -o - -triple "spir-unknown-unknown" < %s | FileCheck %s --check-prefixes=COMMON,SPIR32 +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -emit-llvm -o - -triple "spir64-unknown-unknown" < %s | FileCheck %s --check-prefixes=COMMON,SPIR64 +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -debug-info-kind=limited -emit-llvm -o - -triple amdgcn < %s | FileCheck %s --check-prefixes=CHECK-DEBUG + +// Check that the enqueue_kernel array temporary is in the entry block to avoid +// a dynamic alloca + +typedef struct {int a;} ndrange_t; + +kernel void test(int i) { +// COMMON-LABEL: define {{.*}} void @test +// COMMON-LABEL: entry: +// AMDGPU: %block_sizes = alloca [1 x i64] +// SPIR32: %block_sizes = alloca [1 x i32] +// SPIR64: %block_sizes = alloca [1 x i64] +// COMMON-LABEL: if.then: +// COMMON-NOT: alloca +// CHECK-DEBUG: getelementptr {{.*}} %block_sizes, {{.*}} !dbg !34 +// COMMON-LABEL: if.end + queue_t default_queue; + unsigned flags = 0; + ndrange_t ndrange; + if (i) + enqueue_kernel(default_queue, flags, ndrange, ^(local void *a) { }, 32); +} + +// Check that the temporary is scoped to the `if` + +// CHECK-DEBUG: !32 = distinct !DILexicalBlock(scope: !7, file: !1, line: 24) +// CHECK-DEBUG: !34 = !DILocation(line: 25, scope: !32) |

