1 ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
2 ; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,VI %s
4 ; GCN-LABEL: {{^}}store_global_hi_v2i16:
7 ; GFX9-NEXT: global_store_short_d16_hi v[0:1], v2, off
9 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
10 ; VI-NEXT: flat_store_short v[0:1], v2
13 ; GCN-NEXT: s_setpc_b64
14 define void @store_global_hi_v2i16(i16 addrspace(1)* %out, i32 %arg) #0 {
16 ; FIXME: ABI for pre-gfx9
17 %value = bitcast i32 %arg to <2 x i16>
18 %hi = extractelement <2 x i16> %value, i32 1
19 store i16 %hi, i16 addrspace(1)* %out
23 ; GCN-LABEL: {{^}}store_global_hi_v2f16:
26 ; GFX9-NEXT: global_store_short_d16_hi v[0:1], v2, off
28 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
29 ; VI-NEXT: flat_store_short v[0:1], v2
32 ; GCN-NEXT: s_setpc_b64
33 define void @store_global_hi_v2f16(half addrspace(1)* %out, i32 %arg) #0 {
35 ; FIXME: ABI for pre-gfx9
36 %value = bitcast i32 %arg to <2 x half>
37 %hi = extractelement <2 x half> %value, i32 1
38 store half %hi, half addrspace(1)* %out
42 ; GCN-LABEL: {{^}}store_global_hi_i32_shift:
45 ; GFX9-NEXT: global_store_short_d16_hi v[0:1], v2, off
47 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
48 ; VI-NEXT: flat_store_short v[0:1], v2
51 ; GCN-NEXT: s_setpc_b64
52 define void @store_global_hi_i32_shift(i16 addrspace(1)* %out, i32 %value) #0 {
54 %hi32 = lshr i32 %value, 16
55 %hi = trunc i32 %hi32 to i16
56 store i16 %hi, i16 addrspace(1)* %out
60 ; GCN-LABEL: {{^}}store_global_hi_v2i16_i8:
63 ; GFX9-NEXT: global_store_byte_d16_hi v[0:1], v2, off
65 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
66 ; VI-NEXT: flat_store_byte v[0:1], v2
69 ; GCN-NEXT: s_setpc_b64
70 define void @store_global_hi_v2i16_i8(i8 addrspace(1)* %out, i32 %arg) #0 {
72 %value = bitcast i32 %arg to <2 x i16>
73 %hi = extractelement <2 x i16> %value, i32 1
74 %trunc = trunc i16 %hi to i8
75 store i8 %trunc, i8 addrspace(1)* %out
79 ; GCN-LABEL: {{^}}store_global_hi_i8_shift:
82 ; GFX9-NEXT: global_store_byte_d16_hi v[0:1], v2, off
84 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
85 ; VI-NEXT: flat_store_byte v[0:1], v2
88 ; GCN-NEXT: s_setpc_b64
89 define void @store_global_hi_i8_shift(i8 addrspace(1)* %out, i32 %value) #0 {
91 %hi32 = lshr i32 %value, 16
92 %hi = trunc i32 %hi32 to i8
93 store i8 %hi, i8 addrspace(1)* %out
97 ; GCN-LABEL: {{^}}store_global_hi_v2i16_max_offset:
99 ; GFX9-NEXT: global_store_short_d16_hi v[0:1], v2, off offset:4094
101 ; VI-DAG: v_add_i32_e32
102 ; VI-DAG: v_addc_u32_e32
103 ; VI-DAG: v_lshrrev_b32_e32 v2, 16, v2
105 ; VI: flat_store_short v[0:1], v2{{$}}
106 ; GCN-NEXT: s_waitcnt
107 ; GCN-NEXT: s_setpc_b64
108 define void @store_global_hi_v2i16_max_offset(i16 addrspace(1)* %out, i32 %arg) #0 {
110 ; FIXME: ABI for pre-gfx9
111 %value = bitcast i32 %arg to <2 x i16>
112 %hi = extractelement <2 x i16> %value, i32 1
113 %gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i64 2047
114 store i16 %hi, i16 addrspace(1)* %gep
118 ; GCN-LABEL: {{^}}store_global_hi_v2i16_min_offset:
120 ; GFX9-NEXT: global_store_short_d16_hi v[0:1], v2, off offset:-4096{{$}}
122 ; VI-DAG: v_add_i32_e32
123 ; VI-DAG: v_addc_u32_e32
124 ; VI-DAG: v_lshrrev_b32_e32 v2, 16, v2
126 ; VI: flat_store_short v[0:1], v{{[0-9]$}}
127 ; GCN-NEXT: s_waitcnt
128 ; GCN-NEXT: s_setpc_b64
129 define void @store_global_hi_v2i16_min_offset(i16 addrspace(1)* %out, i32 %arg) #0 {
131 %value = bitcast i32 %arg to <2 x i16>
132 %hi = extractelement <2 x i16> %value, i32 1
133 %gep = getelementptr inbounds i16, i16 addrspace(1)* %out, i64 -2048
134 store i16 %hi, i16 addrspace(1)* %gep
138 ; GCN-LABEL: {{^}}store_global_hi_v2i16_i8_max_offset:
140 ; GFX9-NEXT: global_store_byte_d16_hi v[0:1], v2, off offset:4095
142 ; VI-DAG: v_add_i32_e32
143 ; VI-DAG: v_addc_u32_e32
144 ; VI-DAG: v_lshrrev_b32_e32 v2, 16, v2
145 ; VI: flat_store_byte v[0:1], v{{[0-9]$}}
147 ; GCN-NEXT: s_waitcnt
148 ; GCN-NEXT: s_setpc_b64
149 define void @store_global_hi_v2i16_i8_max_offset(i8 addrspace(1)* %out, i32 %arg) #0 {
151 %value = bitcast i32 %arg to <2 x i16>
152 %hi = extractelement <2 x i16> %value, i32 1
153 %trunc = trunc i16 %hi to i8
154 %gep = getelementptr inbounds i8, i8 addrspace(1)* %out, i64 4095
155 store i8 %trunc, i8 addrspace(1)* %gep
159 ; GCN-LABEL: {{^}}store_global_hi_v2i16_i8_min_offset:
161 ; GFX9-NEXT: global_store_byte_d16_hi v[0:1], v2, off offset:-4095
163 ; VI-DAG: v_add_i32_e32
164 ; VI-DAG: v_addc_u32_e32
165 ; VI-DAG: v_lshrrev_b32_e32 v2, 16, v2
167 ; VI: flat_store_byte v[0:1], v{{[0-9]$}}
168 ; GCN-NEXT: s_waitcnt
169 ; GCN-NEXT: s_setpc_b64
170 define void @store_global_hi_v2i16_i8_min_offset(i8 addrspace(1)* %out, i32 %arg) #0 {
172 %value = bitcast i32 %arg to <2 x i16>
173 %hi = extractelement <2 x i16> %value, i32 1
174 %trunc = trunc i16 %hi to i8
175 %gep = getelementptr inbounds i8, i8 addrspace(1)* %out, i64 -4095
176 store i8 %trunc, i8 addrspace(1)* %gep
180 ; GCN-LABEL: {{^}}store_flat_hi_v2i16:
183 ; GFX9-NEXT: flat_store_short_d16_hi v[0:1], v2{{$}}
185 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
186 ; VI-NEXT: flat_store_short v[0:1], v2
188 ; GCN-NEXT: s_waitcnt
189 ; GCN-NEXT: s_setpc_b64
190 define void @store_flat_hi_v2i16(i16 addrspace(4)* %out, i32 %arg) #0 {
192 %value = bitcast i32 %arg to <2 x i16>
193 %hi = extractelement <2 x i16> %value, i32 1
194 store i16 %hi, i16 addrspace(4)* %out
198 ; GCN-LABEL: {{^}}store_flat_hi_v2f16:
201 ; GFX9-NEXT: flat_store_short_d16_hi v[0:1], v2{{$}}
203 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
204 ; VI-NEXT: flat_store_short v[0:1], v2
206 ; GCN-NEXT: s_waitcnt
207 ; GCN-NEXT: s_setpc_b64
208 define void @store_flat_hi_v2f16(half addrspace(4)* %out, i32 %arg) #0 {
210 %value = bitcast i32 %arg to <2 x half>
211 %hi = extractelement <2 x half> %value, i32 1
212 store half %hi, half addrspace(4)* %out
216 ; GCN-LABEL: {{^}}store_flat_hi_i32_shift:
219 ; GFX9-NEXT: flat_store_short_d16_hi v[0:1], v2{{$}}
221 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
222 ; VI-NEXT: flat_store_short v[0:1], v2
224 ; GCN-NEXT: s_waitcnt
225 ; GCN-NEXT: s_setpc_b64
226 define void @store_flat_hi_i32_shift(i16 addrspace(4)* %out, i32 %value) #0 {
228 %hi32 = lshr i32 %value, 16
229 %hi = trunc i32 %hi32 to i16
230 store i16 %hi, i16 addrspace(4)* %out
234 ; GCN-LABEL: {{^}}store_flat_hi_v2i16_i8:
237 ; GFX9-NEXT: flat_store_byte_d16_hi v[0:1], v2{{$}}
239 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
240 ; VI-NEXT: flat_store_byte v[0:1], v2
242 ; GCN-NEXT: s_waitcnt
243 ; GCN-NEXT: s_setpc_b64
244 define void @store_flat_hi_v2i16_i8(i8 addrspace(4)* %out, i32 %arg) #0 {
246 %value = bitcast i32 %arg to <2 x i16>
247 %hi = extractelement <2 x i16> %value, i32 1
248 %trunc = trunc i16 %hi to i8
249 store i8 %trunc, i8 addrspace(4)* %out
253 ; GCN-LABEL: {{^}}store_flat_hi_i8_shift:
256 ; GFX9-NEXT: flat_store_byte_d16_hi v[0:1], v2{{$}}
258 ; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2
259 ; VI-NEXT: flat_store_byte v[0:1], v2
261 ; GCN-NEXT: s_waitcnt
262 ; GCN-NEXT: s_setpc_b64
263 define void @store_flat_hi_i8_shift(i8 addrspace(4)* %out, i32 %value) #0 {
265 %hi32 = lshr i32 %value, 16
266 %hi = trunc i32 %hi32 to i8
267 store i8 %hi, i8 addrspace(4)* %out
271 ; GCN-LABEL: {{^}}store_flat_hi_v2i16_max_offset:
273 ; GFX9-NEXT: flat_store_short_d16_hi v[0:1], v2 offset:4094{{$}}
275 ; VI-DAG: v_add_i32_e32
276 ; VI-DAG: v_addc_u32_e32
277 ; VI-DAG: v_lshrrev_b32_e32 v2, 16, v2
278 ; VI: flat_store_short v[0:1], v2{{$}}
279 ; GCN-NEXT: s_waitcnt
280 ; GCN-NEXT: s_setpc_b64
281 define void @store_flat_hi_v2i16_max_offset(i16 addrspace(4)* %out, i32 %arg) #0 {
283 %value = bitcast i32 %arg to <2 x i16>
284 %hi = extractelement <2 x i16> %value, i32 1
285 %gep = getelementptr inbounds i16, i16 addrspace(4)* %out, i64 2047
286 store i16 %hi, i16 addrspace(4)* %gep
290 ; GCN-LABEL: {{^}}store_flat_hi_v2i16_neg_offset:
293 ; GCN: v_addc_u32_e32
295 ; GFX9-NEXT: flat_store_short_d16_hi v[0:1], v2{{$}}
296 ; VI: flat_store_short v[0:1], v2{{$}}
297 ; GCN-NEXT: s_waitcnt
298 ; GCN-NEXT: s_setpc_b64
299 define void @store_flat_hi_v2i16_neg_offset(i16 addrspace(4)* %out, i32 %arg) #0 {
301 %value = bitcast i32 %arg to <2 x i16>
302 %hi = extractelement <2 x i16> %value, i32 1
303 %gep = getelementptr inbounds i16, i16 addrspace(4)* %out, i64 -1023
304 store i16 %hi, i16 addrspace(4)* %gep
308 ; GCN-LABEL: {{^}}store_flat_hi_v2i16_i8_max_offset:
310 ; GFX9-NEXT: flat_store_byte_d16_hi v[0:1], v2 offset:4095{{$}}
312 ; VI-DAG: v_lshrrev_b32_e32 v2, 16, v2
313 ; VI-DAG: v_add_i32_e32
314 ; VI-DAG: v_addc_u32_e32
315 ; VI: flat_store_byte v[0:1], v2{{$}}
316 ; GCN-NEXT: s_waitcnt
317 ; GCN-NEXT: s_setpc_b64
318 define void @store_flat_hi_v2i16_i8_max_offset(i8 addrspace(4)* %out, i32 %arg) #0 {
320 %value = bitcast i32 %arg to <2 x i16>
321 %hi = extractelement <2 x i16> %value, i32 1
322 %trunc = trunc i16 %hi to i8
323 %gep = getelementptr inbounds i8, i8 addrspace(4)* %out, i64 4095
324 store i8 %trunc, i8 addrspace(4)* %gep
328 ; GCN-LABEL: {{^}}store_flat_hi_v2i16_i8_neg_offset:
330 ; GCN-DAG: v_add_i32_e32
331 ; GCN-DAG: v_addc_u32_e32
333 ; GFX9-NEXT: flat_store_byte_d16_hi v[0:1], v2{{$}}
334 ; VI-DAG: v_lshrrev_b32_e32 v2, 16, v2
335 ; VI: flat_store_byte v[0:1], v2{{$}}
336 ; GCN-NEXT: s_waitcnt
337 ; GCN-NEXT: s_setpc_b64
338 define void @store_flat_hi_v2i16_i8_neg_offset(i8 addrspace(4)* %out, i32 %arg) #0 {
340 %value = bitcast i32 %arg to <2 x i16>
341 %hi = extractelement <2 x i16> %value, i32 1
342 %trunc = trunc i16 %hi to i8
343 %gep = getelementptr inbounds i8, i8 addrspace(4)* %out, i64 -4095
344 store i8 %trunc, i8 addrspace(4)* %gep
348 ; GCN-LABEL: {{^}}store_private_hi_v2i16:
351 ; GFX9-NEXT: buffer_store_short_d16_hi v1, v0, s[0:3], s4 offen{{$}}
353 ; VI: v_lshrrev_b32_e32 v1, 16, v1
354 ; VI: buffer_store_short v1, v0, s[0:3], s4 offen{{$}}
356 ; GCN-NEXT: s_waitcnt
357 ; GCN-NEXT: s_setpc_b64
358 define void @store_private_hi_v2i16(i16* %out, i32 %arg) #0 {
360 ; FIXME: ABI for pre-gfx9
361 %value = bitcast i32 %arg to <2 x i16>
362 %hi = extractelement <2 x i16> %value, i32 1
363 store i16 %hi, i16* %out
367 ; GCN-LABEL: {{^}}store_private_hi_v2f16:
370 ; GFX9-NEXT: buffer_store_short_d16_hi v1, v0, s[0:3], s4 offen{{$}}
372 ; VI: v_lshrrev_b32_e32 v1, 16, v1
373 ; VI: buffer_store_short v1, v0, s[0:3], s4 offen{{$}}
375 ; GCN-NEXT: s_waitcnt
376 ; GCN-NEXT: s_setpc_b64
377 define void @store_private_hi_v2f16(half* %out, i32 %arg) #0 {
379 ; FIXME: ABI for pre-gfx9
380 %value = bitcast i32 %arg to <2 x half>
381 %hi = extractelement <2 x half> %value, i32 1
382 store half %hi, half* %out
386 ; GCN-LABEL: {{^}}store_private_hi_i32_shift:
389 ; GFX9-NEXT: buffer_store_short_d16_hi v1, v0, s[0:3], s4 offen{{$}}
391 ; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1
392 ; VI-NEXT: buffer_store_short v1, v0, s[0:3], s4 offen{{$}}
394 ; GCN-NEXT: s_waitcnt
395 ; GCN-NEXT: s_setpc_b64
396 define void @store_private_hi_i32_shift(i16* %out, i32 %value) #0 {
398 %hi32 = lshr i32 %value, 16
399 %hi = trunc i32 %hi32 to i16
400 store i16 %hi, i16* %out
404 ; GCN-LABEL: {{^}}store_private_hi_v2i16_i8:
407 ; GFX9-NEXT: buffer_store_byte_d16_hi v1, v0, s[0:3], s4 offen{{$}}
409 ; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1
410 ; VI-NEXT: buffer_store_byte v1, v0, s[0:3], s4 offen{{$}}
412 ; GCN-NEXT: s_waitcnt
413 ; GCN-NEXT: s_setpc_b64
414 define void @store_private_hi_v2i16_i8(i8* %out, i32 %arg) #0 {
416 %value = bitcast i32 %arg to <2 x i16>
417 %hi = extractelement <2 x i16> %value, i32 1
418 %trunc = trunc i16 %hi to i8
419 store i8 %trunc, i8* %out
423 ; GCN-LABEL: {{^}}store_private_hi_i8_shift:
426 ; GFX9-NEXT: buffer_store_byte_d16_hi v1, v0, s[0:3], s4 offen{{$}}
428 ; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1
429 ; VI-NEXT: buffer_store_byte v1, v0, s[0:3], s4 offen{{$}}
431 ; GCN-NEXT: s_waitcnt
432 ; GCN-NEXT: s_setpc_b64
433 define void @store_private_hi_i8_shift(i8* %out, i32 %value) #0 {
435 %hi32 = lshr i32 %value, 16
436 %hi = trunc i32 %hi32 to i8
437 store i8 %hi, i8* %out
441 ; GCN-LABEL: {{^}}store_private_hi_v2i16_max_offset:
443 ; GFX9-NEXT: buffer_store_short_d16_hi v1, v0, s[0:3], s4 offen offset:4094{{$}}
445 ; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1
446 ; VI-NEXT: buffer_store_short v1, v0, s[0:3], s4 offen offset:4094{{$}}
448 ; GCN-NEXT: s_waitcnt
449 ; GCN-NEXT: s_setpc_b64
450 define void @store_private_hi_v2i16_max_offset(i16* %out, i32 %arg) #0 {
452 %value = bitcast i32 %arg to <2 x i16>
453 %hi = extractelement <2 x i16> %value, i32 1
454 %gep = getelementptr inbounds i16, i16* %out, i64 2047
455 store i16 %hi, i16* %gep
461 ; GCN-LABEL: {{^}}store_private_hi_v2i16_nooff:
464 ; GFX9-NEXT: buffer_store_short_d16_hi v0, off, s[0:3], s4{{$}}
466 ; VI-NEXT: v_lshrrev_b32_e32 v0, 16, v0
467 ; VI-NEXT: buffer_store_short v0, off, s[0:3], s4{{$}}
469 ; GCN-NEXT: s_waitcnt
470 ; GCN-NEXT: s_setpc_b64
471 define void @store_private_hi_v2i16_nooff(i32 %arg) #0 {
473 ; FIXME: ABI for pre-gfx9
474 %value = bitcast i32 %arg to <2 x i16>
475 %hi = extractelement <2 x i16> %value, i32 1
476 store volatile i16 %hi, i16* null
481 ; GCN-LABEL: {{^}}store_private_hi_v2i16_i8_nooff:
484 ; GFX9-NEXT: buffer_store_byte_d16_hi v0, off, s[0:3], s4{{$}}
486 ; VI: v_lshrrev_b32_e32 v0, 16, v0
487 ; VI: buffer_store_byte v0, off, s[0:3], s4{{$}}
489 ; GCN-NEXT: s_waitcnt
490 ; GCN-NEXT: s_setpc_b64
491 define void @store_private_hi_v2i16_i8_nooff(i32 %arg) #0 {
493 %value = bitcast i32 %arg to <2 x i16>
494 %hi = extractelement <2 x i16> %value, i32 1
495 %trunc = trunc i16 %hi to i8
496 store volatile i8 %trunc, i8* null
500 ; GCN-LABEL: {{^}}store_local_hi_v2i16:
503 ; GFX9-NEXT: ds_write_b16_d16_hi v0, v1{{$}}
505 ; VI: v_lshrrev_b32_e32 v1, 16, v1
506 ; VI: ds_write_b16 v0, v1
508 ; GCN-NEXT: s_waitcnt
509 ; GCN-NEXT: s_setpc_b64
510 define void @store_local_hi_v2i16(i16 addrspace(3)* %out, i32 %arg) #0 {
512 ; FIXME: ABI for pre-gfx9
513 %value = bitcast i32 %arg to <2 x i16>
514 %hi = extractelement <2 x i16> %value, i32 1
515 store i16 %hi, i16 addrspace(3)* %out
519 ; GCN-LABEL: {{^}}store_local_hi_v2f16:
522 ; GFX9-NEXT: ds_write_b16_d16_hi v0, v1{{$}}
524 ; VI: v_lshrrev_b32_e32 v1, 16, v1
525 ; VI: ds_write_b16 v0, v1
527 ; GCN-NEXT: s_waitcnt
528 ; GCN-NEXT: s_setpc_b64
529 define void @store_local_hi_v2f16(half addrspace(3)* %out, i32 %arg) #0 {
531 ; FIXME: ABI for pre-gfx9
532 %value = bitcast i32 %arg to <2 x half>
533 %hi = extractelement <2 x half> %value, i32 1
534 store half %hi, half addrspace(3)* %out
538 ; GCN-LABEL: {{^}}store_local_hi_i32_shift:
541 ; GFX9-NEXT: ds_write_b16_d16_hi v0, v1{{$}}
543 ; VI: v_lshrrev_b32_e32 v1, 16, v1
544 ; VI: ds_write_b16 v0, v1
546 ; GCN-NEXT: s_waitcnt
547 ; GCN-NEXT: s_setpc_b64
548 define void @store_local_hi_i32_shift(i16 addrspace(3)* %out, i32 %value) #0 {
550 %hi32 = lshr i32 %value, 16
551 %hi = trunc i32 %hi32 to i16
552 store i16 %hi, i16 addrspace(3)* %out
556 ; GCN-LABEL: {{^}}store_local_hi_v2i16_i8:
559 ; GFX9-NEXT: ds_write_b8_d16_hi v0, v1{{$}}
561 ; VI: v_lshrrev_b32_e32 v1, 16, v1
562 ; VI: ds_write_b8 v0, v1
564 ; GCN-NEXT: s_waitcnt
565 ; GCN-NEXT: s_setpc_b64
566 define void @store_local_hi_v2i16_i8(i8 addrspace(3)* %out, i32 %arg) #0 {
568 %value = bitcast i32 %arg to <2 x i16>
569 %hi = extractelement <2 x i16> %value, i32 1
570 %trunc = trunc i16 %hi to i8
571 store i8 %trunc, i8 addrspace(3)* %out
575 ; GCN-LABEL: {{^}}store_local_hi_v2i16_max_offset:
577 ; GFX9-NEXT: ds_write_b16_d16_hi v0, v1 offset:65534{{$}}
579 ; VI: v_lshrrev_b32_e32 v1, 16, v1
580 ; VI: ds_write_b16 v0, v1 offset:65534{{$}}
582 ; GCN-NEXT: s_waitcnt
583 ; GCN-NEXT: s_setpc_b64
584 define void @store_local_hi_v2i16_max_offset(i16 addrspace(3)* %out, i32 %arg) #0 {
586 ; FIXME: ABI for pre-gfx9
587 %value = bitcast i32 %arg to <2 x i16>
588 %hi = extractelement <2 x i16> %value, i32 1
589 %gep = getelementptr inbounds i16, i16 addrspace(3)* %out, i64 32767
590 store i16 %hi, i16 addrspace(3)* %gep
594 attributes #0 = { nounwind }