blob: 5db711a1b377c9acaba59af751cbf15ab72d4eb1 [file] [edit]
// RUN: %clang_cc1 -triple spirv64-intel %s -emit-llvm -o - | FileCheck %s
// Test that function pointer casts properly handle address space conversions
// on targets like spirv64-intel that use a non-default program address space.
void foo() {}
// CHECK-LABEL: define spir_func void @_Z21test_func_to_void_ptrv() addrspace(9)
void test_func_to_void_ptr() {
void *ptr = (void*)foo;
// CHECK: store ptr addrspace(4) addrspacecast (ptr addrspace(9) @_Z3foov to ptr addrspace(4))
}
// CHECK-LABEL: define spir_func void @_Z21test_void_ptr_to_funcv() addrspace(9)
void test_void_ptr_to_func() {
void *ptr = (void*)foo;
void (*fptr)() = (void (*)())ptr;
// CHECK: addrspacecast ptr addrspace(4) %{{.*}} to ptr addrspace(9)
fptr();
}
// CHECK-LABEL: define spir_func void @_Z25cxx_test_func_to_void_ptrv() addrspace(9)
void cxx_test_func_to_void_ptr() {
void *ptr = reinterpret_cast<void*>(foo);
// CHECK: store ptr addrspace(4) addrspacecast (ptr addrspace(9) @_Z3foov to ptr addrspace(4))
}
// CHECK-LABEL: define spir_func void @_Z25cxx_test_void_ptr_to_funcv() addrspace(9)
void cxx_test_void_ptr_to_func() {
void *ptr = reinterpret_cast<void*>(foo);
void (*fptr)() = reinterpret_cast<void (*)()>(ptr);
// CHECK: addrspacecast ptr addrspace(4) %{{.*}} to ptr addrspace(9)
fptr();
}