|  | 
|  | 1 | +From 05bb2f96fc061cd9419f52c86ef8a0edd8f3ee32 Mon Sep 17 00:00:00 2001 | 
|  | 2 | +From: Alexey Sotkin <alexey.sotkin@intel.com> | 
|  | 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