1// RUN: %clang_cc1 %s -cl-std=CL2.0 -finclude-default-header -emit-llvm -O0 -triple spir-unknown-unknown -o - | FileCheck --check-prefix=SZ32 %s
2// RUN: %clang_cc1 %s -cl-std=CL2.0 -finclude-default-header -emit-llvm -O0 -triple spir64-unknown-unknown -o - | FileCheck --check-prefix=SZ64 --check-prefix=SZ64ONLY %s
3// RUN: %clang_cc1 %s -cl-std=CL2.0 -finclude-default-header -emit-llvm -O0 -triple amdgcn -o - | FileCheck --check-prefix=SZ64 --check-prefix=AMDONLY %s
4// RUN: %clang_cc1 %s -cl-std=CL2.0 -finclude-default-header -emit-llvm -O0 -triple amdgcn---opencl -o - | FileCheck --check-prefix=SZ64 --check-prefix=AMDONLY %s
5
6//SZ32: define{{.*}} i32 @test_ptrtoint_private(i8* %x)
7//SZ32: ptrtoint i8* %{{.*}} to i32
8//SZ64: define{{.*}} i64 @test_ptrtoint_private(i8* %x)
9//SZ64: ptrtoint i8* %{{.*}} to i64
10size_t test_ptrtoint_private(private char* x) {
11  return (size_t)x;
12}
13
14//SZ32: define{{.*}} i32 @test_ptrtoint_global(i8 addrspace(1)* %x)
15//SZ32: ptrtoint i8 addrspace(1)* %{{.*}} to i32
16//SZ64: define{{.*}} i64 @test_ptrtoint_global(i8 addrspace(1)* %x)
17//SZ64: ptrtoint i8 addrspace(1)* %{{.*}} to i64
18intptr_t test_ptrtoint_global(global char* x) {
19  return (intptr_t)x;
20}
21
22//SZ32: define{{.*}} i32 @test_ptrtoint_constant(i8 addrspace(2)* %x)
23//SZ32: ptrtoint i8 addrspace(2)* %{{.*}} to i32
24//SZ64: define{{.*}} i64 @test_ptrtoint_constant(i8 addrspace(2)* %x)
25//SZ64: ptrtoint i8 addrspace(2)* %{{.*}} to i64
26uintptr_t test_ptrtoint_constant(constant char* x) {
27  return (uintptr_t)x;
28}
29
30//SZ32: define{{.*}} i32 @test_ptrtoint_local(i8 addrspace(3)* %x)
31//SZ32: ptrtoint i8 addrspace(3)* %{{.*}} to i32
32//SZ64: define{{.*}} i64 @test_ptrtoint_local(i8 addrspace(3)* %x)
33//SZ64: ptrtoint i8 addrspace(3)* %{{.*}} to i64
34size_t test_ptrtoint_local(local char* x) {
35  return (size_t)x;
36}
37
38//SZ32: define{{.*}} i32 @test_ptrtoint_generic(i8 addrspace(4)* %x)
39//SZ32: ptrtoint i8 addrspace(4)* %{{.*}} to i32
40//SZ64: define{{.*}} i64 @test_ptrtoint_generic(i8 addrspace(4)* %x)
41//SZ64: ptrtoint i8 addrspace(4)* %{{.*}} to i64
42size_t test_ptrtoint_generic(generic char* x) {
43  return (size_t)x;
44}
45
46//SZ32: define{{.*}} i8* @test_inttoptr_private(i32 %x)
47//SZ32: inttoptr i32 %{{.*}} to i8*
48//SZ64: define{{.*}} i8* @test_inttoptr_private(i64 %x)
49//AMDONLY: trunc i64 %{{.*}} to i32
50//AMDONLY: inttoptr i32 %{{.*}} to i8*
51//SZ64ONLY: inttoptr i64 %{{.*}} to i8*
52private char* test_inttoptr_private(size_t x) {
53  return (private char*)x;
54}
55
56//SZ32: define{{.*}} i8 addrspace(1)* @test_inttoptr_global(i32 %x)
57//SZ32: inttoptr i32 %{{.*}} to i8 addrspace(1)*
58//SZ64: define{{.*}} i8 addrspace(1)* @test_inttoptr_global(i64 %x)
59//SZ64: inttoptr i64 %{{.*}} to i8 addrspace(1)*
60global char* test_inttoptr_global(size_t x) {
61  return (global char*)x;
62}
63
64//SZ32: define{{.*}} i8 addrspace(3)* @test_add_local(i8 addrspace(3)* %x, i32 %y)
65//SZ32: getelementptr inbounds i8, i8 addrspace(3)* %{{.*}}, i32
66//SZ64: define{{.*}} i8 addrspace(3)* @test_add_local(i8 addrspace(3)* %x, i64 %y)
67//AMDONLY: trunc i64 %{{.*}} to i32
68//AMDONLY: getelementptr inbounds i8, i8 addrspace(3)* %{{.*}}, i32
69//SZ64ONLY: getelementptr inbounds i8, i8 addrspace(3)* %{{.*}}, i64
70local char* test_add_local(local char* x, ptrdiff_t y) {
71  return x + y;
72}
73
74//SZ32: define{{.*}} i8 addrspace(1)* @test_add_global(i8 addrspace(1)* %x, i32 %y)
75//SZ32: getelementptr inbounds i8, i8 addrspace(1)* %{{.*}}, i32
76//SZ64: define{{.*}} i8 addrspace(1)* @test_add_global(i8 addrspace(1)* %x, i64 %y)
77//SZ64: getelementptr inbounds i8, i8 addrspace(1)* %{{.*}}, i64
78global char* test_add_global(global char* x, ptrdiff_t y) {
79  return x + y;
80}
81
82//SZ32: define{{.*}} i32 @test_sub_local(i8 addrspace(3)* %x, i8 addrspace(3)* %y)
83//SZ32: ptrtoint i8 addrspace(3)* %{{.*}} to i32
84//SZ32: ptrtoint i8 addrspace(3)* %{{.*}} to i32
85//SZ64: define{{.*}} i64 @test_sub_local(i8 addrspace(3)* %x, i8 addrspace(3)* %y)
86//SZ64: ptrtoint i8 addrspace(3)* %{{.*}} to i64
87//SZ64: ptrtoint i8 addrspace(3)* %{{.*}} to i64
88ptrdiff_t test_sub_local(local char* x, local char *y) {
89  return x - y;
90}
91
92//SZ32: define{{.*}} i32 @test_sub_private(i8* %x, i8* %y)
93//SZ32: ptrtoint i8* %{{.*}} to i32
94//SZ32: ptrtoint i8* %{{.*}} to i32
95//SZ64: define{{.*}} i64 @test_sub_private(i8* %x, i8* %y)
96//SZ64: ptrtoint i8* %{{.*}} to i64
97//SZ64: ptrtoint i8* %{{.*}} to i64
98ptrdiff_t test_sub_private(private char* x, private char *y) {
99  return x - y;
100}
101
102//SZ32: define{{.*}} i32 @test_sub_mix(i8* %x, i8 addrspace(4)* %y)
103//SZ32: ptrtoint i8* %{{.*}} to i32
104//SZ32: ptrtoint i8 addrspace(4)* %{{.*}} to i32
105//SZ64: define{{.*}} i64 @test_sub_mix(i8* %x, i8 addrspace(4)* %y)
106//SZ64: ptrtoint i8* %{{.*}} to i64
107//SZ64: ptrtoint i8 addrspace(4)* %{{.*}} to i64
108ptrdiff_t test_sub_mix(private char* x, generic char *y) {
109  return x - y;
110}
111
112