diff options
| author | Yaxun Liu <Yaxun.Liu@amd.com> | 2018-04-20 17:01:03 +0000 |
|---|---|---|
| committer | Yaxun Liu <Yaxun.Liu@amd.com> | 2018-04-20 17:01:03 +0000 |
| commit | 4306f2086fe838591f2d1fe041ef73b643aa99ee (patch) | |
| tree | ddedd75da98d4b292b315f7fdfc818077d9b5f9c /clang/test/CodeGenCUDA | |
| parent | e268304122d827396979c61251f2862148ad01c8 (diff) | |
| download | bcm5719-llvm-4306f2086fe838591f2d1fe041ef73b643aa99ee.tar.gz bcm5719-llvm-4306f2086fe838591f2d1fe041ef73b643aa99ee.zip | |
[CUDA] Set LLVM calling convention for CUDA kernel
Some targets need special LLVM calling convention for CUDA kernel.
This patch does that through a TargetCodeGenInfo hook.
It only affects amdgcn target.
Patch by Greg Rodgers.
Revised and lit tests added by Yaxun Liu.
Differential Revision: https://reviews.llvm.org/D45223
llvm-svn: 330447
Diffstat (limited to 'clang/test/CodeGenCUDA')
| -rw-r--r-- | clang/test/CodeGenCUDA/kernel-amdgcn.cu | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/test/CodeGenCUDA/kernel-amdgcn.cu b/clang/test/CodeGenCUDA/kernel-amdgcn.cu new file mode 100644 index 00000000000..ffa6c9549f0 --- /dev/null +++ b/clang/test/CodeGenCUDA/kernel-amdgcn.cu @@ -0,0 +1,41 @@ +// RUN: %clang_cc1 -triple amdgcn -fcuda-is-device -emit-llvm %s -o - | FileCheck %s +#include "Inputs/cuda.h" + +// CHECK: define amdgpu_kernel void @_ZN1A6kernelEv +class A { +public: + static __global__ void kernel(){} +}; + +// CHECK: define void @_Z10non_kernelv +__device__ void non_kernel(){} + +// CHECK: define amdgpu_kernel void @_Z6kerneli +__global__ void kernel(int x) { + non_kernel(); +} + +// CHECK: define amdgpu_kernel void @_Z11EmptyKernelIvEvv +template <typename T> +__global__ void EmptyKernel(void) {} + +struct Dummy { + /// Type definition of the EmptyKernel kernel entry point + typedef void (*EmptyKernelPtr)(); + EmptyKernelPtr Empty() { return EmptyKernel<void>; } +}; + +// CHECK: define amdgpu_kernel void @_Z15template_kernelI1AEvT_ +template<class T> +__global__ void template_kernel(T x) {} + +void launch(void *f); + +int main() { + Dummy D; + launch((void*)A::kernel); + launch((void*)kernel); + launch((void*)template_kernel<A>); + launch((void*)D.Empty()); + return 0; +} |

