Default address space (applies when no explicit address space was specified) maps to generic (4) address space. Added SYCL named address spaces `sycl_global`, `sycl_local` and `sycl_private` defined as sub-sets of the default address space. Static variables without address space now reside in global address space when compile for SPIR target, unless they have an explicit address space qualifier in source code. Differential Revision: https://reviews.llvm.org/D89909
75 lines
3.7 KiB
C++
75 lines
3.7 KiB
C++
// RUN: %clang_cc1 -triple spir64 -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
|
|
|
|
// CHECK: @_ZZ4testvE3foo = internal addrspace(1) constant i32 66, align 4
|
|
// CHECK: @[[STR:[.a-zA-Z0-9_]+]] = private unnamed_addr addrspace(1) constant [14 x i8] c"Hello, world!\00", align 1
|
|
|
|
// CHECK-LABEL: @_Z4testv
|
|
void test() {
|
|
static const int foo = 0x42;
|
|
|
|
// CHECK: %i.ascast = addrspacecast i32* %i to i32 addrspace(4)*
|
|
// CHECK: %[[ARR:[a-zA-Z0-9]+]] = alloca [42 x i32]
|
|
// CHECK: %[[ARR]].ascast = addrspacecast [42 x i32]* %[[ARR]] to [42 x i32] addrspace(4)*
|
|
|
|
int i = 0;
|
|
int *pptr = &i;
|
|
// CHECK: store i32 addrspace(4)* %i.ascast, i32 addrspace(4)* addrspace(4)* %pptr.ascast
|
|
bool is_i_ptr = (pptr == &i);
|
|
// CHECK: %[[VALPPTR:[0-9]+]] = load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* %pptr.ascast
|
|
// CHECK: %cmp{{[0-9]*}} = icmp eq i32 addrspace(4)* %[[VALPPTR]], %i.ascast
|
|
*pptr = foo;
|
|
|
|
int var23 = 23;
|
|
char *cp = (char *)&var23;
|
|
*cp = 41;
|
|
// CHECK: store i32 23, i32 addrspace(4)* %[[VAR:[a-zA-Z0-9.]+]]
|
|
// CHECK: [[VARCAST:%.*]] = bitcast i32 addrspace(4)* %[[VAR]] to i8 addrspace(4)*
|
|
// CHECK: store i8 addrspace(4)* [[VARCAST]], i8 addrspace(4)* addrspace(4)* %{{.*}}
|
|
|
|
int arr[42];
|
|
char *cpp = (char *)arr;
|
|
*cpp = 43;
|
|
// CHECK: [[ARRDECAY:%.*]] = getelementptr inbounds [42 x i32], [42 x i32] addrspace(4)* %[[ARR]].ascast, i64 0, i64 0
|
|
// CHECK: [[ARRCAST:%.*]] = bitcast i32 addrspace(4)* [[ARRDECAY]] to i8 addrspace(4)*
|
|
// CHECK: store i8 addrspace(4)* [[ARRCAST]], i8 addrspace(4)* addrspace(4)* %{{.*}}
|
|
|
|
int *aptr = arr + 10;
|
|
if (aptr < arr + sizeof(arr))
|
|
*aptr = 44;
|
|
// CHECK: %[[VALAPTR:.*]] = load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* %aptr.ascast
|
|
// CHECK: %[[ARRDCY2:.*]] = getelementptr inbounds [42 x i32], [42 x i32] addrspace(4)* %[[ARR]].ascast, i64 0, i64 0
|
|
// CHECK: %[[ADDPTR:.*]] = getelementptr inbounds i32, i32 addrspace(4)* %[[ARRDCY2]], i64 168
|
|
// CHECK: %cmp{{[0-9]+}} = icmp ult i32 addrspace(4)* %[[VALAPTR]], %[[ADDPTR]]
|
|
|
|
const char *str = "Hello, world!";
|
|
// CHECK: store i8 addrspace(4)* getelementptr inbounds ([14 x i8], [14 x i8] addrspace(4)* addrspacecast ([14 x i8] addrspace(1)* @[[STR]] to [14 x i8] addrspace(4)*), i64 0, i64 0), i8 addrspace(4)* addrspace(4)* %[[STRVAL:[a-zA-Z0-9]+]].ascast, align 8
|
|
|
|
i = str[0];
|
|
|
|
const char *phi_str = i > 2 ? str : "Another hello world!";
|
|
(void)phi_str;
|
|
// CHECK: %[[COND:[a-zA-Z0-9]+]] = icmp sgt i32 %{{.*}}, 2
|
|
// CHECK: br i1 %[[COND]], label %[[CONDTRUE:[.a-zA-Z0-9]+]], label %[[CONDFALSE:[.a-zA-Z0-9]+]]
|
|
|
|
// CHECK: [[CONDTRUE]]:
|
|
// CHECK-NEXT: %[[VALTRUE:[a-zA-Z0-9]+]] = load i8 addrspace(4)*, i8 addrspace(4)* addrspace(4)* %str.ascast
|
|
// CHECK-NEXT: br label %[[CONDEND:[.a-zA-Z0-9]+]]
|
|
|
|
// CHECK: [[CONDFALSE]]:
|
|
|
|
// CHECK: [[CONDEND]]:
|
|
// CHECK-NEXT: phi i8 addrspace(4)* [ %[[VALTRUE]], %[[CONDTRUE]] ], [ getelementptr inbounds ([21 x i8], [21 x i8] addrspace(4)* addrspacecast ([21 x i8] addrspace(1)* @{{.*}} to [21 x i8] addrspace(4)*), i64 0, i64 0), %[[CONDFALSE]] ]
|
|
|
|
const char *select_null = i > 2 ? "Yet another Hello world" : nullptr;
|
|
(void)select_null;
|
|
// CHECK: select i1 %{{.*}}, i8 addrspace(4)* getelementptr inbounds ([24 x i8], [24 x i8] addrspace(4)* addrspacecast ([24 x i8] addrspace(1)* @{{.*}} to [24 x i8] addrspace(4)*), i64 0, i64 0)
|
|
|
|
const char *select_str_trivial1 = true ? str : "Another hello world!";
|
|
(void)select_str_trivial1;
|
|
// CHECK: %[[TRIVIALTRUE:[a-zA-Z0-9]+]] = load i8 addrspace(4)*, i8 addrspace(4)* addrspace(4)* %[[STRVAL]]
|
|
// CHECK: store i8 addrspace(4)* %[[TRIVIALTRUE]], i8 addrspace(4)* addrspace(4)* %{{.*}}, align 8
|
|
|
|
const char *select_str_trivial2 = false ? str : "Another hello world!";
|
|
(void)select_str_trivial2;
|
|
}
|