841 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GCN,GCN-TRUE163; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GCN,GCN-FAKE164; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16,+d16-write-vgpr32 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GFX12-TRUE16,GFX12-TRUE16-D16W325; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16,-d16-write-vgpr32 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GFX12-TRUE16,GFX12-TRUE16-D16W166; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -mattr=+real-true16 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GFX1250,GFX1250-TRUE167; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -mattr=-real-true16 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GFX1250,GFX1250-FAKE168 9define void @spill_i16_alu() {10; GCN-TRUE16-LABEL: spill_i16_alu:11; GCN-TRUE16: ; %bb.0: ; %entry12; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 glc dlc14; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)15; GCN-TRUE16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l16; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 ; 2-byte Folded Spill17; GCN-TRUE16-NEXT: ;;#ASMSTART18; GCN-TRUE16-NEXT: ;;#ASMEND19; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 ; 2-byte Folded Reload20; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)21; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 dlc22; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x023; GCN-TRUE16-NEXT: s_setpc_b64 s[30:31]24;25; GCN-FAKE16-LABEL: spill_i16_alu:26; GCN-FAKE16: ; %bb.0: ; %entry27; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)28; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 glc dlc29; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)30; GCN-FAKE16-NEXT: v_add_nc_u16 v0, 0x7b, v031; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:4 ; 4-byte Folded Spill32; GCN-FAKE16-NEXT: ;;#ASMSTART33; GCN-FAKE16-NEXT: ;;#ASMEND34; GCN-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:4 ; 4-byte Folded Reload35; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)36; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 dlc37; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x038; GCN-FAKE16-NEXT: s_setpc_b64 s[30:31]39;40; GFX12-TRUE16-LABEL: spill_i16_alu:41; GFX12-TRUE16: ; %bb.0: ; %entry42; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x043; GFX12-TRUE16-NEXT: s_wait_expcnt 0x044; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x045; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x046; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x047; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 scope:SCOPE_SYS48; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x049; GFX12-TRUE16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l50; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 ; 2-byte Folded Spill51; GFX12-TRUE16-NEXT: ;;#ASMSTART52; GFX12-TRUE16-NEXT: ;;#ASMEND53; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 th:TH_LOAD_LU ; 2-byte Folded Reload54; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x055; GFX12-TRUE16-NEXT: s_wait_storecnt 0x056; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS57; GFX12-TRUE16-NEXT: s_wait_storecnt 0x058; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]59;60; GFX1250-TRUE16-LABEL: spill_i16_alu:61; GFX1250-TRUE16: ; %bb.0: ; %entry62; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x063; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x064; GFX1250-TRUE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS65; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x066; GFX1250-TRUE16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l67; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 ; 2-byte Folded Spill68; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x069; GFX1250-TRUE16-NEXT: ;;#ASMSTART70; GFX1250-TRUE16-NEXT: ;;#ASMEND71; GFX1250-TRUE16-NEXT: scratch_load_u16 v1, off, s32 offset:2 th:TH_LOAD_LU ; 2-byte Folded Reload72; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x073; GFX1250-TRUE16-NEXT: v_mov_b16_e32 v0.l, v1.l74; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x075; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS76; GFX1250-TRUE16-NEXT: s_wait_storecnt 0x077; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31]78;79; GFX1250-FAKE16-LABEL: spill_i16_alu:80; GFX1250-FAKE16: ; %bb.0: ; %entry81; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x082; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x083; GFX1250-FAKE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS84; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x085; GFX1250-FAKE16-NEXT: v_add_nc_u16 v0, 0x7b, v086; GFX1250-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:4 ; 4-byte Folded Spill87; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x088; GFX1250-FAKE16-NEXT: ;;#ASMSTART89; GFX1250-FAKE16-NEXT: ;;#ASMEND90; GFX1250-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:4 th:TH_LOAD_LU ; 4-byte Folded Reload91; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x092; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x093; GFX1250-FAKE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS94; GFX1250-FAKE16-NEXT: s_wait_storecnt 0x095; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31]96entry:97 %alloca = alloca i16, i32 1, align 4, addrspace(5)98 99 %aptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0100 %a = load volatile i16, ptr addrspace(5) %aptr101 %add = add i16 %a, 123102 103 ; Force %a to spill.104 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()105 106 %outptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0107 store volatile i16 %add, ptr addrspace(5) %outptr108 109 ret void110}111 112define void @spill_i16_alu_two_vals() {113; GCN-TRUE16-LABEL: spill_i16_alu_two_vals:114; GCN-TRUE16: ; %bb.0: ; %entry115; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)116; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 glc dlc117; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)118; GCN-TRUE16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l119; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:6 ; 2-byte Folded Spill120; GCN-TRUE16-NEXT: ;;#ASMSTART121; GCN-TRUE16-NEXT: ;;#ASMEND122; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:4 glc dlc123; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)124; GCN-TRUE16-NEXT: scratch_load_d16_hi_b16 v0, off, s32 offset:6 ; 2-byte Folded Reload125; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)126; GCN-TRUE16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l127; GCN-TRUE16-NEXT: scratch_store_d16_hi_b16 off, v0, s32 dlc128; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0129; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:4 dlc130; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0131; GCN-TRUE16-NEXT: s_setpc_b64 s[30:31]132;133; GCN-FAKE16-LABEL: spill_i16_alu_two_vals:134; GCN-FAKE16: ; %bb.0: ; %entry135; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)136; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 glc dlc137; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)138; GCN-FAKE16-NEXT: v_add_nc_u16 v0, 0x7b, v0139; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill140; GCN-FAKE16-NEXT: ;;#ASMSTART141; GCN-FAKE16-NEXT: ;;#ASMEND142; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 offset:4 glc dlc143; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)144; GCN-FAKE16-NEXT: scratch_load_b32 v1, off, s32 offset:8 ; 4-byte Folded Reload145; GCN-FAKE16-NEXT: v_add_nc_u16 v0, 0x7b, v0146; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)147; GCN-FAKE16-NEXT: scratch_store_b16 off, v1, s32 dlc148; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0149; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 offset:4 dlc150; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0151; GCN-FAKE16-NEXT: s_setpc_b64 s[30:31]152;153; GFX12-TRUE16-D16W32-LABEL: spill_i16_alu_two_vals:154; GFX12-TRUE16-D16W32: ; %bb.0: ; %entry155; GFX12-TRUE16-D16W32-NEXT: s_wait_loadcnt_dscnt 0x0156; GFX12-TRUE16-D16W32-NEXT: s_wait_expcnt 0x0157; GFX12-TRUE16-D16W32-NEXT: s_wait_samplecnt 0x0158; GFX12-TRUE16-D16W32-NEXT: s_wait_bvhcnt 0x0159; GFX12-TRUE16-D16W32-NEXT: s_wait_kmcnt 0x0160; GFX12-TRUE16-D16W32-NEXT: scratch_load_d16_b16 v0, off, s32 scope:SCOPE_SYS161; GFX12-TRUE16-D16W32-NEXT: s_wait_loadcnt 0x0162; GFX12-TRUE16-D16W32-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l163; GFX12-TRUE16-D16W32-NEXT: scratch_store_b16 off, v0, s32 offset:6 ; 2-byte Folded Spill164; GFX12-TRUE16-D16W32-NEXT: ;;#ASMSTART165; GFX12-TRUE16-D16W32-NEXT: ;;#ASMEND166; GFX12-TRUE16-D16W32-NEXT: scratch_load_d16_b16 v0, off, s32 offset:4 scope:SCOPE_SYS167; GFX12-TRUE16-D16W32-NEXT: s_wait_loadcnt 0x0168; GFX12-TRUE16-D16W32-NEXT: scratch_load_d16_hi_b16 v0, off, s32 offset:6 th:TH_LOAD_LU ; 2-byte Folded Reload169; GFX12-TRUE16-D16W32-NEXT: s_wait_loadcnt 0x0170; GFX12-TRUE16-D16W32-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l171; GFX12-TRUE16-D16W32-NEXT: s_wait_storecnt 0x0172; GFX12-TRUE16-D16W32-NEXT: scratch_store_d16_hi_b16 off, v0, s32 scope:SCOPE_SYS173; GFX12-TRUE16-D16W32-NEXT: s_wait_storecnt 0x0174; GFX12-TRUE16-D16W32-NEXT: scratch_store_b16 off, v0, s32 offset:4 scope:SCOPE_SYS175; GFX12-TRUE16-D16W32-NEXT: s_wait_storecnt 0x0176; GFX12-TRUE16-D16W32-NEXT: s_setpc_b64 s[30:31]177;178; GFX12-TRUE16-D16W16-LABEL: spill_i16_alu_two_vals:179; GFX12-TRUE16-D16W16: ; %bb.0: ; %entry180; GFX12-TRUE16-D16W16-NEXT: s_wait_loadcnt_dscnt 0x0181; GFX12-TRUE16-D16W16-NEXT: s_wait_expcnt 0x0182; GFX12-TRUE16-D16W16-NEXT: s_wait_samplecnt 0x0183; GFX12-TRUE16-D16W16-NEXT: s_wait_bvhcnt 0x0184; GFX12-TRUE16-D16W16-NEXT: s_wait_kmcnt 0x0185; GFX12-TRUE16-D16W16-NEXT: scratch_load_d16_b16 v0, off, s32 scope:SCOPE_SYS186; GFX12-TRUE16-D16W16-NEXT: s_wait_loadcnt 0x0187; GFX12-TRUE16-D16W16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l188; GFX12-TRUE16-D16W16-NEXT: scratch_store_b16 off, v0, s32 offset:6 ; 2-byte Folded Spill189; GFX12-TRUE16-D16W16-NEXT: ;;#ASMSTART190; GFX12-TRUE16-D16W16-NEXT: ;;#ASMEND191; GFX12-TRUE16-D16W16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:4 scope:SCOPE_SYS192; GFX12-TRUE16-D16W16-NEXT: s_wait_loadcnt 0x0193; GFX12-TRUE16-D16W16-NEXT: scratch_load_d16_hi_b16 v0, off, s32 offset:6 th:TH_LOAD_LU ; 2-byte Folded Reload194; GFX12-TRUE16-D16W16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l195; GFX12-TRUE16-D16W16-NEXT: s_wait_loadcnt 0x0196; GFX12-TRUE16-D16W16-NEXT: s_wait_storecnt 0x0197; GFX12-TRUE16-D16W16-NEXT: scratch_store_d16_hi_b16 off, v0, s32 scope:SCOPE_SYS198; GFX12-TRUE16-D16W16-NEXT: s_wait_storecnt 0x0199; GFX12-TRUE16-D16W16-NEXT: scratch_store_b16 off, v0, s32 offset:4 scope:SCOPE_SYS200; GFX12-TRUE16-D16W16-NEXT: s_wait_storecnt 0x0201; GFX12-TRUE16-D16W16-NEXT: s_setpc_b64 s[30:31]202;203; GFX1250-TRUE16-LABEL: spill_i16_alu_two_vals:204; GFX1250-TRUE16: ; %bb.0: ; %entry205; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0206; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0207; GFX1250-TRUE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS208; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0209; GFX1250-TRUE16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l210; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:6 ; 2-byte Folded Spill211; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x0212; GFX1250-TRUE16-NEXT: ;;#ASMSTART213; GFX1250-TRUE16-NEXT: ;;#ASMEND214; GFX1250-TRUE16-NEXT: scratch_load_u16 v0, off, s32 offset:4 scope:SCOPE_SYS215; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0216; GFX1250-TRUE16-NEXT: scratch_load_u16 v1, off, s32 offset:6 th:TH_LOAD_LU ; 2-byte Folded Reload217; GFX1250-TRUE16-NEXT: v_add_nc_u16 v0.l, 0x7b, v0.l218; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0219; GFX1250-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l220; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x0221; GFX1250-TRUE16-NEXT: scratch_store_d16_hi_b16 off, v0, s32 scope:SCOPE_SYS222; GFX1250-TRUE16-NEXT: s_wait_storecnt 0x0223; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x0224; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:4 scope:SCOPE_SYS225; GFX1250-TRUE16-NEXT: s_wait_storecnt 0x0226; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31]227;228; GFX1250-FAKE16-LABEL: spill_i16_alu_two_vals:229; GFX1250-FAKE16: ; %bb.0: ; %entry230; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0231; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0232; GFX1250-FAKE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS233; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0234; GFX1250-FAKE16-NEXT: v_add_nc_u16 v0, 0x7b, v0235; GFX1250-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill236; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x0237; GFX1250-FAKE16-NEXT: ;;#ASMSTART238; GFX1250-FAKE16-NEXT: ;;#ASMEND239; GFX1250-FAKE16-NEXT: scratch_load_u16 v0, off, s32 offset:4 scope:SCOPE_SYS240; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0241; GFX1250-FAKE16-NEXT: scratch_load_b32 v1, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload242; GFX1250-FAKE16-NEXT: v_add_nc_u16 v0, 0x7b, v0243; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x0244; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0245; GFX1250-FAKE16-NEXT: scratch_store_b16 off, v1, s32 scope:SCOPE_SYS246; GFX1250-FAKE16-NEXT: s_wait_storecnt 0x0247; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x0248; GFX1250-FAKE16-NEXT: scratch_store_b16 off, v0, s32 offset:4 scope:SCOPE_SYS249; GFX1250-FAKE16-NEXT: s_wait_storecnt 0x0250; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31]251entry:252 %alloca = alloca i16, i32 1, align 4, addrspace(5)253 %alloca2 = alloca i16, i32 1, align 4, addrspace(5)254 255 %aptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0256 %a = load volatile i16, ptr addrspace(5) %aptr257 %add = add i16 %a, 123258 259 ; Force %a to spill.260 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()261 262 %bptr = getelementptr i16, ptr addrspace(5) %alloca2, i32 0263 %b = load volatile i16, ptr addrspace(5) %bptr264 %badd = add i16 %b, 123265 %outptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0266 store volatile i16 %add, ptr addrspace(5) %outptr267 %outptr2 = getelementptr i16, ptr addrspace(5) %alloca2, i32 0268 store volatile i16 %badd, ptr addrspace(5) %outptr2269 270 ret void271}272 273; Tests after this do not actually test 16 bit spills because there is no use of VGPR_16. They could demonstrate 16 bit spills if we update the instructions to use VGPR_16 instead of VGPR_32274 275define void @spill_i16() {276; GCN-TRUE16-LABEL: spill_i16:277; GCN-TRUE16: ; %bb.0: ; %entry278; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)279; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 glc dlc280; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)281; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 ; 2-byte Folded Spill282; GCN-TRUE16-NEXT: ;;#ASMSTART283; GCN-TRUE16-NEXT: ;;#ASMEND284; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 ; 2-byte Folded Reload285; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)286; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 dlc287; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0288; GCN-TRUE16-NEXT: s_setpc_b64 s[30:31]289;290; GCN-FAKE16-LABEL: spill_i16:291; GCN-FAKE16: ; %bb.0: ; %entry292; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)293; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 glc dlc294; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)295; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:4 ; 4-byte Folded Spill296; GCN-FAKE16-NEXT: ;;#ASMSTART297; GCN-FAKE16-NEXT: ;;#ASMEND298; GCN-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:4 ; 4-byte Folded Reload299; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)300; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 dlc301; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0302; GCN-FAKE16-NEXT: s_setpc_b64 s[30:31]303;304; GFX12-TRUE16-LABEL: spill_i16:305; GFX12-TRUE16: ; %bb.0: ; %entry306; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0307; GFX12-TRUE16-NEXT: s_wait_expcnt 0x0308; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0309; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0310; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0311; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 scope:SCOPE_SYS312; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0313; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 ; 2-byte Folded Spill314; GFX12-TRUE16-NEXT: ;;#ASMSTART315; GFX12-TRUE16-NEXT: ;;#ASMEND316; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 th:TH_LOAD_LU ; 2-byte Folded Reload317; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0318; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0319; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS320; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0321; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]322;323; GFX1250-LABEL: spill_i16:324; GFX1250: ; %bb.0: ; %entry325; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0326; GFX1250-NEXT: s_wait_kmcnt 0x0327; GFX1250-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS328; GFX1250-NEXT: s_wait_loadcnt 0x0329; GFX1250-NEXT: scratch_store_b32 off, v0, s32 offset:4 ; 4-byte Folded Spill330; GFX1250-NEXT: s_wait_xcnt 0x0331; GFX1250-NEXT: ;;#ASMSTART332; GFX1250-NEXT: ;;#ASMEND333; GFX1250-NEXT: scratch_load_b32 v0, off, s32 offset:4 th:TH_LOAD_LU ; 4-byte Folded Reload334; GFX1250-NEXT: s_wait_xcnt 0x0335; GFX1250-NEXT: s_wait_loadcnt 0x0336; GFX1250-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS337; GFX1250-NEXT: s_wait_storecnt 0x0338; GFX1250-NEXT: s_set_pc_i64 s[30:31]339entry:340 %alloca = alloca i16, i32 1, align 4, addrspace(5)341 342 %aptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0343 %a = load volatile i16, ptr addrspace(5) %aptr344 345 ; Force %a to spill.346 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()347 348 %outptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0349 store volatile i16 %a, ptr addrspace(5) %outptr350 351 ret void352}353 354define void @spill_half() {355; GCN-TRUE16-LABEL: spill_half:356; GCN-TRUE16: ; %bb.0: ; %entry357; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)358; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 glc dlc359; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)360; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 ; 2-byte Folded Spill361; GCN-TRUE16-NEXT: ;;#ASMSTART362; GCN-TRUE16-NEXT: ;;#ASMEND363; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 ; 2-byte Folded Reload364; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)365; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 dlc366; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0367; GCN-TRUE16-NEXT: s_setpc_b64 s[30:31]368;369; GCN-FAKE16-LABEL: spill_half:370; GCN-FAKE16: ; %bb.0: ; %entry371; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)372; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 glc dlc373; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)374; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:4 ; 4-byte Folded Spill375; GCN-FAKE16-NEXT: ;;#ASMSTART376; GCN-FAKE16-NEXT: ;;#ASMEND377; GCN-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:4 ; 4-byte Folded Reload378; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)379; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 dlc380; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0381; GCN-FAKE16-NEXT: s_setpc_b64 s[30:31]382;383; GFX12-TRUE16-LABEL: spill_half:384; GFX12-TRUE16: ; %bb.0: ; %entry385; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0386; GFX12-TRUE16-NEXT: s_wait_expcnt 0x0387; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0388; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0389; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0390; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 scope:SCOPE_SYS391; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0392; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 ; 2-byte Folded Spill393; GFX12-TRUE16-NEXT: ;;#ASMSTART394; GFX12-TRUE16-NEXT: ;;#ASMEND395; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 th:TH_LOAD_LU ; 2-byte Folded Reload396; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0397; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0398; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS399; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0400; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]401;402; GFX1250-LABEL: spill_half:403; GFX1250: ; %bb.0: ; %entry404; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0405; GFX1250-NEXT: s_wait_kmcnt 0x0406; GFX1250-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS407; GFX1250-NEXT: s_wait_loadcnt 0x0408; GFX1250-NEXT: scratch_store_b32 off, v0, s32 offset:4 ; 4-byte Folded Spill409; GFX1250-NEXT: s_wait_xcnt 0x0410; GFX1250-NEXT: ;;#ASMSTART411; GFX1250-NEXT: ;;#ASMEND412; GFX1250-NEXT: scratch_load_b32 v0, off, s32 offset:4 th:TH_LOAD_LU ; 4-byte Folded Reload413; GFX1250-NEXT: s_wait_xcnt 0x0414; GFX1250-NEXT: s_wait_loadcnt 0x0415; GFX1250-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS416; GFX1250-NEXT: s_wait_storecnt 0x0417; GFX1250-NEXT: s_set_pc_i64 s[30:31]418entry:419 %alloca = alloca half, i32 1, align 4, addrspace(5)420 421 %aptr = getelementptr half, ptr addrspace(5) %alloca, i32 0422 %a = load volatile half, ptr addrspace(5) %aptr423 424 ; Force %a to spill.425 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()426 427 %outptr = getelementptr half, ptr addrspace(5) %alloca, i32 0428 store volatile half %a, ptr addrspace(5) %outptr429 430 ret void431}432 433define void @spill_i16_from_v2i16() {434; GCN-TRUE16-LABEL: spill_i16_from_v2i16:435; GCN-TRUE16: ; %bb.0: ; %entry436; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)437; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 glc dlc438; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)439; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:8 ; 2-byte Folded Spill440; GCN-TRUE16-NEXT: ;;#ASMSTART441; GCN-TRUE16-NEXT: ;;#ASMEND442; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:8 ; 2-byte Folded Reload443; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)444; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 dlc445; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0446; GCN-TRUE16-NEXT: s_setpc_b64 s[30:31]447;448; GCN-FAKE16-LABEL: spill_i16_from_v2i16:449; GCN-FAKE16: ; %bb.0: ; %entry450; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)451; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 offset:2 glc dlc452; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)453; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill454; GCN-FAKE16-NEXT: ;;#ASMSTART455; GCN-FAKE16-NEXT: ;;#ASMEND456; GCN-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 ; 4-byte Folded Reload457; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)458; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 dlc459; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0460; GCN-FAKE16-NEXT: s_setpc_b64 s[30:31]461;462; GFX12-TRUE16-LABEL: spill_i16_from_v2i16:463; GFX12-TRUE16: ; %bb.0: ; %entry464; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0465; GFX12-TRUE16-NEXT: s_wait_expcnt 0x0466; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0467; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0468; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0469; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 scope:SCOPE_SYS470; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0471; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:8 ; 2-byte Folded Spill472; GFX12-TRUE16-NEXT: ;;#ASMSTART473; GFX12-TRUE16-NEXT: ;;#ASMEND474; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:8 th:TH_LOAD_LU ; 2-byte Folded Reload475; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0476; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0477; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 scope:SCOPE_SYS478; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0479; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]480;481; GFX1250-LABEL: spill_i16_from_v2i16:482; GFX1250: ; %bb.0: ; %entry483; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0484; GFX1250-NEXT: s_wait_kmcnt 0x0485; GFX1250-NEXT: scratch_load_u16 v0, off, s32 offset:2 scope:SCOPE_SYS486; GFX1250-NEXT: s_wait_loadcnt 0x0487; GFX1250-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill488; GFX1250-NEXT: s_wait_xcnt 0x0489; GFX1250-NEXT: ;;#ASMSTART490; GFX1250-NEXT: ;;#ASMEND491; GFX1250-NEXT: scratch_load_b32 v0, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload492; GFX1250-NEXT: s_wait_xcnt 0x0493; GFX1250-NEXT: s_wait_loadcnt 0x0494; GFX1250-NEXT: scratch_store_b16 off, v0, s32 offset:2 scope:SCOPE_SYS495; GFX1250-NEXT: s_wait_storecnt 0x0496; GFX1250-NEXT: s_set_pc_i64 s[30:31]497entry:498 %alloca = alloca <2 x i16>, i32 2, align 1, addrspace(5)499 500 %aptr = getelementptr i16, ptr addrspace(5) %alloca, i32 1501 %a = load volatile i16, ptr addrspace(5) %aptr502 503 ; Force %a to spill.504 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()505 506 %outptr = getelementptr i16, ptr addrspace(5) %alloca, i32 1507 store volatile i16 %a, ptr addrspace(5) %outptr508 509 ret void510}511 512define void @spill_2xi16_from_v2i16() {513; GCN-TRUE16-LABEL: spill_2xi16_from_v2i16:514; GCN-TRUE16: ; %bb.0: ; %entry515; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)516; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 glc dlc517; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)518; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:8 ; 2-byte Folded Spill519; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 glc dlc520; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)521; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:10 ; 2-byte Folded Spill522; GCN-TRUE16-NEXT: ;;#ASMSTART523; GCN-TRUE16-NEXT: ;;#ASMEND524; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:8 ; 2-byte Folded Reload525; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)526; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 dlc527; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0528; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:10 ; 2-byte Folded Reload529; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)530; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 dlc531; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0532; GCN-TRUE16-NEXT: s_setpc_b64 s[30:31]533;534; GCN-FAKE16-LABEL: spill_2xi16_from_v2i16:535; GCN-FAKE16: ; %bb.0: ; %entry536; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)537; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 offset:2 glc dlc538; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)539; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill540; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 glc dlc541; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)542; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:12 ; 4-byte Folded Spill543; GCN-FAKE16-NEXT: ;;#ASMSTART544; GCN-FAKE16-NEXT: ;;#ASMEND545; GCN-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 ; 4-byte Folded Reload546; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)547; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 dlc548; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0549; GCN-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:12 ; 4-byte Folded Reload550; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)551; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 dlc552; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0553; GCN-FAKE16-NEXT: s_setpc_b64 s[30:31]554;555; GFX12-TRUE16-LABEL: spill_2xi16_from_v2i16:556; GFX12-TRUE16: ; %bb.0: ; %entry557; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0558; GFX12-TRUE16-NEXT: s_wait_expcnt 0x0559; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0560; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0561; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0562; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 scope:SCOPE_SYS563; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0564; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:8 ; 2-byte Folded Spill565; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 scope:SCOPE_SYS566; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0567; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:10 ; 2-byte Folded Spill568; GFX12-TRUE16-NEXT: ;;#ASMSTART569; GFX12-TRUE16-NEXT: ;;#ASMEND570; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:8 th:TH_LOAD_LU ; 2-byte Folded Reload571; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0572; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0573; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 scope:SCOPE_SYS574; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0575; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:10 th:TH_LOAD_LU ; 2-byte Folded Reload576; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0577; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS578; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0579; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]580;581; GFX1250-TRUE16-LABEL: spill_2xi16_from_v2i16:582; GFX1250-TRUE16: ; %bb.0: ; %entry583; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0584; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0585; GFX1250-TRUE16-NEXT: scratch_load_u16 v0, off, s32 offset:2 scope:SCOPE_SYS586; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0587; GFX1250-TRUE16-NEXT: s_clause 0x1 ; 4-byte Folded Spill588; GFX1250-TRUE16-NEXT: scratch_store_b32 off, v0, s32 offset:12589; GFX1250-TRUE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS590; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0591; GFX1250-TRUE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill592; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x0593; GFX1250-TRUE16-NEXT: ;;#ASMSTART594; GFX1250-TRUE16-NEXT: ;;#ASMEND595; GFX1250-TRUE16-NEXT: scratch_load_b32 v0, off, s32 offset:12 th:TH_LOAD_LU ; 4-byte Folded Reload596; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x0597; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0598; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 scope:SCOPE_SYS599; GFX1250-TRUE16-NEXT: s_wait_storecnt 0x0600; GFX1250-TRUE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload601; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0602; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS603; GFX1250-TRUE16-NEXT: s_wait_storecnt 0x0604; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31]605;606; GFX1250-FAKE16-LABEL: spill_2xi16_from_v2i16:607; GFX1250-FAKE16: ; %bb.0: ; %entry608; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0609; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0610; GFX1250-FAKE16-NEXT: scratch_load_u16 v0, off, s32 offset:2 scope:SCOPE_SYS611; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0612; GFX1250-FAKE16-NEXT: s_clause 0x1 ; 4-byte Folded Spill613; GFX1250-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:8614; GFX1250-FAKE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS615; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0616; GFX1250-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:12 ; 4-byte Folded Spill617; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x0618; GFX1250-FAKE16-NEXT: ;;#ASMSTART619; GFX1250-FAKE16-NEXT: ;;#ASMEND620; GFX1250-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload621; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x0622; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0623; GFX1250-FAKE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 scope:SCOPE_SYS624; GFX1250-FAKE16-NEXT: s_wait_storecnt 0x0625; GFX1250-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:12 th:TH_LOAD_LU ; 4-byte Folded Reload626; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0627; GFX1250-FAKE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS628; GFX1250-FAKE16-NEXT: s_wait_storecnt 0x0629; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31]630entry:631 %alloca = alloca <2 x i16>, i32 2, align 1, addrspace(5)632 633 %aptr = getelementptr i16, ptr addrspace(5) %alloca, i32 1634 %a = load volatile i16, ptr addrspace(5) %aptr635 %bptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0636 %b = load volatile i16, ptr addrspace(5) %bptr637 638 ; Force %a to spill.639 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()640 641 %outptr = getelementptr i16, ptr addrspace(5) %alloca, i32 1642 store volatile i16 %a, ptr addrspace(5) %outptr643 %boutptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0644 store volatile i16 %b, ptr addrspace(5) %boutptr645 646 ret void647}648 649define void @spill_2xi16_from_v2i16_one_free_reg() {650; GCN-TRUE16-LABEL: spill_2xi16_from_v2i16_one_free_reg:651; GCN-TRUE16: ; %bb.0: ; %entry652; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)653; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 glc dlc654; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)655; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:8 ; 2-byte Folded Spill656; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 glc dlc657; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)658; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:10 ; 2-byte Folded Spill659; GCN-TRUE16-NEXT: ;;#ASMSTART660; GCN-TRUE16-NEXT: ;;#ASMEND661; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:8 ; 2-byte Folded Reload662; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)663; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 dlc664; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0665; GCN-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:10 ; 2-byte Folded Reload666; GCN-TRUE16-NEXT: s_waitcnt vmcnt(0)667; GCN-TRUE16-NEXT: scratch_store_b16 off, v0, s32 dlc668; GCN-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0669; GCN-TRUE16-NEXT: s_setpc_b64 s[30:31]670;671; GCN-FAKE16-LABEL: spill_2xi16_from_v2i16_one_free_reg:672; GCN-FAKE16: ; %bb.0: ; %entry673; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)674; GCN-FAKE16-NEXT: scratch_load_u16 v7, off, s32 offset:2 glc dlc675; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)676; GCN-FAKE16-NEXT: scratch_load_u16 v0, off, s32 glc dlc677; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)678; GCN-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill679; GCN-FAKE16-NEXT: ;;#ASMSTART680; GCN-FAKE16-NEXT: ;;#ASMEND681; GCN-FAKE16-NEXT: scratch_store_b16 off, v7, s32 offset:2 dlc682; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0683; GCN-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 ; 4-byte Folded Reload684; GCN-FAKE16-NEXT: s_waitcnt vmcnt(0)685; GCN-FAKE16-NEXT: scratch_store_b16 off, v0, s32 dlc686; GCN-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0687; GCN-FAKE16-NEXT: s_setpc_b64 s[30:31]688;689; GFX12-TRUE16-LABEL: spill_2xi16_from_v2i16_one_free_reg:690; GFX12-TRUE16: ; %bb.0: ; %entry691; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0692; GFX12-TRUE16-NEXT: s_wait_expcnt 0x0693; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0694; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0695; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0696; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:2 scope:SCOPE_SYS697; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0698; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:8 ; 2-byte Folded Spill699; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 scope:SCOPE_SYS700; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0701; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:10 ; 2-byte Folded Spill702; GFX12-TRUE16-NEXT: ;;#ASMSTART703; GFX12-TRUE16-NEXT: ;;#ASMEND704; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:8 th:TH_LOAD_LU ; 2-byte Folded Reload705; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0706; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0707; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 scope:SCOPE_SYS708; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0709; GFX12-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s32 offset:10 th:TH_LOAD_LU ; 2-byte Folded Reload710; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0711; GFX12-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS712; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0713; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]714;715; GFX1250-TRUE16-LABEL: spill_2xi16_from_v2i16_one_free_reg:716; GFX1250-TRUE16: ; %bb.0: ; %entry717; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0718; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0719; GFX1250-TRUE16-NEXT: scratch_load_u16 v7, off, s32 offset:2 scope:SCOPE_SYS720; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0721; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x0722; GFX1250-TRUE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS723; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0724; GFX1250-TRUE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill725; GFX1250-TRUE16-NEXT: s_wait_xcnt 0x0726; GFX1250-TRUE16-NEXT: ;;#ASMSTART727; GFX1250-TRUE16-NEXT: ;;#ASMEND728; GFX1250-TRUE16-NEXT: v_mov_b16_e32 v0.l, v7.l729; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 offset:2 scope:SCOPE_SYS730; GFX1250-TRUE16-NEXT: s_wait_storecnt 0x0731; GFX1250-TRUE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload732; GFX1250-TRUE16-NEXT: s_wait_loadcnt 0x0733; GFX1250-TRUE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS734; GFX1250-TRUE16-NEXT: s_wait_storecnt 0x0735; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31]736;737; GFX1250-FAKE16-LABEL: spill_2xi16_from_v2i16_one_free_reg:738; GFX1250-FAKE16: ; %bb.0: ; %entry739; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0740; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0741; GFX1250-FAKE16-NEXT: scratch_load_u16 v7, off, s32 offset:2 scope:SCOPE_SYS742; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0743; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x0744; GFX1250-FAKE16-NEXT: scratch_load_u16 v0, off, s32 scope:SCOPE_SYS745; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0746; GFX1250-FAKE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill747; GFX1250-FAKE16-NEXT: s_wait_xcnt 0x0748; GFX1250-FAKE16-NEXT: ;;#ASMSTART749; GFX1250-FAKE16-NEXT: ;;#ASMEND750; GFX1250-FAKE16-NEXT: scratch_store_b16 off, v7, s32 offset:2 scope:SCOPE_SYS751; GFX1250-FAKE16-NEXT: s_wait_storecnt 0x0752; GFX1250-FAKE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload753; GFX1250-FAKE16-NEXT: s_wait_loadcnt 0x0754; GFX1250-FAKE16-NEXT: scratch_store_b16 off, v0, s32 scope:SCOPE_SYS755; GFX1250-FAKE16-NEXT: s_wait_storecnt 0x0756; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31]757entry:758 %alloca = alloca <2 x i16>, i32 2, align 1, addrspace(5)759 760 %aptr = getelementptr i16, ptr addrspace(5) %alloca, i32 1761 %a = load volatile i16, ptr addrspace(5) %aptr762 %bptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0763 %b = load volatile i16, ptr addrspace(5) %bptr764 765 ; Force %a to spill.766 ; Would not need to spill if the short scratch instructions used vgpr_16767 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6}" ()768 769 %outptr = getelementptr i16, ptr addrspace(5) %alloca, i32 1770 store volatile i16 %a, ptr addrspace(5) %outptr771 %boutptr = getelementptr i16, ptr addrspace(5) %alloca, i32 0772 store volatile i16 %b, ptr addrspace(5) %boutptr773 774 ret void775}776 777define void @spill_v2i16() {778; GCN-LABEL: spill_v2i16:779; GCN: ; %bb.0: ; %entry780; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)781; GCN-NEXT: scratch_load_b32 v0, off, s32 offset:4 glc dlc782; GCN-NEXT: s_waitcnt vmcnt(0)783; GCN-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill784; GCN-NEXT: ;;#ASMSTART785; GCN-NEXT: ;;#ASMEND786; GCN-NEXT: scratch_load_b32 v0, off, s32 offset:8 ; 4-byte Folded Reload787; GCN-NEXT: s_waitcnt vmcnt(0)788; GCN-NEXT: scratch_store_b32 off, v0, s32 offset:4 dlc789; GCN-NEXT: s_waitcnt_vscnt null, 0x0790; GCN-NEXT: s_setpc_b64 s[30:31]791;792; GFX12-TRUE16-LABEL: spill_v2i16:793; GFX12-TRUE16: ; %bb.0: ; %entry794; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0795; GFX12-TRUE16-NEXT: s_wait_expcnt 0x0796; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x0797; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x0798; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0799; GFX12-TRUE16-NEXT: scratch_load_b32 v0, off, s32 offset:4 scope:SCOPE_SYS800; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0801; GFX12-TRUE16-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill802; GFX12-TRUE16-NEXT: ;;#ASMSTART803; GFX12-TRUE16-NEXT: ;;#ASMEND804; GFX12-TRUE16-NEXT: scratch_load_b32 v0, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload805; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0806; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0807; GFX12-TRUE16-NEXT: scratch_store_b32 off, v0, s32 offset:4 scope:SCOPE_SYS808; GFX12-TRUE16-NEXT: s_wait_storecnt 0x0809; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]810;811; GFX1250-LABEL: spill_v2i16:812; GFX1250: ; %bb.0: ; %entry813; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0814; GFX1250-NEXT: s_wait_kmcnt 0x0815; GFX1250-NEXT: scratch_load_b32 v0, off, s32 offset:4 scope:SCOPE_SYS816; GFX1250-NEXT: s_wait_loadcnt 0x0817; GFX1250-NEXT: scratch_store_b32 off, v0, s32 offset:8 ; 4-byte Folded Spill818; GFX1250-NEXT: s_wait_xcnt 0x0819; GFX1250-NEXT: ;;#ASMSTART820; GFX1250-NEXT: ;;#ASMEND821; GFX1250-NEXT: scratch_load_b32 v0, off, s32 offset:8 th:TH_LOAD_LU ; 4-byte Folded Reload822; GFX1250-NEXT: s_wait_xcnt 0x0823; GFX1250-NEXT: s_wait_loadcnt 0x0824; GFX1250-NEXT: scratch_store_b32 off, v0, s32 offset:4 scope:SCOPE_SYS825; GFX1250-NEXT: s_wait_storecnt 0x0826; GFX1250-NEXT: s_set_pc_i64 s[30:31]827entry:828 %alloca = alloca <2 x i16>, i32 2, align 1, addrspace(5)829 830 %aptr = getelementptr <2 x i16>, ptr addrspace(5) %alloca, i32 1831 %a = load volatile <2 x i16>, ptr addrspace(5) %aptr832 833 ; Force %a to spill.834 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()835 836 %outptr = getelementptr <2 x i16>, ptr addrspace(5) %alloca, i32 1837 store volatile <2 x i16> %a, ptr addrspace(5) %outptr838 839 ret void840}841