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