1 // RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - | FileCheck %s
2 
3 #define __private__ __attribute__((address_space(5)))
4 
5 void func_pchar(__private__ char *x);
6 void func_pvoid(__private__ void *x);
7 void func_pint(__private__ int *x);
8 
9 class Base {
10 };
11 
12 class Derived : public Base {
13 };
14 
fn(Derived * p)15 void fn(Derived *p) {
16   __private__ Base *b = (__private__ Base *)p;
17 }
18 
test_cast(char * gen_char_ptr,void * gen_void_ptr,int * gen_int_ptr)19 void test_cast(char *gen_char_ptr, void *gen_void_ptr, int *gen_int_ptr) {
20   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
21   // CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
22   __private__ char *priv_char_ptr = (__private__ char *)gen_char_ptr;
23 
24   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
25   // CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
26   priv_char_ptr = (__private__ char *)gen_void_ptr;
27 
28   // CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
29   // CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
30   priv_char_ptr = (__private__ char *)gen_int_ptr;
31 
32   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
33   // CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
34   __private__ void *priv_void_ptr = (__private__ void *)gen_char_ptr;
35 
36   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
37   // CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
38   priv_void_ptr = (__private__ void *)gen_void_ptr;
39 
40   // CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
41   // CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
42   priv_void_ptr = (__private__ void *)gen_int_ptr;
43 
44   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i32 addrspace(5)*
45   // CHECK-NEXT: store i32 addrspace(5)* %[[cast]]
46   __private__ int *priv_int_ptr = (__private__ int *)gen_void_ptr;
47 
48   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
49   // CHECK-NEXT: call void @_Z10func_pcharPU3AS5c(i8 addrspace(5)* %[[cast]])
50   func_pchar((__private__ char *)gen_char_ptr);
51 
52   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
53   // CHECK-NEXT: call void @_Z10func_pcharPU3AS5c(i8 addrspace(5)* %[[cast]])
54   func_pchar((__private__ char *)gen_void_ptr);
55 
56   // CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
57   // CHECK-NEXT: call void @_Z10func_pcharPU3AS5c(i8 addrspace(5)* %[[cast]])
58   func_pchar((__private__ char *)gen_int_ptr);
59 
60   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
61   // CHECK-NEXT: call void @_Z10func_pvoidPU3AS5v(i8 addrspace(5)* %[[cast]])
62   func_pvoid((__private__ void *)gen_char_ptr);
63 
64   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
65   // CHECK-NEXT: call void @_Z10func_pvoidPU3AS5v(i8 addrspace(5)* %[[cast]])
66   func_pvoid((__private__ void *)gen_void_ptr);
67 
68   // CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
69   // CHECK-NEXT: call void @_Z10func_pvoidPU3AS5v(i8 addrspace(5)* %[[cast]])
70   func_pvoid((__private__ void *)gen_int_ptr);
71 
72   // CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i32 addrspace(5)*
73   // CHECK-NEXT: call void @_Z9func_pintPU3AS5i(i32 addrspace(5)* %[[cast]])
74   func_pint((__private__ int *)gen_void_ptr);
75 }
76