[OpenCL] Clean up and add missing fields for block struct
authorYaxun Liu <Yaxun.Liu@amd.com>
Wed, 4 Oct 2017 20:32:17 +0000 (20:32 +0000)
committerYaxun Liu <Yaxun.Liu@amd.com>
Wed, 4 Oct 2017 20:32:17 +0000 (20:32 +0000)
commit10712d9203a33e3465ea1c81be7c5f5d9bad57a2
tree9074caf27c6cec5465dea611b9390e798fa592b1
parent8c0ff9508da5f02e8ce6580a126a2018c9bf702a
[OpenCL] Clean up and add missing fields for block struct

Currently block is translated to a structure equivalent to

struct Block {
  void *isa;
  int flags;
  int reserved;
  void *invoke;
  void *descriptor;
};
Except invoke, which is the pointer to the block invoke function,
all other fields are useless for OpenCL, which clutter the IR and
also waste memory since the block struct is passed to the block
invoke function as argument.

On the other hand, the size and alignment of the block struct is
not stored in the struct, which causes difficulty to implement
__enqueue_kernel as library function, since the library function
needs to know the size and alignment of the argument which needs
to be passed to the kernel.

This patch removes the useless fields from the block struct and adds
size and align fields. The equivalent block struct will become

struct Block {
  int size;
  int align;
  generic void *invoke;
 /* custom fields */
};
It also changes the pointer to the invoke function to be
a generic pointer since the address space of a function
may not be private on certain targets.

Differential Revision: https://reviews.llvm.org/D37822

llvm-svn: 314932
clang/lib/CodeGen/CGBlocks.cpp
clang/lib/CodeGen/CGOpenCLRuntime.cpp
clang/lib/CodeGen/CGOpenCLRuntime.h
clang/lib/CodeGen/TargetInfo.h
clang/test/CodeGen/blocks-opencl.cl [deleted file]
clang/test/CodeGenOpenCL/blocks.cl
clang/test/CodeGenOpenCL/cl20-device-side-enqueue.cl