106 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -mattr=-xnack < %s | FileCheck -check-prefixes=GFX9 %s3; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12 %s4 5; Check lowering of some large extractelement that use the stack6; instead of register indexing.7 8define i32 @v_extract_v64i32_varidx(ptr addrspace(1) %ptr, i32 %idx) {9; GFX9-LABEL: v_extract_v64i32_varidx:10; GFX9: ; %bb.0:11; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12; GFX9-NEXT: v_and_b32_e32 v2, 63, v213; GFX9-NEXT: v_lshlrev_b32_e32 v2, 2, v214; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v215; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc16; GFX9-NEXT: global_load_dword v0, v[0:1], off17; GFX9-NEXT: s_waitcnt vmcnt(0)18; GFX9-NEXT: s_setpc_b64 s[30:31]19;20; GFX12-LABEL: v_extract_v64i32_varidx:21; GFX12: ; %bb.0:22; GFX12-NEXT: s_wait_loadcnt_dscnt 0x023; GFX12-NEXT: s_wait_expcnt 0x024; GFX12-NEXT: s_wait_samplecnt 0x025; GFX12-NEXT: s_wait_bvhcnt 0x026; GFX12-NEXT: s_wait_kmcnt 0x027; GFX12-NEXT: v_and_b32_e32 v2, 63, v228; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)29; GFX12-NEXT: v_lshlrev_b32_e32 v2, 2, v230; GFX12-NEXT: v_add_co_u32 v0, vcc_lo, v0, v231; GFX12-NEXT: s_wait_alu depctr_va_vcc(0)32; GFX12-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo33; GFX12-NEXT: global_load_b32 v0, v[0:1], off34; GFX12-NEXT: s_wait_loadcnt 0x035; GFX12-NEXT: s_setpc_b64 s[30:31]36 %vec = load <64 x i32>, ptr addrspace(1) %ptr37 %elt = extractelement <64 x i32> %vec, i32 %idx38 ret i32 %elt39}40 41define i16 @v_extract_v128i16_varidx(ptr addrspace(1) %ptr, i32 %idx) {42; GFX9-LABEL: v_extract_v128i16_varidx:43; GFX9: ; %bb.0:44; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)45; GFX9-NEXT: v_and_b32_e32 v2, 0x7f, v246; GFX9-NEXT: v_lshlrev_b32_e32 v2, 1, v247; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v248; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc49; GFX9-NEXT: global_load_ushort v0, v[0:1], off50; GFX9-NEXT: s_waitcnt vmcnt(0)51; GFX9-NEXT: s_setpc_b64 s[30:31]52;53; GFX12-LABEL: v_extract_v128i16_varidx:54; GFX12: ; %bb.0:55; GFX12-NEXT: s_wait_loadcnt_dscnt 0x056; GFX12-NEXT: s_wait_expcnt 0x057; GFX12-NEXT: s_wait_samplecnt 0x058; GFX12-NEXT: s_wait_bvhcnt 0x059; GFX12-NEXT: s_wait_kmcnt 0x060; GFX12-NEXT: v_and_b32_e32 v2, 0x7f, v261; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)62; GFX12-NEXT: v_lshlrev_b32_e32 v2, 1, v263; GFX12-NEXT: v_add_co_u32 v0, vcc_lo, v0, v264; GFX12-NEXT: s_wait_alu depctr_va_vcc(0)65; GFX12-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo66; GFX12-NEXT: global_load_u16 v0, v[0:1], off67; GFX12-NEXT: s_wait_loadcnt 0x068; GFX12-NEXT: s_setpc_b64 s[30:31]69 %vec = load <128 x i16>, ptr addrspace(1) %ptr70 %elt = extractelement <128 x i16> %vec, i32 %idx71 ret i16 %elt72}73 74define i64 @v_extract_v32i64_varidx(ptr addrspace(1) %ptr, i32 %idx) {75; GFX9-LABEL: v_extract_v32i64_varidx:76; GFX9: ; %bb.0:77; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)78; GFX9-NEXT: v_and_b32_e32 v2, 31, v279; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v280; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v281; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc82; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off83; GFX9-NEXT: s_waitcnt vmcnt(0)84; GFX9-NEXT: s_setpc_b64 s[30:31]85;86; GFX12-LABEL: v_extract_v32i64_varidx:87; GFX12: ; %bb.0:88; GFX12-NEXT: s_wait_loadcnt_dscnt 0x089; GFX12-NEXT: s_wait_expcnt 0x090; GFX12-NEXT: s_wait_samplecnt 0x091; GFX12-NEXT: s_wait_bvhcnt 0x092; GFX12-NEXT: s_wait_kmcnt 0x093; GFX12-NEXT: v_and_b32_e32 v2, 31, v294; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)95; GFX12-NEXT: v_lshlrev_b32_e32 v2, 3, v296; GFX12-NEXT: v_add_co_u32 v0, vcc_lo, v0, v297; GFX12-NEXT: s_wait_alu depctr_va_vcc(0)98; GFX12-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo99; GFX12-NEXT: global_load_b64 v[0:1], v[0:1], off100; GFX12-NEXT: s_wait_loadcnt 0x0101; GFX12-NEXT: s_setpc_b64 s[30:31]102 %vec = load <32 x i64>, ptr addrspace(1) %ptr103 %elt = extractelement <32 x i64> %vec, i32 %idx104 ret i64 %elt105}106