383 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn -mcpu=bonaire < %s | FileCheck -check-prefixes=SI,FUNC,GFX7 %s3; RUN: llc -mtriple=amdgcn -mcpu=tonga -mattr=-flat-for-global < %s | FileCheck -check-prefixes=SI,FUNC,GFX8 %s4 5; On Southern Islands GPUs the local address space(3) uses 32-bit pointers and6; the global address space(1) uses 64-bit pointers. These tests check to make sure7; the correct pointer size is used for the local address space.8 9; The e{{32|64}} suffix on the instructions refers to the encoding size and not10; the size of the operands. The operand size is denoted in the instruction name.11; Instructions with B32, U32, and I32 in their name take 32-bit operands, while12; instructions with B64, U64, and I64 take 64-bit operands.13 14define amdgpu_kernel void @local_address_load(ptr addrspace(1) %out, ptr addrspace(3) %in) {15; GFX7-LABEL: local_address_load:16; GFX7: ; %bb.0: ; %entry17; GFX7-NEXT: s_load_dword s2, s[4:5], 0xb18; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x919; GFX7-NEXT: s_mov_b32 m0, -120; GFX7-NEXT: s_mov_b32 s3, 0xf00021; GFX7-NEXT: s_waitcnt lgkmcnt(0)22; GFX7-NEXT: v_mov_b32_e32 v0, s223; GFX7-NEXT: ds_read_b32 v0, v024; GFX7-NEXT: s_mov_b32 s2, -125; GFX7-NEXT: s_waitcnt lgkmcnt(0)26; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 027; GFX7-NEXT: s_endpgm28;29; GFX8-LABEL: local_address_load:30; GFX8: ; %bb.0: ; %entry31; GFX8-NEXT: s_load_dword s2, s[4:5], 0x2c32; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2433; GFX8-NEXT: s_mov_b32 m0, -134; GFX8-NEXT: s_mov_b32 s3, 0xf00035; GFX8-NEXT: s_waitcnt lgkmcnt(0)36; GFX8-NEXT: v_mov_b32_e32 v0, s237; GFX8-NEXT: ds_read_b32 v0, v038; GFX8-NEXT: s_mov_b32 s2, -139; GFX8-NEXT: s_waitcnt lgkmcnt(0)40; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 041; GFX8-NEXT: s_endpgm42entry:43 %0 = load i32, ptr addrspace(3) %in44 store i32 %0, ptr addrspace(1) %out45 ret void46}47 48define amdgpu_kernel void @local_address_gep(ptr addrspace(1) %out, ptr addrspace(3) %in, i32 %offset) {49; GFX7-LABEL: local_address_gep:50; GFX7: ; %bb.0: ; %entry51; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x952; GFX7-NEXT: s_mov_b32 m0, -153; GFX7-NEXT: s_waitcnt lgkmcnt(0)54; GFX7-NEXT: s_lshl_b32 s3, s3, 255; GFX7-NEXT: s_add_i32 s2, s2, s356; GFX7-NEXT: v_mov_b32_e32 v0, s257; GFX7-NEXT: ds_read_b32 v0, v058; GFX7-NEXT: s_mov_b32 s3, 0xf00059; GFX7-NEXT: s_mov_b32 s2, -160; GFX7-NEXT: s_waitcnt lgkmcnt(0)61; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 062; GFX7-NEXT: s_endpgm63;64; GFX8-LABEL: local_address_gep:65; GFX8: ; %bb.0: ; %entry66; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2467; GFX8-NEXT: s_mov_b32 m0, -168; GFX8-NEXT: s_waitcnt lgkmcnt(0)69; GFX8-NEXT: s_lshl_b32 s3, s3, 270; GFX8-NEXT: s_add_i32 s2, s2, s371; GFX8-NEXT: v_mov_b32_e32 v0, s272; GFX8-NEXT: ds_read_b32 v0, v073; GFX8-NEXT: s_mov_b32 s3, 0xf00074; GFX8-NEXT: s_mov_b32 s2, -175; GFX8-NEXT: s_waitcnt lgkmcnt(0)76; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 077; GFX8-NEXT: s_endpgm78entry:79 %0 = getelementptr i32, ptr addrspace(3) %in, i32 %offset80 %1 = load i32, ptr addrspace(3) %081 store i32 %1, ptr addrspace(1) %out82 ret void83}84 85define amdgpu_kernel void @local_address_gep_const_offset(ptr addrspace(1) %out, ptr addrspace(3) %in) {86; GFX7-LABEL: local_address_gep_const_offset:87; GFX7: ; %bb.0: ; %entry88; GFX7-NEXT: s_load_dword s2, s[4:5], 0xb89; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x990; GFX7-NEXT: s_mov_b32 m0, -191; GFX7-NEXT: s_mov_b32 s3, 0xf00092; GFX7-NEXT: s_waitcnt lgkmcnt(0)93; GFX7-NEXT: v_mov_b32_e32 v0, s294; GFX7-NEXT: ds_read_b32 v0, v0 offset:495; GFX7-NEXT: s_mov_b32 s2, -196; GFX7-NEXT: s_waitcnt lgkmcnt(0)97; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 098; GFX7-NEXT: s_endpgm99;100; GFX8-LABEL: local_address_gep_const_offset:101; GFX8: ; %bb.0: ; %entry102; GFX8-NEXT: s_load_dword s2, s[4:5], 0x2c103; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24104; GFX8-NEXT: s_mov_b32 m0, -1105; GFX8-NEXT: s_mov_b32 s3, 0xf000106; GFX8-NEXT: s_waitcnt lgkmcnt(0)107; GFX8-NEXT: v_mov_b32_e32 v0, s2108; GFX8-NEXT: ds_read_b32 v0, v0 offset:4109; GFX8-NEXT: s_mov_b32 s2, -1110; GFX8-NEXT: s_waitcnt lgkmcnt(0)111; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0112; GFX8-NEXT: s_endpgm113entry:114 %0 = getelementptr i32, ptr addrspace(3) %in, i32 1115 %1 = load i32, ptr addrspace(3) %0116 store i32 %1, ptr addrspace(1) %out117 ret void118}119 120; Offset too large, can't fold into 16-bit immediate offset.121define amdgpu_kernel void @local_address_gep_large_const_offset(ptr addrspace(1) %out, ptr addrspace(3) %in) {122; GFX7-LABEL: local_address_gep_large_const_offset:123; GFX7: ; %bb.0: ; %entry124; GFX7-NEXT: s_load_dword s2, s[4:5], 0xb125; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9126; GFX7-NEXT: s_mov_b32 m0, -1127; GFX7-NEXT: s_mov_b32 s3, 0xf000128; GFX7-NEXT: s_waitcnt lgkmcnt(0)129; GFX7-NEXT: s_add_i32 s2, s2, 0x10004130; GFX7-NEXT: v_mov_b32_e32 v0, s2131; GFX7-NEXT: ds_read_b32 v0, v0132; GFX7-NEXT: s_mov_b32 s2, -1133; GFX7-NEXT: s_waitcnt lgkmcnt(0)134; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0135; GFX7-NEXT: s_endpgm136;137; GFX8-LABEL: local_address_gep_large_const_offset:138; GFX8: ; %bb.0: ; %entry139; GFX8-NEXT: s_load_dword s2, s[4:5], 0x2c140; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24141; GFX8-NEXT: s_mov_b32 m0, -1142; GFX8-NEXT: s_mov_b32 s3, 0xf000143; GFX8-NEXT: s_waitcnt lgkmcnt(0)144; GFX8-NEXT: s_add_i32 s2, s2, 0x10004145; GFX8-NEXT: v_mov_b32_e32 v0, s2146; GFX8-NEXT: ds_read_b32 v0, v0147; GFX8-NEXT: s_mov_b32 s2, -1148; GFX8-NEXT: s_waitcnt lgkmcnt(0)149; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0150; GFX8-NEXT: s_endpgm151entry:152 %0 = getelementptr i32, ptr addrspace(3) %in, i32 16385153 %1 = load i32, ptr addrspace(3) %0154 store i32 %1, ptr addrspace(1) %out155 ret void156}157 158define amdgpu_kernel void @null_32bit_lds_ptr(ptr addrspace(1) %out, ptr addrspace(3) %lds) nounwind {159; GFX7-LABEL: null_32bit_lds_ptr:160; GFX7: ; %bb.0:161; GFX7-NEXT: s_load_dword s6, s[4:5], 0xb162; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9163; GFX7-NEXT: s_movk_i32 s4, 0x7b164; GFX7-NEXT: s_mov_b32 s3, 0xf000165; GFX7-NEXT: s_mov_b32 s2, -1166; GFX7-NEXT: s_waitcnt lgkmcnt(0)167; GFX7-NEXT: s_cmp_lg_u32 s6, 0168; GFX7-NEXT: s_cselect_b32 s4, s4, 0x1c8169; GFX7-NEXT: v_mov_b32_e32 v0, s4170; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0171; GFX7-NEXT: s_endpgm172;173; GFX8-LABEL: null_32bit_lds_ptr:174; GFX8: ; %bb.0:175; GFX8-NEXT: s_load_dword s6, s[4:5], 0x2c176; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24177; GFX8-NEXT: s_movk_i32 s4, 0x7b178; GFX8-NEXT: s_mov_b32 s3, 0xf000179; GFX8-NEXT: s_mov_b32 s2, -1180; GFX8-NEXT: s_waitcnt lgkmcnt(0)181; GFX8-NEXT: s_cmp_lg_u32 s6, 0182; GFX8-NEXT: s_cselect_b32 s4, s4, 0x1c8183; GFX8-NEXT: v_mov_b32_e32 v0, s4184; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0185; GFX8-NEXT: s_endpgm186 %cmp = icmp ne ptr addrspace(3) %lds, null187 %x = select i1 %cmp, i32 123, i32 456188 store i32 %x, ptr addrspace(1) %out189 ret void190}191 192define amdgpu_kernel void @mul_32bit_ptr(ptr addrspace(1) %out, ptr addrspace(3) %lds, i32 %tid) {193; GFX7-LABEL: mul_32bit_ptr:194; GFX7: ; %bb.0:195; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9196; GFX7-NEXT: s_mov_b32 m0, -1197; GFX7-NEXT: s_waitcnt lgkmcnt(0)198; GFX7-NEXT: s_mul_i32 s3, s3, 12199; GFX7-NEXT: s_add_i32 s2, s2, s3200; GFX7-NEXT: v_mov_b32_e32 v0, s2201; GFX7-NEXT: ds_read_b32 v0, v0202; GFX7-NEXT: s_mov_b32 s3, 0xf000203; GFX7-NEXT: s_mov_b32 s2, -1204; GFX7-NEXT: s_waitcnt lgkmcnt(0)205; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0206; GFX7-NEXT: s_endpgm207;208; GFX8-LABEL: mul_32bit_ptr:209; GFX8: ; %bb.0:210; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24211; GFX8-NEXT: s_mov_b32 m0, -1212; GFX8-NEXT: s_waitcnt lgkmcnt(0)213; GFX8-NEXT: s_mul_i32 s3, s3, 12214; GFX8-NEXT: s_add_i32 s2, s2, s3215; GFX8-NEXT: v_mov_b32_e32 v0, s2216; GFX8-NEXT: ds_read_b32 v0, v0217; GFX8-NEXT: s_mov_b32 s3, 0xf000218; GFX8-NEXT: s_mov_b32 s2, -1219; GFX8-NEXT: s_waitcnt lgkmcnt(0)220; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0221; GFX8-NEXT: s_endpgm222 %ptr = getelementptr [3 x float], ptr addrspace(3) %lds, i32 %tid, i32 0223 %val = load float, ptr addrspace(3) %ptr224 store float %val, ptr addrspace(1) %out225 ret void226}227 228@g_lds = addrspace(3) global float poison, align 4229 230define amdgpu_kernel void @infer_ptr_alignment_global_offset(ptr addrspace(1) %out, i32 %tid) {231; GFX7-LABEL: infer_ptr_alignment_global_offset:232; GFX7: ; %bb.0:233; GFX7-NEXT: v_mov_b32_e32 v0, 0234; GFX7-NEXT: s_mov_b32 m0, -1235; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9236; GFX7-NEXT: ds_read_b32 v0, v0237; GFX7-NEXT: s_mov_b32 s3, 0xf000238; GFX7-NEXT: s_mov_b32 s2, -1239; GFX7-NEXT: s_waitcnt lgkmcnt(0)240; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0241; GFX7-NEXT: s_endpgm242;243; GFX8-LABEL: infer_ptr_alignment_global_offset:244; GFX8: ; %bb.0:245; GFX8-NEXT: v_mov_b32_e32 v0, 0246; GFX8-NEXT: s_mov_b32 m0, -1247; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24248; GFX8-NEXT: ds_read_b32 v0, v0249; GFX8-NEXT: s_mov_b32 s3, 0xf000250; GFX8-NEXT: s_mov_b32 s2, -1251; GFX8-NEXT: s_waitcnt lgkmcnt(0)252; GFX8-NEXT: buffer_store_dword v0, off, s[0:3], 0253; GFX8-NEXT: s_endpgm254 %val = load float, ptr addrspace(3) @g_lds255 store float %val, ptr addrspace(1) %out256 ret void257}258 259@ptr = addrspace(3) global ptr addrspace(3) poison260@dst = addrspace(3) global [16383 x i32] poison261 262define amdgpu_kernel void @global_ptr() nounwind {263; SI-LABEL: global_ptr:264; SI: ; %bb.0:265; SI-NEXT: v_mov_b32_e32 v0, 64266; SI-NEXT: v_mov_b32_e32 v1, 0267; SI-NEXT: s_mov_b32 m0, -1268; SI-NEXT: ds_write_b32 v1, v0 offset:65532269; SI-NEXT: s_endpgm270 store ptr addrspace(3) getelementptr ([16383 x i32], ptr addrspace(3) @dst, i32 0, i32 16), ptr addrspace(3) @ptr271 ret void272}273 274define amdgpu_kernel void @local_address_store(ptr addrspace(3) %out, i32 %val) {275; GFX7-LABEL: local_address_store:276; GFX7: ; %bb.0:277; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9278; GFX7-NEXT: s_mov_b32 m0, -1279; GFX7-NEXT: s_waitcnt lgkmcnt(0)280; GFX7-NEXT: v_mov_b32_e32 v0, s0281; GFX7-NEXT: v_mov_b32_e32 v1, s1282; GFX7-NEXT: ds_write_b32 v0, v1283; GFX7-NEXT: s_endpgm284;285; GFX8-LABEL: local_address_store:286; GFX8: ; %bb.0:287; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24288; GFX8-NEXT: s_mov_b32 m0, -1289; GFX8-NEXT: s_waitcnt lgkmcnt(0)290; GFX8-NEXT: v_mov_b32_e32 v0, s0291; GFX8-NEXT: v_mov_b32_e32 v1, s1292; GFX8-NEXT: ds_write_b32 v0, v1293; GFX8-NEXT: s_endpgm294 store i32 %val, ptr addrspace(3) %out295 ret void296}297 298define amdgpu_kernel void @local_address_gep_store(ptr addrspace(3) %out, i32, i32 %val, i32 %offset) {299; GFX7-LABEL: local_address_gep_store:300; GFX7: ; %bb.0:301; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0xb302; GFX7-NEXT: s_load_dword s2, s[4:5], 0x9303; GFX7-NEXT: s_mov_b32 m0, -1304; GFX7-NEXT: s_waitcnt lgkmcnt(0)305; GFX7-NEXT: s_lshl_b32 s1, s1, 2306; GFX7-NEXT: v_mov_b32_e32 v0, s0307; GFX7-NEXT: s_add_i32 s0, s2, s1308; GFX7-NEXT: v_mov_b32_e32 v1, s0309; GFX7-NEXT: ds_write_b32 v1, v0310; GFX7-NEXT: s_endpgm311;312; GFX8-LABEL: local_address_gep_store:313; GFX8: ; %bb.0:314; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2c315; GFX8-NEXT: s_load_dword s2, s[4:5], 0x24316; GFX8-NEXT: s_mov_b32 m0, -1317; GFX8-NEXT: s_waitcnt lgkmcnt(0)318; GFX8-NEXT: s_lshl_b32 s1, s1, 2319; GFX8-NEXT: v_mov_b32_e32 v0, s0320; GFX8-NEXT: s_add_i32 s0, s2, s1321; GFX8-NEXT: v_mov_b32_e32 v1, s0322; GFX8-NEXT: ds_write_b32 v1, v0323; GFX8-NEXT: s_endpgm324 %gep = getelementptr i32, ptr addrspace(3) %out, i32 %offset325 store i32 %val, ptr addrspace(3) %gep, align 4326 ret void327}328 329define amdgpu_kernel void @local_address_gep_const_offset_store(ptr addrspace(3) %out, i32 %val) {330; GFX7-LABEL: local_address_gep_const_offset_store:331; GFX7: ; %bb.0:332; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9333; GFX7-NEXT: s_mov_b32 m0, -1334; GFX7-NEXT: s_waitcnt lgkmcnt(0)335; GFX7-NEXT: v_mov_b32_e32 v0, s0336; GFX7-NEXT: v_mov_b32_e32 v1, s1337; GFX7-NEXT: ds_write_b32 v0, v1 offset:4338; GFX7-NEXT: s_endpgm339;340; GFX8-LABEL: local_address_gep_const_offset_store:341; GFX8: ; %bb.0:342; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24343; GFX8-NEXT: s_mov_b32 m0, -1344; GFX8-NEXT: s_waitcnt lgkmcnt(0)345; GFX8-NEXT: v_mov_b32_e32 v0, s0346; GFX8-NEXT: v_mov_b32_e32 v1, s1347; GFX8-NEXT: ds_write_b32 v0, v1 offset:4348; GFX8-NEXT: s_endpgm349 %gep = getelementptr i32, ptr addrspace(3) %out, i32 1350 store i32 %val, ptr addrspace(3) %gep, align 4351 ret void352}353 354; Offset too large, can't fold into 16-bit immediate offset.355define amdgpu_kernel void @local_address_gep_large_const_offset_store(ptr addrspace(3) %out, i32 %val) {356; GFX7-LABEL: local_address_gep_large_const_offset_store:357; GFX7: ; %bb.0:358; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9359; GFX7-NEXT: s_mov_b32 m0, -1360; GFX7-NEXT: s_waitcnt lgkmcnt(0)361; GFX7-NEXT: s_add_i32 s0, s0, 0x10004362; GFX7-NEXT: v_mov_b32_e32 v0, s1363; GFX7-NEXT: v_mov_b32_e32 v1, s0364; GFX7-NEXT: ds_write_b32 v1, v0365; GFX7-NEXT: s_endpgm366;367; GFX8-LABEL: local_address_gep_large_const_offset_store:368; GFX8: ; %bb.0:369; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24370; GFX8-NEXT: s_mov_b32 m0, -1371; GFX8-NEXT: s_waitcnt lgkmcnt(0)372; GFX8-NEXT: s_add_i32 s0, s0, 0x10004373; GFX8-NEXT: v_mov_b32_e32 v0, s1374; GFX8-NEXT: v_mov_b32_e32 v1, s0375; GFX8-NEXT: ds_write_b32 v1, v0376; GFX8-NEXT: s_endpgm377 %gep = getelementptr i32, ptr addrspace(3) %out, i32 16385378 store i32 %val, ptr addrspace(3) %gep, align 4379 ret void380}381;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:382; FUNC: {{.*}}383