303 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=-architected-sgprs -global-isel=0 < %s | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s3; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=-architected-sgprs -global-isel=1 < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s4; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=+architected-sgprs -global-isel=0 < %s | FileCheck -check-prefixes=GFX9ARCH,GFX9ARCH-SDAG %s5; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=+architected-sgprs -global-isel=1 < %s | FileCheck -check-prefixes=GFX9ARCH,GFX9ARCH-GISEL %s6; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1200 -global-isel=0 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG %s7; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1200 -global-isel=1 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL %s8 9define amdgpu_kernel void @workgroup_ids_kernel() {10; GFX9-LABEL: workgroup_ids_kernel:11; GFX9: ; %bb.0: ; %.entry12; GFX9-NEXT: v_mov_b32_e32 v0, s813; GFX9-NEXT: v_mov_b32_e32 v1, s914; GFX9-NEXT: v_mov_b32_e32 v2, s1015; GFX9-NEXT: buffer_store_dwordx3 v[0:2], off, s[0:3], 016; GFX9-NEXT: s_endpgm17;18; GFX9ARCH-SDAG-LABEL: workgroup_ids_kernel:19; GFX9ARCH-SDAG: ; %bb.0: ; %.entry20; GFX9ARCH-SDAG-NEXT: s_lshr_b32 s0, ttmp7, 1621; GFX9ARCH-SDAG-NEXT: s_and_b32 s1, ttmp7, 0xffff22; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, ttmp923; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v1, s124; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v2, s025; GFX9ARCH-SDAG-NEXT: buffer_store_dwordx3 v[0:2], off, s[0:3], 026; GFX9ARCH-SDAG-NEXT: s_endpgm27;28; GFX9ARCH-GISEL-LABEL: workgroup_ids_kernel:29; GFX9ARCH-GISEL: ; %bb.0: ; %.entry30; GFX9ARCH-GISEL-NEXT: s_mov_b32 s0, ttmp931; GFX9ARCH-GISEL-NEXT: s_and_b32 s1, ttmp7, 0xffff32; GFX9ARCH-GISEL-NEXT: s_lshr_b32 s2, ttmp7, 1633; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, s034; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v1, s135; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v2, s236; GFX9ARCH-GISEL-NEXT: buffer_store_dwordx3 v[0:2], off, s[0:3], 037; GFX9ARCH-GISEL-NEXT: s_endpgm38;39; GFX12-SDAG-LABEL: workgroup_ids_kernel:40; GFX12-SDAG: ; %bb.0: ; %.entry41; GFX12-SDAG-NEXT: s_and_b32 s0, ttmp7, 0xffff42; GFX12-SDAG-NEXT: s_lshr_b32 s1, ttmp7, 1643; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, ttmp9 :: v_dual_mov_b32 v1, s044; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, s145; GFX12-SDAG-NEXT: buffer_store_b96 v[0:2], off, s[0:3], null46; GFX12-SDAG-NEXT: s_endpgm47;48; GFX12-GISEL-LABEL: workgroup_ids_kernel:49; GFX12-GISEL: ; %bb.0: ; %.entry50; GFX12-GISEL-NEXT: s_mov_b32 s0, ttmp951; GFX12-GISEL-NEXT: s_and_b32 s1, ttmp7, 0xffff52; GFX12-GISEL-NEXT: s_lshr_b32 s2, ttmp7, 1653; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s154; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s255; GFX12-GISEL-NEXT: buffer_store_b96 v[0:2], off, s[0:3], null56; GFX12-GISEL-NEXT: s_endpgm57.entry:58 %idx = call i32 @llvm.amdgcn.workgroup.id.x()59 %idy = call i32 @llvm.amdgcn.workgroup.id.y()60 %idz = call i32 @llvm.amdgcn.workgroup.id.z()61 %ielemx = insertelement <3 x i32> poison, i32 %idx, i64 062 %ielemy = insertelement <3 x i32> %ielemx, i32 %idy, i64 163 %ielemz = insertelement <3 x i32> %ielemy, i32 %idz, i64 264 call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> %ielemz, ptr addrspace(8) poison, i32 0, i32 0, i32 0)65 ret void66}67 68define amdgpu_kernel void @caller() {69; GFX9-SDAG-LABEL: caller:70; GFX9-SDAG: ; %bb.0:71; GFX9-SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD072; GFX9-SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD173; GFX9-SDAG-NEXT: s_mov_b32 s38, -174; GFX9-SDAG-NEXT: s_mov_b32 s39, 0xe0000075; GFX9-SDAG-NEXT: s_add_u32 s36, s36, s1176; GFX9-SDAG-NEXT: s_addc_u32 s37, s37, 077; GFX9-SDAG-NEXT: s_mov_b32 s12, s878; GFX9-SDAG-NEXT: s_add_u32 s8, s4, 3679; GFX9-SDAG-NEXT: s_addc_u32 s9, s5, 080; GFX9-SDAG-NEXT: s_getpc_b64 s[4:5]81; GFX9-SDAG-NEXT: s_add_u32 s4, s4, callee@gotpcrel32@lo+482; GFX9-SDAG-NEXT: s_addc_u32 s5, s5, callee@gotpcrel32@hi+1283; GFX9-SDAG-NEXT: s_load_dwordx2 s[14:15], s[4:5], 0x084; GFX9-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]85; GFX9-SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v286; GFX9-SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v187; GFX9-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]88; GFX9-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]89; GFX9-SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]90; GFX9-SDAG-NEXT: v_or3_b32 v31, v0, v1, v291; GFX9-SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]92; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, s1293; GFX9-SDAG-NEXT: s_mov_b32 s32, 094; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)95; GFX9-SDAG-NEXT: s_swappc_b64 s[30:31], s[14:15]96; GFX9-SDAG-NEXT: s_endpgm97;98; GFX9-GISEL-LABEL: caller:99; GFX9-GISEL: ; %bb.0:100; GFX9-GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0101; GFX9-GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1102; GFX9-GISEL-NEXT: s_mov_b32 s38, -1103; GFX9-GISEL-NEXT: s_mov_b32 s39, 0xe00000104; GFX9-GISEL-NEXT: s_add_u32 s36, s36, s11105; GFX9-GISEL-NEXT: s_addc_u32 s37, s37, 0106; GFX9-GISEL-NEXT: s_mov_b32 s14, s8107; GFX9-GISEL-NEXT: s_add_u32 s8, s4, 36108; GFX9-GISEL-NEXT: s_addc_u32 s9, s5, 0109; GFX9-GISEL-NEXT: s_mov_b64 s[12:13], s[0:1]110; GFX9-GISEL-NEXT: s_getpc_b64 s[0:1]111; GFX9-GISEL-NEXT: s_add_u32 s0, s0, callee@gotpcrel32@lo+4112; GFX9-GISEL-NEXT: s_addc_u32 s1, s1, callee@gotpcrel32@hi+12113; GFX9-GISEL-NEXT: s_load_dwordx2 s[16:17], s[0:1], 0x0114; GFX9-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]115; GFX9-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]116; GFX9-GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1117; GFX9-GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v2118; GFX9-GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]119; GFX9-GISEL-NEXT: v_or3_b32 v31, v0, v1, v2120; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, s14121; GFX9-GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]122; GFX9-GISEL-NEXT: s_mov_b64 s[4:5], s[12:13]123; GFX9-GISEL-NEXT: s_mov_b32 s12, s14124; GFX9-GISEL-NEXT: s_mov_b32 s32, 0125; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)126; GFX9-GISEL-NEXT: s_swappc_b64 s[30:31], s[16:17]127; GFX9-GISEL-NEXT: s_endpgm128;129; GFX9ARCH-SDAG-LABEL: caller:130; GFX9ARCH-SDAG: ; %bb.0:131; GFX9ARCH-SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0132; GFX9ARCH-SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1133; GFX9ARCH-SDAG-NEXT: s_mov_b32 s38, -1134; GFX9ARCH-SDAG-NEXT: s_mov_b32 s39, 0xe00000135; GFX9ARCH-SDAG-NEXT: s_add_u32 s36, s36, s8136; GFX9ARCH-SDAG-NEXT: s_addc_u32 s37, s37, 0137; GFX9ARCH-SDAG-NEXT: s_add_u32 s8, s4, 36138; GFX9ARCH-SDAG-NEXT: s_addc_u32 s9, s5, 0139; GFX9ARCH-SDAG-NEXT: s_getpc_b64 s[4:5]140; GFX9ARCH-SDAG-NEXT: s_add_u32 s4, s4, callee@gotpcrel32@lo+4141; GFX9ARCH-SDAG-NEXT: s_addc_u32 s5, s5, callee@gotpcrel32@hi+12142; GFX9ARCH-SDAG-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x0143; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]144; GFX9ARCH-SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v2145; GFX9ARCH-SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v1146; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]147; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]148; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]149; GFX9ARCH-SDAG-NEXT: v_or3_b32 v31, v0, v1, v2150; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]151; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, ttmp9152; GFX9ARCH-SDAG-NEXT: s_mov_b32 s32, 0153; GFX9ARCH-SDAG-NEXT: s_waitcnt lgkmcnt(0)154; GFX9ARCH-SDAG-NEXT: s_swappc_b64 s[30:31], s[12:13]155; GFX9ARCH-SDAG-NEXT: s_endpgm156;157; GFX9ARCH-GISEL-LABEL: caller:158; GFX9ARCH-GISEL: ; %bb.0:159; GFX9ARCH-GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0160; GFX9ARCH-GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1161; GFX9ARCH-GISEL-NEXT: s_mov_b32 s38, -1162; GFX9ARCH-GISEL-NEXT: s_mov_b32 s39, 0xe00000163; GFX9ARCH-GISEL-NEXT: s_add_u32 s36, s36, s8164; GFX9ARCH-GISEL-NEXT: s_addc_u32 s37, s37, 0165; GFX9ARCH-GISEL-NEXT: s_add_u32 s8, s4, 36166; GFX9ARCH-GISEL-NEXT: s_addc_u32 s9, s5, 0167; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[12:13], s[0:1]168; GFX9ARCH-GISEL-NEXT: s_getpc_b64 s[0:1]169; GFX9ARCH-GISEL-NEXT: s_add_u32 s0, s0, callee@gotpcrel32@lo+4170; GFX9ARCH-GISEL-NEXT: s_addc_u32 s1, s1, callee@gotpcrel32@hi+12171; GFX9ARCH-GISEL-NEXT: s_load_dwordx2 s[14:15], s[0:1], 0x0172; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]173; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]174; GFX9ARCH-GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1175; GFX9ARCH-GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v2176; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]177; GFX9ARCH-GISEL-NEXT: v_or3_b32 v31, v0, v1, v2178; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, ttmp9179; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]180; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[4:5], s[12:13]181; GFX9ARCH-GISEL-NEXT: s_mov_b32 s32, 0182; GFX9ARCH-GISEL-NEXT: s_waitcnt lgkmcnt(0)183; GFX9ARCH-GISEL-NEXT: s_swappc_b64 s[30:31], s[14:15]184; GFX9ARCH-GISEL-NEXT: s_endpgm185;186; GFX12-SDAG-LABEL: caller:187; GFX12-SDAG: ; %bb.0:188; GFX12-SDAG-NEXT: v_dual_mov_b32 v31, v0 :: v_dual_mov_b32 v0, ttmp9189; GFX12-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]190; GFX12-SDAG-NEXT: s_mov_b64 s[8:9], s[4:5]191; GFX12-SDAG-NEXT: s_mov_b32 s13, callee@abs32@hi192; GFX12-SDAG-NEXT: s_mov_b32 s12, callee@abs32@lo193; GFX12-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]194; GFX12-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]195; GFX12-SDAG-NEXT: s_mov_b32 s32, 0196; GFX12-SDAG-NEXT: s_swappc_b64 s[30:31], s[12:13]197; GFX12-SDAG-NEXT: s_endpgm198;199; GFX12-GISEL-LABEL: caller:200; GFX12-GISEL: ; %bb.0:201; GFX12-GISEL-NEXT: v_dual_mov_b32 v31, v0 :: v_dual_mov_b32 v0, ttmp9202; GFX12-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]203; GFX12-GISEL-NEXT: s_mov_b64 s[8:9], s[4:5]204; GFX12-GISEL-NEXT: s_mov_b32 s12, callee@abs32@lo205; GFX12-GISEL-NEXT: s_mov_b32 s13, callee@abs32@hi206; GFX12-GISEL-NEXT: s_mov_b64 s[4:5], s[0:1]207; GFX12-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]208; GFX12-GISEL-NEXT: s_mov_b32 s32, 0209; GFX12-GISEL-NEXT: s_swappc_b64 s[30:31], s[12:13]210; GFX12-GISEL-NEXT: s_endpgm211 %idx = call i32 @llvm.amdgcn.workgroup.id.x()212 call void @callee(i32 %idx) #0213 ret void214}215 216declare void @callee(i32) #0217 218define void @workgroup_ids_device_func(ptr addrspace(1) %outx, ptr addrspace(1) %outy, ptr addrspace(1) %outz) {219; GFX9-LABEL: workgroup_ids_device_func:220; GFX9: ; %bb.0:221; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)222; GFX9-NEXT: v_mov_b32_e32 v6, s12223; GFX9-NEXT: global_store_dword v[0:1], v6, off224; GFX9-NEXT: s_waitcnt vmcnt(0)225; GFX9-NEXT: v_mov_b32_e32 v0, s13226; GFX9-NEXT: global_store_dword v[2:3], v0, off227; GFX9-NEXT: s_waitcnt vmcnt(0)228; GFX9-NEXT: v_mov_b32_e32 v0, s14229; GFX9-NEXT: global_store_dword v[4:5], v0, off230; GFX9-NEXT: s_waitcnt vmcnt(0)231; GFX9-NEXT: s_setpc_b64 s[30:31]232;233; GFX9ARCH-SDAG-LABEL: workgroup_ids_device_func:234; GFX9ARCH-SDAG: ; %bb.0:235; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)236; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v6, ttmp9237; GFX9ARCH-SDAG-NEXT: s_and_b32 s4, ttmp7, 0xffff238; GFX9ARCH-SDAG-NEXT: global_store_dword v[0:1], v6, off239; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0)240; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, s4241; GFX9ARCH-SDAG-NEXT: s_lshr_b32 s4, ttmp7, 16242; GFX9ARCH-SDAG-NEXT: global_store_dword v[2:3], v0, off243; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0)244; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, s4245; GFX9ARCH-SDAG-NEXT: global_store_dword v[4:5], v0, off246; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0)247; GFX9ARCH-SDAG-NEXT: s_setpc_b64 s[30:31]248;249; GFX9ARCH-GISEL-LABEL: workgroup_ids_device_func:250; GFX9ARCH-GISEL: ; %bb.0:251; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)252; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v6, ttmp9253; GFX9ARCH-GISEL-NEXT: s_and_b32 s4, ttmp7, 0xffff254; GFX9ARCH-GISEL-NEXT: s_lshr_b32 s5, ttmp7, 16255; GFX9ARCH-GISEL-NEXT: global_store_dword v[0:1], v6, off256; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0)257; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, s4258; GFX9ARCH-GISEL-NEXT: global_store_dword v[2:3], v0, off259; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0)260; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, s5261; GFX9ARCH-GISEL-NEXT: global_store_dword v[4:5], v0, off262; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0)263; GFX9ARCH-GISEL-NEXT: s_setpc_b64 s[30:31]264;265; GFX12-LABEL: workgroup_ids_device_func:266; GFX12: ; %bb.0:267; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0268; GFX12-NEXT: s_wait_expcnt 0x0269; GFX12-NEXT: s_wait_samplecnt 0x0270; GFX12-NEXT: s_wait_bvhcnt 0x0271; GFX12-NEXT: s_wait_kmcnt 0x0272; GFX12-NEXT: s_and_b32 s0, ttmp7, 0xffff273; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)274; GFX12-NEXT: v_dual_mov_b32 v6, ttmp9 :: v_dual_mov_b32 v7, s0275; GFX12-NEXT: s_lshr_b32 s1, ttmp7, 16276; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)277; GFX12-NEXT: v_mov_b32_e32 v8, s1278; GFX12-NEXT: s_wait_storecnt 0x0279; GFX12-NEXT: global_store_b32 v[0:1], v6, off scope:SCOPE_SYS280; GFX12-NEXT: s_wait_storecnt 0x0281; GFX12-NEXT: global_store_b32 v[2:3], v7, off scope:SCOPE_SYS282; GFX12-NEXT: s_wait_storecnt 0x0283; GFX12-NEXT: global_store_b32 v[4:5], v8, off scope:SCOPE_SYS284; GFX12-NEXT: s_wait_storecnt 0x0285; GFX12-NEXT: s_setpc_b64 s[30:31]286 %id.x = call i32 @llvm.amdgcn.workgroup.id.x()287 %id.y = call i32 @llvm.amdgcn.workgroup.id.y()288 %id.z = call i32 @llvm.amdgcn.workgroup.id.z()289 store volatile i32 %id.x, ptr addrspace(1) %outx290 store volatile i32 %id.y, ptr addrspace(1) %outy291 store volatile i32 %id.z, ptr addrspace(1) %outz292 ret void293}294 295declare i32 @llvm.amdgcn.workgroup.id.x()296declare i32 @llvm.amdgcn.workgroup.id.y()297declare i32 @llvm.amdgcn.workgroup.id.z()298declare void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32>, ptr addrspace(8), i32, i32, i32 immarg)299 300attributes #0 = { nounwind "amdgpu-no-workgroup-id-y" "amdgpu-no-cluster-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-cluster-id-z" }301;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:302; GFX9ARCH: {{.*}}303