|
| 1 | +From 05bb2f96fc061cd9419f52c86ef8a0edd8f3ee32 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Alexey Sotkin < [email protected]> |
| 3 | +Date: Thu, 11 Apr 2019 06:18:17 +0000 |
| 4 | +Subject: [PATCH] [OpenCL] Re-fix invalid address space generation for |
| 5 | + clk_event_t arguments of enqueue_kernel builtin function |
| 6 | + |
| 7 | +Summary: |
| 8 | +https://reviews.llvm.org/D53809 fixed wrong address space(assert in debug build) |
| 9 | +generated for event_ret argument. But exactly the same problem exists for |
| 10 | +event_wait_list argument. This patch should fix both. |
| 11 | + |
| 12 | +Reviewers: Anastasia, yaxunl |
| 13 | + |
| 14 | +Reviewed By: Anastasia |
| 15 | + |
| 16 | +Subscribers: kristina, ebevhan, cfe-commits |
| 17 | + |
| 18 | +Differential Revision: https://reviews.llvm.org/D59985 |
| 19 | + |
| 20 | +git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@358151 91177308-0d34-0410-b5e6-96231b3b80d8 |
| 21 | +--- |
| 22 | + lib/CodeGen/CGBuiltin.cpp | 41 ++++++++++++++++++-------- |
| 23 | + test/CodeGenOpenCL/cl20-device-side-enqueue.cl | 4 +-- |
| 24 | + 2 files changed, 30 insertions(+), 15 deletions(-) |
| 25 | + |
| 26 | +diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp |
| 27 | +index ccc6574..8d3805b 100644 |
| 28 | +--- a/lib/CodeGen/CGBuiltin.cpp |
| 29 | ++++ b/lib/CodeGen/CGBuiltin.cpp |
| 30 | +@@ -3666,21 +3666,35 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, |
| 31 | + // Any calls now have event arguments passed. |
| 32 | + if (NumArgs >= 7) { |
| 33 | + llvm::Type *EventTy = ConvertType(getContext().OCLClkEventTy); |
| 34 | +- llvm::Type *EventPtrTy = EventTy->getPointerTo( |
| 35 | ++ llvm::PointerType *EventPtrTy = EventTy->getPointerTo( |
| 36 | + CGM.getContext().getTargetAddressSpace(LangAS::opencl_generic)); |
| 37 | + |
| 38 | + llvm::Value *NumEvents = |
| 39 | + Builder.CreateZExtOrTrunc(EmitScalarExpr(E->getArg(3)), Int32Ty); |
| 40 | +- llvm::Value *EventList = |
| 41 | +- E->getArg(4)->getType()->isArrayType() |
| 42 | +- ? EmitArrayToPointerDecay(E->getArg(4)).getPointer() |
| 43 | +- : EmitScalarExpr(E->getArg(4)); |
| 44 | +- llvm::Value *ClkEvent = EmitScalarExpr(E->getArg(5)); |
| 45 | +- // Convert to generic address space. |
| 46 | +- EventList = Builder.CreatePointerCast(EventList, EventPtrTy); |
| 47 | +- ClkEvent = ClkEvent->getType()->isIntegerTy() |
| 48 | +- ? Builder.CreateBitOrPointerCast(ClkEvent, EventPtrTy) |
| 49 | +- : Builder.CreatePointerCast(ClkEvent, EventPtrTy); |
| 50 | ++ |
| 51 | ++ // Since SemaOpenCLBuiltinEnqueueKernel allows fifth and sixth arguments |
| 52 | ++ // to be a null pointer constant (including `0` literal), we can take it |
| 53 | ++ // into account and emit null pointer directly. |
| 54 | ++ llvm::Value *EventWaitList = nullptr; |
| 55 | ++ if (E->getArg(4)->isNullPointerConstant( |
| 56 | ++ getContext(), Expr::NPC_ValueDependentIsNotNull)) { |
| 57 | ++ EventWaitList = llvm::ConstantPointerNull::get(EventPtrTy); |
| 58 | ++ } else { |
| 59 | ++ EventWaitList = E->getArg(4)->getType()->isArrayType() |
| 60 | ++ ? EmitArrayToPointerDecay(E->getArg(4)).getPointer() |
| 61 | ++ : EmitScalarExpr(E->getArg(4)); |
| 62 | ++ // Convert to generic address space. |
| 63 | ++ EventWaitList = Builder.CreatePointerCast(EventWaitList, EventPtrTy); |
| 64 | ++ } |
| 65 | ++ llvm::Value *EventRet = nullptr; |
| 66 | ++ if (E->getArg(5)->isNullPointerConstant( |
| 67 | ++ getContext(), Expr::NPC_ValueDependentIsNotNull)) { |
| 68 | ++ EventRet = llvm::ConstantPointerNull::get(EventPtrTy); |
| 69 | ++ } else { |
| 70 | ++ EventRet = |
| 71 | ++ Builder.CreatePointerCast(EmitScalarExpr(E->getArg(5)), EventPtrTy); |
| 72 | ++ } |
| 73 | ++ |
| 74 | + auto Info = |
| 75 | + CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(6)); |
| 76 | + llvm::Value *Kernel = |
| 77 | +@@ -3692,8 +3706,9 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, |
| 78 | + QueueTy, Int32Ty, RangeTy, Int32Ty, |
| 79 | + EventPtrTy, EventPtrTy, GenericVoidPtrTy, GenericVoidPtrTy}; |
| 80 | + |
| 81 | +- std::vector<llvm::Value *> Args = {Queue, Flags, Range, NumEvents, |
| 82 | +- EventList, ClkEvent, Kernel, Block}; |
| 83 | ++ std::vector<llvm::Value *> Args = {Queue, Flags, Range, |
| 84 | ++ NumEvents, EventWaitList, EventRet, |
| 85 | ++ Kernel, Block}; |
| 86 | + |
| 87 | + if (NumArgs == 7) { |
| 88 | + // Has events but no variadics. |
| 89 | +diff --git a/test/CodeGenOpenCL/cl20-device-side-enqueue.cl b/test/CodeGenOpenCL/cl20-device-side-enqueue.cl |
| 90 | +index 1566912..db0faa1 100644 |
| 91 | +--- a/test/CodeGenOpenCL/cl20-device-side-enqueue.cl |
| 92 | ++++ b/test/CodeGenOpenCL/cl20-device-side-enqueue.cl |
| 93 | +@@ -107,8 +107,8 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) { |
| 94 | + }); |
| 95 | + |
| 96 | + // COMMON-LABEL: call i32 @__enqueue_kernel_basic_events |
| 97 | +- // COMMON-SAME: (%opencl.queue_t{{.*}}* {{%[0-9]+}}, i32 {{%[0-9]+}}, %struct.ndrange_t* {{.*}}, i32 1, %opencl.clk_event_t{{.*}}* addrspace(4)* {{%[0-9]+}}, %opencl.clk_event_t{{.*}}* addrspace(4)* null, |
| 98 | +- enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, 0, |
| 99 | ++ // COMMON-SAME: (%opencl.queue_t{{.*}}* {{%[0-9]+}}, i32 {{%[0-9]+}}, %struct.ndrange_t* {{.*}}, i32 1, %opencl.clk_event_t{{.*}}* addrspace(4)* null, %opencl.clk_event_t{{.*}}* addrspace(4)* null, |
| 100 | ++ enqueue_kernel(default_queue, flags, ndrange, 1, 0, 0, |
| 101 | + ^(void) { |
| 102 | + return; |
| 103 | + }); |
| 104 | +-- |
| 105 | +1.8.3.1 |
| 106 | + |
0 commit comments