blob: ff8c904578763cb426df8ec19b33ee84b2d06c07 [file] [log] [blame]
Matt Arsenault1c4d0ef2016-04-28 19:37:35 +00001; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Marek Olsak75170772015-01-27 17:27:15 +00002; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Tom Stellardfd155822013-08-26 15:05:36 +00003
4; On Southern Islands GPUs the local address space(3) uses 32-bit pointers and
5; the global address space(1) uses 64-bit pointers. These tests check to make sure
6; the correct pointer size is used for the local address space.
7
8; The e{{32|64}} suffix on the instructions refers to the encoding size and not
9; the size of the operands. The operand size is denoted in the instruction name.
10; Instructions with B32, U32, and I32 in their name take 32-bit operands, while
11; instructions with B64, U64, and I64 take 64-bit operands.
12
Tom Stellard79243d92014-10-01 17:15:17 +000013; FUNC-LABEL: {{^}}local_address_load:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000014; SI: v_mov_b32_e{{32|64}} [[PTR:v[0-9]]]
15; SI: ds_read_b32 v{{[0-9]+}}, [[PTR]]
Tom Stellardfd155822013-08-26 15:05:36 +000016define void @local_address_load(i32 addrspace(1)* %out, i32 addrspace(3)* %in) {
17entry:
David Blaikiea79ac142015-02-27 21:17:42 +000018 %0 = load i32, i32 addrspace(3)* %in
Tom Stellardfd155822013-08-26 15:05:36 +000019 store i32 %0, i32 addrspace(1)* %out
20 ret void
21}
22
Tom Stellard79243d92014-10-01 17:15:17 +000023; FUNC-LABEL: {{^}}local_address_gep:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000024; SI: s_add_i32 [[SPTR:s[0-9]]]
25; SI: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
26; SI: ds_read_b32 [[VPTR]]
Tom Stellardfd155822013-08-26 15:05:36 +000027define void @local_address_gep(i32 addrspace(1)* %out, i32 addrspace(3)* %in, i32 %offset) {
28entry:
David Blaikie79e6c742015-02-27 19:29:02 +000029 %0 = getelementptr i32, i32 addrspace(3)* %in, i32 %offset
David Blaikiea79ac142015-02-27 21:17:42 +000030 %1 = load i32, i32 addrspace(3)* %0
Tom Stellardfd155822013-08-26 15:05:36 +000031 store i32 %1, i32 addrspace(1)* %out
32 ret void
33}
34
Tom Stellard79243d92014-10-01 17:15:17 +000035; FUNC-LABEL: {{^}}local_address_gep_const_offset:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000036; SI: v_mov_b32_e32 [[VPTR:v[0-9]+]], s{{[0-9]+}}
37; SI: ds_read_b32 v{{[0-9]+}}, [[VPTR]] offset:4
Tom Stellardfd155822013-08-26 15:05:36 +000038define void @local_address_gep_const_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %in) {
39entry:
David Blaikie79e6c742015-02-27 19:29:02 +000040 %0 = getelementptr i32, i32 addrspace(3)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000041 %1 = load i32, i32 addrspace(3)* %0
Tom Stellardfd155822013-08-26 15:05:36 +000042 store i32 %1, i32 addrspace(1)* %out
43 ret void
44}
Matt Arsenault19231e62013-11-16 20:24:41 +000045
Matt Arsenault99ed7892014-03-19 22:19:49 +000046; Offset too large, can't fold into 16-bit immediate offset.
Tom Stellard79243d92014-10-01 17:15:17 +000047; FUNC-LABEL: {{^}}local_address_gep_large_const_offset:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000048; SI: s_add_i32 [[SPTR:s[0-9]]], s{{[0-9]+}}, 0x10004
49; SI: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
50; SI: ds_read_b32 [[VPTR]]
Matt Arsenault99ed7892014-03-19 22:19:49 +000051define void @local_address_gep_large_const_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %in) {
52entry:
David Blaikie79e6c742015-02-27 19:29:02 +000053 %0 = getelementptr i32, i32 addrspace(3)* %in, i32 16385
David Blaikiea79ac142015-02-27 21:17:42 +000054 %1 = load i32, i32 addrspace(3)* %0
Matt Arsenault99ed7892014-03-19 22:19:49 +000055 store i32 %1, i32 addrspace(1)* %out
56 ret void
57}
58
Tom Stellard79243d92014-10-01 17:15:17 +000059; FUNC-LABEL: {{^}}null_32bit_lds_ptr:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000060; SI: v_cmp_ne_i32
61; SI-NOT: v_cmp_ne_i32
62; SI: v_cndmask_b32
Matt Arsenault19231e62013-11-16 20:24:41 +000063define void @null_32bit_lds_ptr(i32 addrspace(1)* %out, i32 addrspace(3)* %lds) nounwind {
64 %cmp = icmp ne i32 addrspace(3)* %lds, null
65 %x = select i1 %cmp, i32 123, i32 456
66 store i32 %x, i32 addrspace(1)* %out
67 ret void
Matt Arsenaultdfb3e702013-11-16 20:50:54 +000068}
69
Tom Stellard79243d92014-10-01 17:15:17 +000070; FUNC-LABEL: {{^}}mul_32bit_ptr:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000071; SI: s_mul_i32
72; SI-NEXT: s_add_i32
73; SI: ds_read_b32
Matt Arsenaultdfb3e702013-11-16 20:50:54 +000074define void @mul_32bit_ptr(float addrspace(1)* %out, [3 x float] addrspace(3)* %lds, i32 %tid) {
David Blaikie79e6c742015-02-27 19:29:02 +000075 %ptr = getelementptr [3 x float], [3 x float] addrspace(3)* %lds, i32 %tid, i32 0
David Blaikiea79ac142015-02-27 21:17:42 +000076 %val = load float, float addrspace(3)* %ptr
Matt Arsenaultdfb3e702013-11-16 20:50:54 +000077 store float %val, float addrspace(1)* %out
78 ret void
79}
80
Matt Arsenaultcc8d3b82014-11-13 19:56:13 +000081@g_lds = addrspace(3) global float undef, align 4
Matt Arsenaultdfb3e702013-11-16 20:50:54 +000082
Tom Stellard79243d92014-10-01 17:15:17 +000083; FUNC-LABEL: {{^}}infer_ptr_alignment_global_offset:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000084; SI: v_mov_b32_e32 [[REG:v[0-9]+]], 0
85; SI: ds_read_b32 v{{[0-9]+}}, [[REG]]
Matt Arsenaultdfb3e702013-11-16 20:50:54 +000086define void @infer_ptr_alignment_global_offset(float addrspace(1)* %out, i32 %tid) {
David Blaikiea79ac142015-02-27 21:17:42 +000087 %val = load float, float addrspace(3)* @g_lds
Matt Arsenaultdfb3e702013-11-16 20:50:54 +000088 store float %val, float addrspace(1)* %out
89 ret void
90}
Matt Arsenault36f5eb52013-11-17 00:06:39 +000091
92
Matt Arsenaultcc8d3b82014-11-13 19:56:13 +000093@ptr = addrspace(3) global i32 addrspace(3)* undef
Matt Arsenault1c4d0ef2016-04-28 19:37:35 +000094@dst = addrspace(3) global [16383 x i32] undef
Matt Arsenault36f5eb52013-11-17 00:06:39 +000095
Tom Stellard79243d92014-10-01 17:15:17 +000096; FUNC-LABEL: {{^}}global_ptr:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +000097; SI: ds_write_b32
Matt Arsenault36f5eb52013-11-17 00:06:39 +000098define void @global_ptr() nounwind {
Matt Arsenault1c4d0ef2016-04-28 19:37:35 +000099 store i32 addrspace(3)* getelementptr ([16383 x i32], [16383 x i32] addrspace(3)* @dst, i32 0, i32 16), i32 addrspace(3)* addrspace(3)* @ptr
Matt Arsenault36f5eb52013-11-17 00:06:39 +0000100 ret void
101}
Matt Arsenault99ed7892014-03-19 22:19:49 +0000102
Tom Stellard79243d92014-10-01 17:15:17 +0000103; FUNC-LABEL: {{^}}local_address_store:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +0000104; SI: ds_write_b32
Matt Arsenault99ed7892014-03-19 22:19:49 +0000105define void @local_address_store(i32 addrspace(3)* %out, i32 %val) {
106 store i32 %val, i32 addrspace(3)* %out
107 ret void
108}
109
Tom Stellard79243d92014-10-01 17:15:17 +0000110; FUNC-LABEL: {{^}}local_address_gep_store:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +0000111; SI: s_add_i32 [[SADDR:s[0-9]+]],
112; SI: v_mov_b32_e32 [[ADDR:v[0-9]+]], [[SADDR]]
113; SI: ds_write_b32 [[ADDR]], v{{[0-9]+}}
Matt Arsenault99ed7892014-03-19 22:19:49 +0000114define void @local_address_gep_store(i32 addrspace(3)* %out, i32, i32 %val, i32 %offset) {
David Blaikie79e6c742015-02-27 19:29:02 +0000115 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 %offset
Matt Arsenault99ed7892014-03-19 22:19:49 +0000116 store i32 %val, i32 addrspace(3)* %gep, align 4
117 ret void
118}
119
Tom Stellard79243d92014-10-01 17:15:17 +0000120; FUNC-LABEL: {{^}}local_address_gep_const_offset_store:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +0000121; SI: v_mov_b32_e32 [[VPTR:v[0-9]+]], s{{[0-9]+}}
122; SI: v_mov_b32_e32 [[VAL:v[0-9]+]], s{{[0-9]+}}
123; SI: ds_write_b32 [[VPTR]], [[VAL]] offset:4
Matt Arsenault99ed7892014-03-19 22:19:49 +0000124define void @local_address_gep_const_offset_store(i32 addrspace(3)* %out, i32 %val) {
David Blaikie79e6c742015-02-27 19:29:02 +0000125 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 1
Matt Arsenault99ed7892014-03-19 22:19:49 +0000126 store i32 %val, i32 addrspace(3)* %gep, align 4
127 ret void
128}
129
130; Offset too large, can't fold into 16-bit immediate offset.
Tom Stellard79243d92014-10-01 17:15:17 +0000131; FUNC-LABEL: {{^}}local_address_gep_large_const_offset_store:
Matt Arsenaultafbf21f2014-11-08 00:02:57 +0000132; SI: s_add_i32 [[SPTR:s[0-9]]], s{{[0-9]+}}, 0x10004
133; SI: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
Tom Stellardeb05c612015-02-26 17:08:43 +0000134; SI: ds_write_b32 [[VPTR]], v{{[0-9]+$}}
Matt Arsenault99ed7892014-03-19 22:19:49 +0000135define void @local_address_gep_large_const_offset_store(i32 addrspace(3)* %out, i32 %val) {
David Blaikie79e6c742015-02-27 19:29:02 +0000136 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 16385
Matt Arsenault99ed7892014-03-19 22:19:49 +0000137 store i32 %val, i32 addrspace(3)* %gep, align 4
138 ret void
139}