mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 11:35:51 -04:00

Explicit cast of a void pointer to a pointer type in different address space is incorrectly classified as bitcast, which causes invalid bitcast in codegen. The patch fixes that by checking the address space of the source and destination type and set the correct cast kind. Differential Revision: https://reviews.llvm.org/D50003 llvm-svn: 338805
66 lines
2.9 KiB
C++
66 lines
2.9 KiB
C++
// RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - | FileCheck %s
|
|
|
|
#define __private__ __attribute__((address_space(5)))
|
|
|
|
void func_pchar(__private__ char *x);
|
|
void func_pvoid(__private__ void *x);
|
|
void func_pint(__private__ int *x);
|
|
|
|
void test_cast(char *gen_char_ptr, void *gen_void_ptr, int *gen_int_ptr) {
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
|
|
__private__ char *priv_char_ptr = (__private__ char *)gen_char_ptr;
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
|
|
priv_char_ptr = (__private__ char *)gen_void_ptr;
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
|
|
priv_char_ptr = (__private__ char *)gen_int_ptr;
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
|
|
__private__ void *priv_void_ptr = (__private__ void *)gen_char_ptr;
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
|
|
priv_void_ptr = (__private__ void *)gen_void_ptr;
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: store i8 addrspace(5)* %[[cast]]
|
|
priv_void_ptr = (__private__ void *)gen_int_ptr;
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i32 addrspace(5)*
|
|
// CHECK-NEXT: store i32 addrspace(5)* %[[cast]]
|
|
__private__ int *priv_int_ptr = (__private__ int *)gen_void_ptr;
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: call void @_Z10func_pcharPU3AS5c(i8 addrspace(5)* %[[cast]])
|
|
func_pchar((__private__ char *)gen_char_ptr);
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: call void @_Z10func_pcharPU3AS5c(i8 addrspace(5)* %[[cast]])
|
|
func_pchar((__private__ char *)gen_void_ptr);
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: call void @_Z10func_pcharPU3AS5c(i8 addrspace(5)* %[[cast]])
|
|
func_pchar((__private__ char *)gen_int_ptr);
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: call void @_Z10func_pvoidPU3AS5v(i8 addrspace(5)* %[[cast]])
|
|
func_pvoid((__private__ void *)gen_char_ptr);
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: call void @_Z10func_pvoidPU3AS5v(i8 addrspace(5)* %[[cast]])
|
|
func_pvoid((__private__ void *)gen_void_ptr);
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(5)*
|
|
// CHECK-NEXT: call void @_Z10func_pvoidPU3AS5v(i8 addrspace(5)* %[[cast]])
|
|
func_pvoid((__private__ void *)gen_int_ptr);
|
|
|
|
// CHECK: %[[cast:.*]] = addrspacecast i8* %{{.*}} to i32 addrspace(5)*
|
|
// CHECK-NEXT: call void @_Z9func_pintPU3AS5i(i32 addrspace(5)* %[[cast]])
|
|
func_pint((__private__ int *)gen_void_ptr);
|
|
}
|