<div dir="ltr">Have you tried setting detect_stack_use_after_return in ASAN_OPTIONS? The ASan buildbot sets the following ASAN_OPTIONS prior to running tests:<div>export ASAN_OPTIONS="check_initialization_order=true:detect_stack_use_after_return=1:detect_leaks=1"<br></div><div><div class="gmail_quote"><div dir="ltr"><br></div><div dir="ltr">On Mon, Aug 6, 2018 at 7:34 AM <<a href="mailto:scott@scottlinder.com" target="_blank">scott@scottlinder.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I can't seem to reproduce the ASan failure locally, even after building <br>
a clang with the latest compiler-rt, and then rebuilding my patch with <br>
LLVM_USE_SANITIZER=Address<br>
<br>
I am pretty confident the problem should be fixed with a one-line change <br>
to my patch:<br>
<br>
-    auto CreateArrayForSizeVar = [=](unsigned First) {<br>
+    auto CreateArrayForSizeVar = [=](unsigned First)<br>
+        -> std::tuple<llvm::Value *, llvm::Value *, llvm::Value *> {<br>
<br>
I don't want to commit something and then immediately have to revert, <br>
though. Can you think of anything I might be missing locally to <br>
reproduce the ASan failure?<br>
<br>
Thanks,<br>
Scott<br>
<br>
On 2018-08-03 13:48, Vlad Tsyrklevich wrote:<br>
> This change is causing ASan failures on the sanitizer bots:<br>
> <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/21898/steps/check-clang%20asan/logs/stdio" rel="noreferrer" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/21898/steps/check-clang%20asan/logs/stdio</a><br>
> [9]<br>
> <br>
> I've reverted it in r338904.<br>
> <br>
> On Fri, Aug 3, 2018 at 8:51 AM Scott Linder via cfe-commits<br>
> <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br>
> <br>
>> Author: scott.linder<br>
>> Date: Fri Aug 3 08:50:52 2018<br>
>> New Revision: 338899<br>
>> <br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=338899&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=338899&view=rev</a> [1]<br>
>> Log:<br>
>> [OpenCL] Always emit alloca in entry block for enqueue_kernel<br>
>> builtin<br>
>> <br>
>> Ensures the statically sized alloca is not converted to<br>
>> DYNAMIC_STACKALLOC<br>
>> later because it is not in the entry block.<br>
>> <br>
>> Differential Revision: <a href="https://reviews.llvm.org/D50104" rel="noreferrer" target="_blank">https://reviews.llvm.org/D50104</a> [2]<br>
>> <br>
>> Added:<br>
>> cfe/trunk/test/CodeGenOpenCL/<a href="http://enqueue-kernel-non-entry-block.cl" rel="noreferrer" target="_blank">enqueue-kernel-non-entry-block.cl</a><br>
>> [3]<br>
>> Modified:<br>
>> cfe/trunk/lib/CodeGen/CGBuiltin.cpp<br>
>> cfe/trunk/test/CodeGenOpenCL/<a href="http://cl20-device-side-enqueue.cl" rel="noreferrer" target="_blank">cl20-device-side-enqueue.cl</a> [4]<br>
>> <br>
>> Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp<br>
>> URL:<br>
>> <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=338899&r1=338898&r2=338899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=338899&r1=338898&r2=338899&view=diff</a><br>
>> [5]<br>
>> <br>
> ==============================================================================<br>
>> --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)<br>
>> +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Fri Aug 3 08:50:52 2018<br>
>> @@ -3338,23 +3338,29 @@ RValue CodeGenFunction::EmitBuiltinExpr(<br>
>> // Create a temporary array to hold the sizes of local pointer<br>
>> arguments<br>
>> // for the block. \p First is the position of the first size<br>
>> argument.<br>
>> auto CreateArrayForSizeVar = [=](unsigned First) {<br>
>> - auto *AT = llvm::ArrayType::get(SizeTy, NumArgs - First);<br>
>> - auto *Arr = Builder.CreateAlloca(AT);<br>
>> - llvm::Value *Ptr;<br>
>> + llvm::APInt ArraySize(32, NumArgs - First);<br>
>> + QualType SizeArrayTy = getContext().getConstantArrayType(<br>
>> + getContext().getSizeType(), ArraySize, ArrayType::Normal,<br>
>> + /*IndexTypeQuals=*/0);<br>
>> + auto Tmp = CreateMemTemp(SizeArrayTy, "block_sizes");<br>
>> + llvm::Value *TmpPtr = Tmp.getPointer();<br>
>> + llvm::Value *TmpSize = EmitLifetimeStart(<br>
>> +<br>
>> CGM.getDataLayout().getTypeAllocSize(Tmp.getElementType()), TmpPtr);<br>
>> + llvm::Value *ElemPtr;<br>
>> // Each of the following arguments specifies the size of the<br>
>> corresponding<br>
>> // argument passed to the enqueued block.<br>
>> auto *Zero = llvm::ConstantInt::get(IntTy, 0);<br>
>> for (unsigned I = First; I < NumArgs; ++I) {<br>
>> auto *Index = llvm::ConstantInt::get(IntTy, I - First);<br>
>> - auto *GEP = Builder.CreateGEP(Arr, {Zero, Index});<br>
>> + auto *GEP = Builder.CreateGEP(TmpPtr, {Zero, Index});<br>
>> if (I == First)<br>
>> - Ptr = GEP;<br>
>> + ElemPtr = GEP;<br>
>> auto *V =<br>
>> Builder.CreateZExtOrTrunc(EmitScalarExpr(E->getArg(I)),<br>
>> SizeTy);<br>
>> Builder.CreateAlignedStore(<br>
>> V, GEP,<br>
>> CGM.getDataLayout().getPrefTypeAlignment(SizeTy));<br>
>> }<br>
>> - return Ptr;<br>
>> + return std::tie(ElemPtr, TmpSize, TmpPtr);<br>
>> };<br>
>> <br>
>> // Could have events and/or varargs.<br>
>> @@ -3366,24 +3372,27 @@ RValue CodeGenFunction::EmitBuiltinExpr(<br>
>> llvm::Value *Kernel =<br>
>> Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy);<br>
>> auto *Block = Builder.CreatePointerCast(Info.BlockArg,<br>
>> GenericVoidPtrTy);<br>
>> - auto *PtrToSizeArray = CreateArrayForSizeVar(4);<br>
>> + llvm::Value *ElemPtr, *TmpSize, *TmpPtr;<br>
>> + std::tie(ElemPtr, TmpSize, TmpPtr) =<br>
>> CreateArrayForSizeVar(4);<br>
>> <br>
>> // Create a vector of the arguments, as well as a constant<br>
>> value to<br>
>> // express to the runtime the number of variadic arguments.<br>
>> std::vector<llvm::Value *> Args = {<br>
>> Queue, Flags, Range,<br>
>> Kernel, Block, ConstantInt::get(IntTy, NumArgs - 4),<br>
>> - PtrToSizeArray};<br>
>> + ElemPtr};<br>
>> std::vector<llvm::Type *> ArgTys = {<br>
>> - QueueTy, IntTy, RangeTy,<br>
>> - GenericVoidPtrTy, GenericVoidPtrTy, IntTy,<br>
>> - PtrToSizeArray->getType()};<br>
>> + QueueTy, IntTy, RangeTy,<br>
>> GenericVoidPtrTy,<br>
>> + GenericVoidPtrTy, IntTy, ElemPtr->getType()};<br>
>> <br>
>> llvm::FunctionType *FTy = llvm::FunctionType::get(<br>
>> Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), false);<br>
>> - return RValue::get(<br>
>> - Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name),<br>
>> - llvm::ArrayRef<llvm::Value *>(Args)));<br>
>> + auto Call =<br>
>> +<br>
>> RValue::get(Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name),<br>
>> + llvm::ArrayRef<llvm::Value<br>
>> *>(Args)));<br>
>> + if (TmpSize)<br>
>> + EmitLifetimeEnd(TmpSize, TmpPtr);<br>
>> + return Call;<br>
>> }<br>
>> // Any calls now have event arguments passed.<br>
>> if (NumArgs >= 7) {<br>
>> @@ -3430,15 +3439,19 @@ RValue CodeGenFunction::EmitBuiltinExpr(<br>
>> ArgTys.push_back(Int32Ty);<br>
>> Name = "__enqueue_kernel_events_varargs";<br>
>> <br>
>> - auto *PtrToSizeArray = CreateArrayForSizeVar(7);<br>
>> - Args.push_back(PtrToSizeArray);<br>
>> - ArgTys.push_back(PtrToSizeArray->getType());<br>
>> + llvm::Value *ElemPtr, *TmpSize, *TmpPtr;<br>
>> + std::tie(ElemPtr, TmpSize, TmpPtr) =<br>
>> CreateArrayForSizeVar(7);<br>
>> + Args.push_back(ElemPtr);<br>
>> + ArgTys.push_back(ElemPtr->getType());<br>
>> <br>
>> llvm::FunctionType *FTy = llvm::FunctionType::get(<br>
>> Int32Ty, llvm::ArrayRef<llvm::Type *>(ArgTys), false);<br>
>> - return RValue::get(<br>
>> - Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name),<br>
>> - llvm::ArrayRef<llvm::Value *>(Args)));<br>
>> + auto Call =<br>
>> +<br>
>> RValue::get(Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name),<br>
>> + llvm::ArrayRef<llvm::Value<br>
>> *>(Args)));<br>
>> + if (TmpSize)<br>
>> + EmitLifetimeEnd(TmpSize, TmpPtr);<br>
>> + return Call;<br>
>> }<br>
>> LLVM_FALLTHROUGH;<br>
>> }<br>
>> <br>
>> Modified: cfe/trunk/test/CodeGenOpenCL/<a href="http://cl20-device-side-enqueue.cl" rel="noreferrer" target="_blank">cl20-device-side-enqueue.cl</a><br>
>> [4]<br>
>> URL:<br>
>> <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/cl20-device-side-enqueue.cl?rev=338899&r1=338898&r2=338899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/cl20-device-side-enqueue.cl?rev=338899&r1=338898&r2=338899&view=diff</a><br>
>> [6]<br>
>> <br>
> ==============================================================================<br>
>> --- cfe/trunk/test/CodeGenOpenCL/<a href="http://cl20-device-side-enqueue.cl" rel="noreferrer" target="_blank">cl20-device-side-enqueue.cl</a> [4]<br>
>> (original)<br>
>> +++ cfe/trunk/test/CodeGenOpenCL/<a href="http://cl20-device-side-enqueue.cl" rel="noreferrer" target="_blank">cl20-device-side-enqueue.cl</a> [4] Fri<br>
>> Aug 3 08:50:52 2018<br>
>> @@ -1,5 +1,6 @@<br>
>> // RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -O0<br>
>> -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s<br>
>> --check-prefix=COMMON --check-prefix=B32<br>
>> // RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -O0<br>
>> -emit-llvm -o - -triple "spir64-unknown-unknown" | FileCheck %s<br>
>> --check-prefix=COMMON --check-prefix=B64<br>
>> +// RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -O1<br>
>> -emit-llvm -o - -triple "spir64-unknown-unknown" | FileCheck %s<br>
>> --check-prefix=CHECK-LIFETIMES<br>
>> <br>
>> #pragma OPENCL EXTENSION cl_khr_subgroups : enable<br>
>> <br>
>> @@ -46,8 +47,31 @@ kernel void device_side_enqueue(global i<br>
>> // COMMON: %event_wait_list2 = alloca [1 x %opencl.clk_event_t*]<br>
>> clk_event_t event_wait_list2[] = {clk_event};<br>
>> <br>
>> - // Emits block literal on stack and block kernel [[INVLK1]].<br>
>> // COMMON: [[NDR:%[a-z0-9]+]] = alloca %struct.ndrange_t, align 4<br>
>> +<br>
>> + // B32: %[[BLOCK_SIZES1:.*]] = alloca [1 x i32]<br>
>> + // B64: %[[BLOCK_SIZES1:.*]] = alloca [1 x i64]<br>
>> + // CHECK-LIFETIMES: %[[BLOCK_SIZES1:.*]] = alloca [1 x i64]<br>
>> + // B32: %[[BLOCK_SIZES2:.*]] = alloca [1 x i32]<br>
>> + // B64: %[[BLOCK_SIZES2:.*]] = alloca [1 x i64]<br>
>> + // CHECK-LIFETIMES: %[[BLOCK_SIZES2:.*]] = alloca [1 x i64]<br>
>> + // B32: %[[BLOCK_SIZES3:.*]] = alloca [1 x i32]<br>
>> + // B64: %[[BLOCK_SIZES3:.*]] = alloca [1 x i64]<br>
>> + // CHECK-LIFETIMES: %[[BLOCK_SIZES3:.*]] = alloca [1 x i64]<br>
>> + // B32: %[[BLOCK_SIZES4:.*]] = alloca [1 x i32]<br>
>> + // B64: %[[BLOCK_SIZES4:.*]] = alloca [1 x i64]<br>
>> + // CHECK-LIFETIMES: %[[BLOCK_SIZES4:.*]] = alloca [1 x i64]<br>
>> + // B32: %[[BLOCK_SIZES5:.*]] = alloca [1 x i32]<br>
>> + // B64: %[[BLOCK_SIZES5:.*]] = alloca [1 x i64]<br>
>> + // CHECK-LIFETIMES: %[[BLOCK_SIZES5:.*]] = alloca [1 x i64]<br>
>> + // B32: %[[BLOCK_SIZES6:.*]] = alloca [3 x i32]<br>
>> + // B64: %[[BLOCK_SIZES6:.*]] = alloca [3 x i64]<br>
>> + // CHECK-LIFETIMES: %[[BLOCK_SIZES6:.*]] = alloca [3 x i64]<br>
>> + // B32: %[[BLOCK_SIZES7:.*]] = alloca [1 x i32]<br>
>> + // B64: %[[BLOCK_SIZES7:.*]] = alloca [1 x i64]<br>
>> + // CHECK-LIFETIMES: %[[BLOCK_SIZES7:.*]] = alloca [1 x i64]<br>
>> +<br>
>> + // Emits block literal on stack and block kernel [[INVLK1]].<br>
>> // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*,<br>
>> %opencl.queue_t{{.*}}** %default_queue<br>
>> // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags<br>
>> // B32: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i32 addrspace(1)*,<br>
>> i32, i32 addrspace(1)* }>* %block to void ()*<br>
>> @@ -73,7 +97,6 @@ kernel void device_side_enqueue(global i<br>
>> // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)* [[EVNT]],<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVLK2:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* [[BL_I8]])<br>
>> -<br>
>> enqueue_kernel(default_queue, flags, ndrange, 2,<br>
>> &event_wait_list, &clk_event,<br>
>> ^(void) {<br>
>> a[i] = b[i];<br>
>> @@ -82,39 +105,46 @@ kernel void device_side_enqueue(global i<br>
>> // Emits global block literal [[BLG1]] and block kernel<br>
>> [[INVGK1]].<br>
>> // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*,<br>
>> %opencl.queue_t{{.*}}** %default_queue<br>
>> // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags<br>
>> - // B32: %[[TMP:.*]] = alloca [1 x i32]<br>
>> - // B32: %[[TMP1:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B32: store i32 256, i32* %[[TMP1]], align 4<br>
>> - // B64: %[[TMP:.*]] = alloca [1 x i64]<br>
>> - // B64: %[[TMP1:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B64: store i64 256, i64* %[[TMP1]], align 8<br>
>> + // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]*<br>
>> %[[BLOCK_SIZES1]] to i8*<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64<br>
>> 8, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x<br>
>> i64]* %[[BLOCK_SIZES1]], i64 0, i64 0<br>
>> + // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8,<br>
>> i8* nonnull [[LIFETIME_PTR]])<br>
>> + // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[BLOCK_SIZES1]], i32 0, i32 0<br>
>> + // B32: store i32 256, i32* %[[TMP]], align 4<br>
>> + // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[BLOCK_SIZES1]], i32 0, i32 0<br>
>> + // B64: store i64 256, i64* %[[TMP]], align 8<br>
>> // COMMON-LABEL: call i32 @__enqueue_kernel_varargs(<br>
>> // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVGK1:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)*<br>
>> bitcast ({ i32, i32 } addrspace(1)* [[BLG1]] to i8 addrspace(1)*) to<br>
>> i8 addrspace(4)*), i32 1,<br>
>> - // B32-SAME: i32* %[[TMP1]])<br>
>> - // B64-SAME: i64* %[[TMP1]])<br>
>> + // B32-SAME: i32* %[[TMP]])<br>
>> + // B64-SAME: i64* %[[TMP]])<br>
>> enqueue_kernel(default_queue, flags, ndrange,<br>
>> ^(local void *p) {<br>
>> return;<br>
>> },<br>
>> 256);<br>
>> +<br>
>> char c;<br>
>> // Emits global block literal [[BLG2]] and block kernel<br>
>> [[INVGK2]].<br>
>> // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*,<br>
>> %opencl.queue_t{{.*}}** %default_queue<br>
>> // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags<br>
>> - // B32: %[[TMP:.*]] = alloca [1 x i32]<br>
>> - // B32: %[[TMP1:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B32: store i32 %{{.*}}, i32* %[[TMP1]], align 4<br>
>> - // B64: %[[TMP:.*]] = alloca [1 x i64]<br>
>> - // B64: %[[TMP1:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B64: store i64 %{{.*}}, i64* %[[TMP1]], align 8<br>
>> + // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]*<br>
>> %[[BLOCK_SIZES2]] to i8*<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64<br>
>> 8, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x<br>
>> i64]* %[[BLOCK_SIZES2]], i64 0, i64 0<br>
>> + // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8,<br>
>> i8* nonnull [[LIFETIME_PTR]])<br>
>> + // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[BLOCK_SIZES2]], i32 0, i32 0<br>
>> + // B32: store i32 %{{.*}}, i32* %[[TMP]], align 4<br>
>> + // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[BLOCK_SIZES2]], i32 0, i32 0<br>
>> + // B64: store i64 %{{.*}}, i64* %[[TMP]], align 8<br>
>> // COMMON-LABEL: call i32 @__enqueue_kernel_varargs(<br>
>> // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVGK2:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)*<br>
>> bitcast ({ i32, i32 } addrspace(1)* [[BLG2]] to i8 addrspace(1)*) to<br>
>> i8 addrspace(4)*), i32 1,<br>
>> - // B32-SAME: i32* %[[TMP1]])<br>
>> - // B64-SAME: i64* %[[TMP1]])<br>
>> + // B32-SAME: i32* %[[TMP]])<br>
>> + // B64-SAME: i64* %[[TMP]])<br>
>> enqueue_kernel(default_queue, flags, ndrange,<br>
>> ^(local void *p) {<br>
>> return;<br>
>> @@ -127,18 +157,21 @@ kernel void device_side_enqueue(global i<br>
>> // COMMON: [[AD:%arraydecay[0-9]*]] = getelementptr inbounds [1 x<br>
>> %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]*<br>
>> %event_wait_list2, i32 0, i32 0<br>
>> // COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast<br>
>> %opencl.clk_event_t{{.*}}** [[AD]] to %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)*<br>
>> // COMMON: [[EVNT:%[0-9]+]] = addrspacecast<br>
>> %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)*<br>
>> - // B32: %[[TMP:.*]] = alloca [1 x i32]<br>
>> - // B32: %[[TMP1:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B32: store i32 256, i32* %[[TMP1]], align 4<br>
>> - // B64: %[[TMP:.*]] = alloca [1 x i64]<br>
>> - // B64: %[[TMP1:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B64: store i64 256, i64* %[[TMP1]], align 8<br>
>> + // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]*<br>
>> %[[BLOCK_SIZES3]] to i8*<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64<br>
>> 8, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x<br>
>> i64]* %[[BLOCK_SIZES3]], i64 0, i64 0<br>
>> + // CHECK-LIFETIMES-LABEL: call i32<br>
>> @__enqueue_kernel_events_varargs(<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8,<br>
>> i8* nonnull [[LIFETIME_PTR]])<br>
>> + // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[BLOCK_SIZES3]], i32 0, i32 0<br>
>> + // B32: store i32 256, i32* %[[TMP]], align 4<br>
>> + // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[BLOCK_SIZES3]], i32 0, i32 0<br>
>> + // B64: store i64 256, i64* %[[TMP]], align 8<br>
>> // COMMON-LABEL: call i32 @__enqueue_kernel_events_varargs<br>
>> // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}<br>
>> [[WAIT_EVNT]], %opencl.clk_event_t{{.*}} [[EVNT]],<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVGK3:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)*<br>
>> bitcast ({ i32, i32 } addrspace(1)* [[BLG3]] to i8 addrspace(1)*) to<br>
>> i8 addrspace(4)*), i32 1,<br>
>> - // B32-SAME: i32* %[[TMP1]])<br>
>> - // B64-SAME: i64* %[[TMP1]])<br>
>> + // B32-SAME: i32* %[[TMP]])<br>
>> + // B64-SAME: i64* %[[TMP]])<br>
>> enqueue_kernel(default_queue, flags, ndrange, 2,<br>
>> event_wait_list2, &clk_event,<br>
>> ^(local void *p) {<br>
>> return;<br>
>> @@ -151,18 +184,21 @@ kernel void device_side_enqueue(global i<br>
>> // COMMON: [[AD:%arraydecay[0-9]*]] = getelementptr inbounds [1 x<br>
>> %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]*<br>
>> %event_wait_list2, i32 0, i32 0<br>
>> // COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast<br>
>> %opencl.clk_event_t{{.*}}** [[AD]] to %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)*<br>
>> // COMMON: [[EVNT:%[0-9]+]] = addrspacecast<br>
>> %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)*<br>
>> - // B32: %[[TMP:.*]] = alloca [1 x i32]<br>
>> - // B32: %[[TMP1:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B32: store i32 %{{.*}}, i32* %[[TMP1]], align 4<br>
>> - // B64: %[[TMP:.*]] = alloca [1 x i64]<br>
>> - // B64: %[[TMP1:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B64: store i64 %{{.*}}, i64* %[[TMP1]], align 8<br>
>> + // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]*<br>
>> %[[BLOCK_SIZES4]] to i8*<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64<br>
>> 8, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x<br>
>> i64]* %[[BLOCK_SIZES4]], i64 0, i64 0<br>
>> + // CHECK-LIFETIMES-LABEL: call i32<br>
>> @__enqueue_kernel_events_varargs(<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8,<br>
>> i8* nonnull [[LIFETIME_PTR]])<br>
>> + // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[BLOCK_SIZES4]], i32 0, i32 0<br>
>> + // B32: store i32 %{{.*}}, i32* %[[TMP]], align 4<br>
>> + // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[BLOCK_SIZES4]], i32 0, i32 0<br>
>> + // B64: store i64 %{{.*}}, i64* %[[TMP]], align 8<br>
>> // COMMON-LABEL: call i32 @__enqueue_kernel_events_varargs<br>
>> // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}*<br>
>> addrspace(4)* [[EVNT]],<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVGK4:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)*<br>
>> bitcast ({ i32, i32 } addrspace(1)* [[BLG4]] to i8 addrspace(1)*) to<br>
>> i8 addrspace(4)*), i32 1,<br>
>> - // B32-SAME: i32* %[[TMP1]])<br>
>> - // B64-SAME: i64* %[[TMP1]])<br>
>> + // B32-SAME: i32* %[[TMP]])<br>
>> + // B64-SAME: i64* %[[TMP]])<br>
>> enqueue_kernel(default_queue, flags, ndrange, 2,<br>
>> event_wait_list2, &clk_event,<br>
>> ^(local void *p) {<br>
>> return;<br>
>> @@ -173,18 +209,21 @@ kernel void device_side_enqueue(global i<br>
>> // Emits global block literal [[BLG5]] and block kernel<br>
>> [[INVGK5]].<br>
>> // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*,<br>
>> %opencl.queue_t{{.*}}** %default_queue<br>
>> // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags<br>
>> - // B32: %[[TMP:.*]] = alloca [1 x i32]<br>
>> - // B32: %[[TMP1:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B32: store i32 %{{.*}}, i32* %[[TMP1]], align 4<br>
>> - // B64: %[[TMP:.*]] = alloca [1 x i64]<br>
>> - // B64: %[[TMP1:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B64: store i64 %{{.*}}, i64* %[[TMP1]], align 8<br>
>> + // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]*<br>
>> %[[BLOCK_SIZES5]] to i8*<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64<br>
>> 8, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x<br>
>> i64]* %[[BLOCK_SIZES5]], i64 0, i64 0<br>
>> + // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8,<br>
>> i8* nonnull [[LIFETIME_PTR]])<br>
>> + // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[BLOCK_SIZES5]], i32 0, i32 0<br>
>> + // B32: store i32 %{{.*}}, i32* %[[TMP]], align 4<br>
>> + // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[BLOCK_SIZES5]], i32 0, i32 0<br>
>> + // B64: store i64 %{{.*}}, i64* %[[TMP]], align 8<br>
>> // COMMON-LABEL: call i32 @__enqueue_kernel_varargs<br>
>> // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVGK5:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)*<br>
>> bitcast ({ i32, i32 } addrspace(1)* [[BLG5]] to i8 addrspace(1)*) to<br>
>> i8 addrspace(4)*), i32 1,<br>
>> - // B32-SAME: i32* %[[TMP1]])<br>
>> - // B64-SAME: i64* %[[TMP1]])<br>
>> + // B32-SAME: i32* %[[TMP]])<br>
>> + // B64-SAME: i64* %[[TMP]])<br>
>> enqueue_kernel(default_queue, flags, ndrange,<br>
>> ^(local void *p) {<br>
>> return;<br>
>> @@ -194,26 +233,29 @@ kernel void device_side_enqueue(global i<br>
>> // Emits global block literal [[BLG6]] and block kernel<br>
>> [[INVGK6]].<br>
>> // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*,<br>
>> %opencl.queue_t{{.*}}** %default_queue<br>
>> // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags<br>
>> - // B32: %[[TMP:.*]] = alloca [3 x i32]<br>
>> - // B32: %[[TMP1:.*]] = getelementptr [3 x i32], [3 x i32]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B32: store i32 1, i32* %[[TMP1]], align 4<br>
>> - // B32: %[[TMP2:.*]] = getelementptr [3 x i32], [3 x i32]*<br>
>> %[[TMP]], i32 0, i32 1<br>
>> - // B32: store i32 2, i32* %[[TMP2]], align 4<br>
>> - // B32: %[[TMP3:.*]] = getelementptr [3 x i32], [3 x i32]*<br>
>> %[[TMP]], i32 0, i32 2<br>
>> - // B32: store i32 4, i32* %[[TMP3]], align 4<br>
>> - // B64: %[[TMP:.*]] = alloca [3 x i64]<br>
>> - // B64: %[[TMP1:.*]] = getelementptr [3 x i64], [3 x i64]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B64: store i64 1, i64* %[[TMP1]], align 8<br>
>> - // B64: %[[TMP2:.*]] = getelementptr [3 x i64], [3 x i64]*<br>
>> %[[TMP]], i32 0, i32 1<br>
>> - // B64: store i64 2, i64* %[[TMP2]], align 8<br>
>> - // B64: %[[TMP3:.*]] = getelementptr [3 x i64], [3 x i64]*<br>
>> %[[TMP]], i32 0, i32 2<br>
>> - // B64: store i64 4, i64* %[[TMP3]], align 8<br>
>> + // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [3 x i64]*<br>
>> %[[BLOCK_SIZES6]] to i8*<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64<br>
>> 24, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // CHECK-LIFETIMES-NEXT: getelementptr inbounds [3 x i64], [3 x<br>
>> i64]* %[[BLOCK_SIZES6]], i64 0, i64 0<br>
>> + // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64<br>
>> 24, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // B32: %[[TMP:.*]] = getelementptr [3 x i32], [3 x i32]*<br>
>> %[[BLOCK_SIZES6]], i32 0, i32 0<br>
>> + // B32: store i32 1, i32* %[[TMP]], align 4<br>
>> + // B32: %[[BLOCK_SIZES62:.*]] = getelementptr [3 x i32], [3 x<br>
>> i32]* %[[BLOCK_SIZES6]], i32 0, i32 1<br>
>> + // B32: store i32 2, i32* %[[BLOCK_SIZES62]], align 4<br>
>> + // B32: %[[BLOCK_SIZES63:.*]] = getelementptr [3 x i32], [3 x<br>
>> i32]* %[[BLOCK_SIZES6]], i32 0, i32 2<br>
>> + // B32: store i32 4, i32* %[[BLOCK_SIZES63]], align 4<br>
>> + // B64: %[[TMP:.*]] = getelementptr [3 x i64], [3 x i64]*<br>
>> %[[BLOCK_SIZES6]], i32 0, i32 0<br>
>> + // B64: store i64 1, i64* %[[TMP]], align 8<br>
>> + // B64: %[[BLOCK_SIZES62:.*]] = getelementptr [3 x i64], [3 x<br>
>> i64]* %[[BLOCK_SIZES6]], i32 0, i32 1<br>
>> + // B64: store i64 2, i64* %[[BLOCK_SIZES62]], align 8<br>
>> + // B64: %[[BLOCK_SIZES63:.*]] = getelementptr [3 x i64], [3 x<br>
>> i64]* %[[BLOCK_SIZES6]], i32 0, i32 2<br>
>> + // B64: store i64 4, i64* %[[BLOCK_SIZES63]], align 8<br>
>> // COMMON-LABEL: call i32 @__enqueue_kernel_varargs<br>
>> // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVGK6:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)*<br>
>> bitcast ({ i32, i32 } addrspace(1)* [[BLG6]] to i8 addrspace(1)*) to<br>
>> i8 addrspace(4)*), i32 3,<br>
>> - // B32-SAME: i32* %[[TMP1]])<br>
>> - // B64-SAME: i64* %[[TMP1]])<br>
>> + // B32-SAME: i32* %[[TMP]])<br>
>> + // B64-SAME: i64* %[[TMP]])<br>
>> enqueue_kernel(default_queue, flags, ndrange,<br>
>> ^(local void *p1, local void *p2, local void *p3)<br>
>> {<br>
>> return;<br>
>> @@ -223,18 +265,21 @@ kernel void device_side_enqueue(global i<br>
>> // Emits global block literal [[BLG7]] and block kernel<br>
>> [[INVGK7]].<br>
>> // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t*,<br>
>> %opencl.queue_t** %default_queue<br>
>> // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags<br>
>> - // B32: %[[TMP:.*]] = alloca [1 x i32]<br>
>> - // B32: %[[TMP1:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B32: store i32 0, i32* %[[TMP1]], align 4<br>
>> - // B64: %[[TMP:.*]] = alloca [1 x i64]<br>
>> - // B64: %[[TMP1:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[TMP]], i32 0, i32 0<br>
>> - // B64: store i64 4294967296, i64* %[[TMP1]], align 8<br>
>> + // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]*<br>
>> %[[BLOCK_SIZES7]] to i8*<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64<br>
>> 8, i8* nonnull [[LIFETIME_PTR]])<br>
>> + // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x<br>
>> i64]* %[[BLOCK_SIZES7]], i64 0, i64 0<br>
>> + // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(<br>
>> + // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8,<br>
>> i8* nonnull [[LIFETIME_PTR]])<br>
>> + // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]*<br>
>> %[[BLOCK_SIZES7]], i32 0, i32 0<br>
>> + // B32: store i32 0, i32* %[[TMP]], align 4<br>
>> + // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]*<br>
>> %[[BLOCK_SIZES7]], i32 0, i32 0<br>
>> + // B64: store i64 4294967296, i64* %[[TMP]], align 8<br>
>> // COMMON-LABEL: call i32 @__enqueue_kernel_varargs<br>
>> // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]],<br>
>> %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast<br>
>> ({{.*}} [[INVGK7:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),<br>
>> // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)*<br>
>> bitcast ({ i32, i32 } addrspace(1)* [[BLG7]] to i8 addrspace(1)*) to<br>
>> i8 addrspace(4)*), i32 1,<br>
>> - // B32-SAME: i32* %[[TMP1]])<br>
>> - // B64-SAME: i64* %[[TMP1]])<br>
>> + // B32-SAME: i32* %[[TMP]])<br>
>> + // B64-SAME: i64* %[[TMP]])<br>
>> enqueue_kernel(default_queue, flags, ndrange,<br>
>> ^(local void *p) {<br>
>> return;<br>
>> <br>
>> Added:<br>
>> cfe/trunk/test/CodeGenOpenCL/<a href="http://enqueue-kernel-non-entry-block.cl" rel="noreferrer" target="_blank">enqueue-kernel-non-entry-block.cl</a> [3]<br>
>> URL:<br>
>> <br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl?rev=338899&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl?rev=338899&view=auto</a><br>
>> [7]<br>
>> <br>
> ==============================================================================<br>
>> --- cfe/trunk/test/CodeGenOpenCL/<a href="http://enqueue-kernel-non-entry-block.cl" rel="noreferrer" target="_blank">enqueue-kernel-non-entry-block.cl</a><br>
>> [3] (added)<br>
>> +++ cfe/trunk/test/CodeGenOpenCL/<a href="http://enqueue-kernel-non-entry-block.cl" rel="noreferrer" target="_blank">enqueue-kernel-non-entry-block.cl</a><br>
>> [3] Fri Aug 3 08:50:52 2018<br>
>> @@ -0,0 +1,31 @@<br>
>> +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -emit-llvm -o - -triple amdgcn<br>
>> < %s | FileCheck %s --check-prefixes=COMMON,AMDGPU<br>
>> +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -emit-llvm -o - -triple<br>
>> "spir-unknown-unknown" < %s | FileCheck %s<br>
>> --check-prefixes=COMMON,SPIR32<br>
>> +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -emit-llvm -o - -triple<br>
>> "spir64-unknown-unknown" < %s | FileCheck %s<br>
>> --check-prefixes=COMMON,SPIR64<br>
>> +// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -debug-info-kind=limited<br>
>> -emit-llvm -o - -triple amdgcn < %s | FileCheck %s<br>
>> --check-prefixes=CHECK-DEBUG<br>
>> +<br>
>> +// Check that the enqueue_kernel array temporary is in the entry<br>
>> block to avoid<br>
>> +// a dynamic alloca<br>
>> +<br>
>> +typedef struct {int a;} ndrange_t;<br>
>> +<br>
>> +kernel void test(int i) {<br>
>> +// COMMON-LABEL: define {{.*}} void @test<br>
>> +// COMMON-LABEL: entry:<br>
>> +// AMDGPU: %block_sizes = alloca [1 x i64]<br>
>> +// SPIR32: %block_sizes = alloca [1 x i32]<br>
>> +// SPIR64: %block_sizes = alloca [1 x i64]<br>
>> +// COMMON-LABEL: if.then:<br>
>> +// COMMON-NOT: alloca<br>
>> +// CHECK-DEBUG: getelementptr {{.*}} %block_sizes, {{.*}} !dbg !34<br>
>> +// COMMON-LABEL: if.end<br>
>> + queue_t default_queue;<br>
>> + unsigned flags = 0;<br>
>> + ndrange_t ndrange;<br>
>> + if (i)<br>
>> + enqueue_kernel(default_queue, flags, ndrange, ^(local void *a)<br>
>> { }, 32);<br>
>> +}<br>
>> +<br>
>> +// Check that the temporary is scoped to the `if`<br>
>> +<br>
>> +// CHECK-DEBUG: !32 = distinct !DILexicalBlock(scope: !7, file: !1,<br>
>> line: 24)<br>
>> +// CHECK-DEBUG: !34 = !DILocation(line: 25, scope: !32)<br>
>> <br>
>> _______________________________________________<br>
>> cfe-commits mailing list<br>
>> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a> [8]<br>
> <br>
> <br>
> Links:<br>
> ------<br>
> [1] <a href="http://llvm.org/viewvc/llvm-project?rev=338899&amp;view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=338899&amp;view=rev</a><br>
> [2] <a href="https://reviews.llvm.org/D50104" rel="noreferrer" target="_blank">https://reviews.llvm.org/D50104</a><br>
> [3] <a href="http://enqueue-kernel-non-entry-block.cl" rel="noreferrer" target="_blank">http://enqueue-kernel-non-entry-block.cl</a><br>
> [4] <a href="http://cl20-device-side-enqueue.cl" rel="noreferrer" target="_blank">http://cl20-device-side-enqueue.cl</a><br>
> [5]<br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=338899&amp;r1=338898&amp;r2=338899&amp;view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=338899&amp;r1=338898&amp;r2=338899&amp;view=diff</a><br>
> [6]<br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/cl20-device-side-enqueue.cl?rev=338899&amp;r1=338898&amp;r2=338899&amp;view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/cl20-device-side-enqueue.cl?rev=338899&amp;r1=338898&amp;r2=338899&amp;view=diff</a><br>
> [7]<br>
> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl?rev=338899&amp;view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/enqueue-kernel-non-entry-block.cl?rev=338899&amp;view=auto</a><br>
> [8] <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
> [9]<br>
> <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/21898/steps/check-clang%20asan/logs/stdio" rel="noreferrer" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/21898/steps/check-clang%20asan/logs/stdio</a><br>
</blockquote></div></div></div>