xref: /llvm-project/llvm/test/CodeGen/AMDGPU/global-variable-relocs.ll (revision bdf2fbba9cee60b4b260ff17e4f44c475c11e715)
1; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji < %s | FileCheck %s
2
3@private = private addrspace(1) global [256 x i32] zeroinitializer
4@internal = internal addrspace(1) global [256 x i32] zeroinitializer
5@available_externally = available_externally addrspace(1) global [256 x i32] zeroinitializer
6@linkonce = linkonce addrspace(1) global [256 x i32] zeroinitializer
7@weak= weak addrspace(1) global [256 x i32] zeroinitializer
8@common = common addrspace(1) global [256 x i32] zeroinitializer
9@extern_weak = extern_weak addrspace(1) global [256 x i32]
10@linkonce_odr = linkonce_odr addrspace(1) global [256 x i32] zeroinitializer
11@weak_odr = weak_odr addrspace(1) global [256 x i32] zeroinitializer
12@external = external addrspace(1) global [256 x i32]
13@external_w_init = addrspace(1) global [256 x i32] zeroinitializer
14
15; CHECK-LABEL: private_test:
16; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
17; CHECK: s_add_u32 s[[ADDR_LO:[0-9]+]], s[[PC_LO]], private@rel32@lo+8
18; CHECK: s_addc_u32 s[[ADDR_HI:[0-9]+]], s[[PC_HI]], private@rel32@hi+16
19; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]]
20define amdgpu_kernel void @private_test(ptr addrspace(1) %out) {
21  %ptr = getelementptr [256 x i32], ptr addrspace(1) @private, i32 0, i32 1
22  %val = load i32, ptr addrspace(1) %ptr
23  store i32 %val, ptr addrspace(1) %out
24  ret void
25}
26
27; CHECK-LABEL: internal_test:
28; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
29; CHECK: s_add_u32 s[[ADDR_LO:[0-9]+]], s[[PC_LO]], internal@rel32@lo+8
30; CHECK: s_addc_u32 s[[ADDR_HI:[0-9]+]], s[[PC_HI]], internal@rel32@hi+16
31; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]]
32define amdgpu_kernel void @internal_test(ptr addrspace(1) %out) {
33  %ptr = getelementptr [256 x i32], ptr addrspace(1) @internal, i32 0, i32 1
34  %val = load i32, ptr addrspace(1) %ptr
35  store i32 %val, ptr addrspace(1) %out
36  ret void
37}
38
39; CHECK-LABEL: available_externally_test:
40; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
41; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], available_externally@gotpcrel32@lo+4
42; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], available_externally@gotpcrel32@hi+12
43; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
44; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
45define amdgpu_kernel void @available_externally_test(ptr addrspace(1) %out) {
46  %ptr = getelementptr [256 x i32], ptr addrspace(1) @available_externally, i32 0, i32 1
47  %val = load i32, ptr addrspace(1) %ptr
48  store i32 %val, ptr addrspace(1) %out
49  ret void
50}
51
52; CHECK-LABEL: linkonce_test:
53; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
54; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], linkonce@gotpcrel32@lo+4
55; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], linkonce@gotpcrel32@hi+12
56; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
57; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
58define amdgpu_kernel void @linkonce_test(ptr addrspace(1) %out) {
59  %ptr = getelementptr [256 x i32], ptr addrspace(1) @linkonce, i32 0, i32 1
60  %val = load i32, ptr addrspace(1) %ptr
61  store i32 %val, ptr addrspace(1) %out
62  ret void
63}
64
65; CHECK-LABEL: weak_test:
66; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
67; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], weak@gotpcrel32@lo+4
68; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], weak@gotpcrel32@hi+12
69; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
70; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
71define amdgpu_kernel void @weak_test(ptr addrspace(1) %out) {
72  %ptr = getelementptr [256 x i32], ptr addrspace(1) @weak, i32 0, i32 1
73  %val = load i32, ptr addrspace(1) %ptr
74  store i32 %val, ptr addrspace(1) %out
75  ret void
76}
77
78; CHECK-LABEL: common_test:
79; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
80; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], common@gotpcrel32@lo+4
81; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], common@gotpcrel32@hi+12
82; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
83; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
84define amdgpu_kernel void @common_test(ptr addrspace(1) %out) {
85  %ptr = getelementptr [256 x i32], ptr addrspace(1) @common, i32 0, i32 1
86  %val = load i32, ptr addrspace(1) %ptr
87  store i32 %val, ptr addrspace(1) %out
88  ret void
89}
90
91; CHECK-LABEL: extern_weak_test:
92; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
93; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], extern_weak@gotpcrel32@lo+4
94; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], extern_weak@gotpcrel32@hi+12
95; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
96; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
97define amdgpu_kernel void @extern_weak_test(ptr addrspace(1) %out) {
98  %ptr = getelementptr [256 x i32], ptr addrspace(1) @extern_weak, i32 0, i32 1
99  %val = load i32, ptr addrspace(1) %ptr
100  store i32 %val, ptr addrspace(1) %out
101  ret void
102}
103
104; CHECK-LABEL: linkonce_odr_test:
105; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
106; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], linkonce_odr@gotpcrel32@lo+4
107; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], linkonce_odr@gotpcrel32@hi+12
108; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
109; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
110define amdgpu_kernel void @linkonce_odr_test(ptr addrspace(1) %out) {
111  %ptr = getelementptr [256 x i32], ptr addrspace(1) @linkonce_odr, i32 0, i32 1
112  %val = load i32, ptr addrspace(1) %ptr
113  store i32 %val, ptr addrspace(1) %out
114  ret void
115}
116
117; CHECK-LABEL: weak_odr_test:
118; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
119; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], weak_odr@gotpcrel32@lo+4
120; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], weak_odr@gotpcrel32@hi+12
121; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
122; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
123define amdgpu_kernel void @weak_odr_test(ptr addrspace(1) %out) {
124  %ptr = getelementptr [256 x i32], ptr addrspace(1) @weak_odr, i32 0, i32 1
125  %val = load i32, ptr addrspace(1) %ptr
126  store i32 %val, ptr addrspace(1) %out
127  ret void
128}
129
130; CHECK-LABEL: external_test:
131; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
132; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], external@gotpcrel32@lo+4
133; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], external@gotpcrel32@hi+12
134; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
135; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
136define amdgpu_kernel void @external_test(ptr addrspace(1) %out) {
137  %ptr = getelementptr [256 x i32], ptr addrspace(1) @external, i32 0, i32 1
138  %val = load i32, ptr addrspace(1) %ptr
139  store i32 %val, ptr addrspace(1) %out
140  ret void
141}
142
143; CHECK-LABEL: external_w_init_test:
144; CHECK: s_getpc_b64 s[[[PC_LO:[0-9]+]]:[[PC_HI:[0-9]+]]]
145; CHECK: s_add_u32 s[[GOTADDR_LO:[0-9]+]], s[[PC_LO]], external_w_init@gotpcrel32@lo+4
146; CHECK: s_addc_u32 s[[GOTADDR_HI:[0-9]+]], s[[PC_HI]], external_w_init@gotpcrel32@hi+12
147; CHECK: s_load_dwordx2 s[[[ADDR_LO:[0-9]+]]:[[ADDR_HI:[0-9]+]]], s[[[GOTADDR_LO]]:[[GOTADDR_HI]]], 0x0
148; CHECK: s_load_dword s{{[0-9]+}}, s[[[ADDR_LO]]:[[ADDR_HI]]], 0x4
149define amdgpu_kernel void @external_w_init_test(ptr addrspace(1) %out) {
150  %ptr = getelementptr [256 x i32], ptr addrspace(1) @external_w_init, i32 0, i32 1
151  %val = load i32, ptr addrspace(1) %ptr
152  store i32 %val, ptr addrspace(1) %out
153  ret void
154}
155
156; CHECK: .local private
157; CHECK: .local internal
158; CHECK: .weak linkonce
159; CHECK: .weak weak
160; CHECK: .weak linkonce_odr
161; CHECK: .weak weak_odr
162; CHECK-NOT: external{{$}}
163; CHECK: .globl external_w_init
164