[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / llvm.amdgcn.implicitarg.ptr.ll
blob0589da71fd62a6a0433a059c26e8b1d0357ac1a7
1 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=kaveri -mattr=-code-object-v3 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,HSA %s
2 ; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -mattr=-code-object-v3 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,MESA %s
4 ; GCN-LABEL: {{^}}kernel_implicitarg_ptr_empty:
5 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
7 ; HSA: kernarg_segment_byte_size = 0
8 ; MESA: kernarg_segment_byte_size = 16
10 ; HSA: s_load_dword s0, s[4:5], 0x0
11 define amdgpu_kernel void @kernel_implicitarg_ptr_empty() #0 {
12   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
13   %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
14   %load = load volatile i32, i32 addrspace(4)* %cast
15   ret void
18 ; GCN-LABEL: {{^}}opencl_kernel_implicitarg_ptr_empty:
19 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
21 ; HSA: kernarg_segment_byte_size = 48
22 ; MESA: kernarg_segment_byte_size = 16
24 ; HSA: s_load_dword s0, s[4:5], 0x0
25 define amdgpu_kernel void @opencl_kernel_implicitarg_ptr_empty() #1 {
26   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
27   %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
28   %load = load volatile i32, i32 addrspace(4)* %cast
29   ret void
32 ; GCN-LABEL: {{^}}kernel_implicitarg_ptr:
33 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
35 ; HSA: kernarg_segment_byte_size = 112
36 ; MESA: kernarg_segment_byte_size = 128
38 ; HSA: s_load_dword s0, s[4:5], 0x1c
39 define amdgpu_kernel void @kernel_implicitarg_ptr([112 x i8]) #0 {
40   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
41   %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
42   %load = load volatile i32, i32 addrspace(4)* %cast
43   ret void
46 ; GCN-LABEL: {{^}}opencl_kernel_implicitarg_ptr:
47 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
49 ; HSA: kernarg_segment_byte_size = 160
50 ; MESA: kernarg_segment_byte_size = 128
52 ; HSA: s_load_dword s0, s[4:5], 0x1c
53 define amdgpu_kernel void @opencl_kernel_implicitarg_ptr([112 x i8]) #1 {
54   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
55   %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
56   %load = load volatile i32, i32 addrspace(4)* %cast
57   ret void
60 ; GCN-LABEL: {{^}}func_implicitarg_ptr:
61 ; GCN: s_waitcnt
62 ; MESA: v_mov_b32_e32 v0, s4
63 ; MESA: v_mov_b32_e32 v1, s5
64 ; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
65 ; HSA: v_mov_b32_e32 v0, s4
66 ; HSA: v_mov_b32_e32 v1, s5
67 ; HSA: flat_load_dword v0, v[0:1]
68 ; GCN-NEXT: s_waitcnt
69 ; GCN-NEXT: s_setpc_b64
70 define void @func_implicitarg_ptr() #0 {
71   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
72   %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
73   %load = load volatile i32, i32 addrspace(4)* %cast
74   ret void
77 ; GCN-LABEL: {{^}}opencl_func_implicitarg_ptr:
78 ; GCN: s_waitcnt
79 ; MESA: v_mov_b32_e32 v0, s4
80 ; MESA: v_mov_b32_e32 v1, s5
81 ; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
82 ; HSA: v_mov_b32_e32 v0, s4
83 ; HSA: v_mov_b32_e32 v1, s5
84 ; HSA: flat_load_dword v0, v[0:1]
85 ; GCN-NEXT: s_waitcnt
86 ; GCN-NEXT: s_setpc_b64
87 define void @opencl_func_implicitarg_ptr() #0 {
88   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
89   %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
90   %load = load volatile i32, i32 addrspace(4)* %cast
91   ret void
94 ; GCN-LABEL: {{^}}kernel_call_implicitarg_ptr_func_empty:
95 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
96 ; HSA: kernarg_segment_byte_size = 0
97 ; MESA: kernarg_segment_byte_size = 16
98 ; GCN-NOT: s[4:5]
99 ; GCN-NOT: s4
100 ; GCN-NOT: s5
101 ; GCN: s_swappc_b64
102 define amdgpu_kernel void @kernel_call_implicitarg_ptr_func_empty() #0 {
103   call void @func_implicitarg_ptr()
104   ret void
107 ; GCN-LABEL: {{^}}opencl_kernel_call_implicitarg_ptr_func_empty:
108 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
109 ; HSA: kernarg_segment_byte_size = 48
110 ; MESA: kernarg_segment_byte_size = 16
111 ; GCN-NOT: s[4:5]
112 ; GCN-NOT: s4
113 ; GCN-NOT: s5
114 ; GCN: s_swappc_b64
115 define amdgpu_kernel void @opencl_kernel_call_implicitarg_ptr_func_empty() #1 {
116   call void @func_implicitarg_ptr()
117   ret void
120 ; GCN-LABEL: {{^}}kernel_call_implicitarg_ptr_func:
121 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
122 ; HSA: kernarg_segment_byte_size = 112
123 ; MESA: kernarg_segment_byte_size = 128
125 ; HSA: s_add_u32 s4, s4, 0x70
126 ; MESA: s_add_u32 s4, s4, 0x70
128 ; GCN: s_addc_u32 s5, s5, 0{{$}}
129 ; GCN: s_swappc_b64
130 define amdgpu_kernel void @kernel_call_implicitarg_ptr_func([112 x i8]) #0 {
131   call void @func_implicitarg_ptr()
132   ret void
135 ; GCN-LABEL: {{^}}opencl_kernel_call_implicitarg_ptr_func:
136 ; GCN: enable_sgpr_kernarg_segment_ptr = 1
137 ; HSA: kernarg_segment_byte_size = 160
138 ; MESA: kernarg_segment_byte_size = 128
140 ; GCN: s_add_u32 s4, s4, 0x70
141 ; GCN: s_addc_u32 s5, s5, 0{{$}}
142 ; GCN: s_swappc_b64
143 define amdgpu_kernel void @opencl_kernel_call_implicitarg_ptr_func([112 x i8]) #1 {
144   call void @func_implicitarg_ptr()
145   ret void
148 ; GCN-LABEL: {{^}}func_call_implicitarg_ptr_func:
149 ; GCN-NOT: s4
150 ; GCN-NOT: s5
151 ; GCN-NOT: s[4:5]
152 define void @func_call_implicitarg_ptr_func() #0 {
153   call void @func_implicitarg_ptr()
154   ret void
157 ; GCN-LABEL: {{^}}opencl_func_call_implicitarg_ptr_func:
158 ; GCN-NOT: s4
159 ; GCN-NOT: s5
160 ; GCN-NOT: s[4:5]
161 define void @opencl_func_call_implicitarg_ptr_func() #0 {
162   call void @func_implicitarg_ptr()
163   ret void
166 ; GCN-LABEL: {{^}}func_kernarg_implicitarg_ptr:
167 ; GCN: s_waitcnt
168 ; MESA-DAG: v_mov_b32_e32 v0, s4
169 ; MESA-DAG: v_mov_b32_e32 v1, s5
170 ; MESA-DAG: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
171 ; MESA: v_mov_b32_e32 v0, s6
172 ; MESA: v_mov_b32_e32 v1, s7
173 ; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
175 ; HSA: v_mov_b32_e32 v0, s4
176 ; HSA: v_mov_b32_e32 v1, s5
177 ; HSA: flat_load_dword v0, v[0:1]
178 ; HSA: v_mov_b32_e32 v0, s6
179 ; HSA: v_mov_b32_e32 v1, s7
180 ; HSA: flat_load_dword v0, v[0:1]
182 ; GCN: s_waitcnt vmcnt(0)
183 define void @func_kernarg_implicitarg_ptr() #0 {
184   %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr()
185   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
186   %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)*
187   %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
188   %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr
189   %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg
190   ret void
193 ; GCN-LABEL: {{^}}opencl_func_kernarg_implicitarg_ptr:
194 ; GCN: s_waitcnt
195 ; MESA-DAG: v_mov_b32_e32 v0, s4
196 ; MESA-DAG: v_mov_b32_e32 v1, s5
197 ; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
198 ; MESA-DAG: v_mov_b32_e32 v0, s6
199 ; MESA-DAG: v_mov_b32_e32 v1, s7
200 ; MESA: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
203 ; HSA: v_mov_b32_e32 v0, s4
204 ; HSA: v_mov_b32_e32 v1, s5
205 ; HSA: flat_load_dword v0, v[0:1]
207 ; HSA: v_mov_b32_e32 v0, s6
208 ; HSA: v_mov_b32_e32 v1, s7
209 ; HSA: flat_load_dword v0, v[0:1]
211 ; GCN: s_waitcnt vmcnt(0)
212 define void @opencl_func_kernarg_implicitarg_ptr() #0 {
213   %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr()
214   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
215   %cast.kernarg.segment.ptr = bitcast i8 addrspace(4)* %kernarg.segment.ptr to i32 addrspace(4)*
216   %cast.implicitarg = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
217   %load0 = load volatile i32, i32 addrspace(4)* %cast.kernarg.segment.ptr
218   %load1 = load volatile i32, i32 addrspace(4)* %cast.implicitarg
219   ret void
222 ; GCN-LABEL: {{^}}kernel_call_kernarg_implicitarg_ptr_func:
223 ; GCN: s_add_u32 s6, s4, 0x70
224 ; GCN: s_addc_u32 s7, s5, 0
225 ; GCN: s_swappc_b64
226 define amdgpu_kernel void @kernel_call_kernarg_implicitarg_ptr_func([112 x i8]) #0 {
227   call void @func_kernarg_implicitarg_ptr()
228   ret void
231 ; GCN-LABEL: {{^}}kernel_implicitarg_no_struct_align_padding:
232 ; HSA: kernarg_segment_byte_size = 120
233 ; MESA: kernarg_segment_byte_size = 84
234 ; GCN: kernarg_segment_alignment = 6
235 define amdgpu_kernel void @kernel_implicitarg_no_struct_align_padding(<16 x i32>, i32) #1 {
236   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
237   %cast = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
238   %load = load volatile i32, i32 addrspace(4)* %cast
239   ret void
242 declare i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #2
243 declare i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #2
245 attributes #0 = { nounwind noinline }
246 attributes #1 = { nounwind noinline "amdgpu-implicitarg-num-bytes"="48" }
247 attributes #2 = { nounwind readnone speculatable }