1125 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -mattr=-unaligned-access-mode < %s | FileCheck -check-prefixes=GCN,GFX900 %s3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -mattr=-unaligned-access-mode -mattr=+enable-flat-scratch < %s | FileCheck -check-prefixes=GCN,FLATSCR %s4; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=-unaligned-access-mode < %s | FileCheck -check-prefixes=GFX10,GFX10_DEFAULT %s5; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=-unaligned-access-mode -mattr=+enable-flat-scratch < %s | FileCheck -check-prefixes=GFX10,FLATSCR_GFX10 %s6; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-unaligned-access-mode,+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s7; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-unaligned-access-mode,-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s8; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-unaligned-access-mode -mattr=+enable-flat-scratch,+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s9; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-unaligned-access-mode -mattr=+enable-flat-scratch,-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s10 11define <2 x half> @chain_hi_to_lo_private() {12; GFX900-LABEL: chain_hi_to_lo_private:13; GFX900: ; %bb.0: ; %bb14; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)15; GFX900-NEXT: buffer_load_ushort v0, off, s[0:3], 0 offset:216; GFX900-NEXT: s_nop 017; GFX900-NEXT: buffer_load_short_d16_hi v0, off, s[0:3], 018; GFX900-NEXT: s_waitcnt vmcnt(0)19; GFX900-NEXT: s_setpc_b64 s[30:31]20;21; FLATSCR-LABEL: chain_hi_to_lo_private:22; FLATSCR: ; %bb.0: ; %bb23; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)24; FLATSCR-NEXT: s_mov_b32 s0, 225; FLATSCR-NEXT: scratch_load_ushort v0, off, s026; FLATSCR-NEXT: s_mov_b32 s0, 027; FLATSCR-NEXT: scratch_load_short_d16_hi v0, off, s028; FLATSCR-NEXT: s_waitcnt vmcnt(0)29; FLATSCR-NEXT: s_setpc_b64 s[30:31]30;31; GFX10_DEFAULT-LABEL: chain_hi_to_lo_private:32; GFX10_DEFAULT: ; %bb.0: ; %bb33; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)34; GFX10_DEFAULT-NEXT: s_clause 0x135; GFX10_DEFAULT-NEXT: buffer_load_ushort v0, off, s[0:3], 0 offset:236; GFX10_DEFAULT-NEXT: buffer_load_short_d16_hi v0, off, s[0:3], 037; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)38; GFX10_DEFAULT-NEXT: s_setpc_b64 s[30:31]39;40; FLATSCR_GFX10-LABEL: chain_hi_to_lo_private:41; FLATSCR_GFX10: ; %bb.0: ; %bb42; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)43; FLATSCR_GFX10-NEXT: s_mov_b32 s0, 244; FLATSCR_GFX10-NEXT: scratch_load_ushort v0, off, s045; FLATSCR_GFX10-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)46; FLATSCR_GFX10-NEXT: s_mov_b32 s0, 047; FLATSCR_GFX10-NEXT: scratch_load_short_d16_hi v0, off, s048; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)49; FLATSCR_GFX10-NEXT: s_setpc_b64 s[30:31]50;51; GFX11-TRUE16-LABEL: chain_hi_to_lo_private:52; GFX11-TRUE16: ; %bb.0: ; %bb53; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)54; GFX11-TRUE16-NEXT: s_mov_b32 s0, 255; GFX11-TRUE16-NEXT: scratch_load_d16_b16 v0, off, s056; GFX11-TRUE16-NEXT: s_mov_b32 s0, 057; GFX11-TRUE16-NEXT: scratch_load_d16_hi_b16 v0, off, s058; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)59; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]60;61; GFX11-FAKE16-LABEL: chain_hi_to_lo_private:62; GFX11-FAKE16: ; %bb.0: ; %bb63; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)64; GFX11-FAKE16-NEXT: s_mov_b32 s0, 265; GFX11-FAKE16-NEXT: scratch_load_u16 v0, off, s066; GFX11-FAKE16-NEXT: s_mov_b32 s0, 067; GFX11-FAKE16-NEXT: scratch_load_d16_hi_b16 v0, off, s068; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)69; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]70bb:71 %gep_lo = getelementptr inbounds half, ptr addrspace(5) null, i64 172 %load_lo = load half, ptr addrspace(5) %gep_lo73 %load_hi = load half, ptr addrspace(5) null74 75 %temp = insertelement <2 x half> poison, half %load_lo, i32 076 %result = insertelement <2 x half> %temp, half %load_hi, i32 177 78 ret <2 x half> %result79}80 81define <2 x half> @chain_hi_to_lo_private_different_bases(ptr addrspace(5) %base_lo, ptr addrspace(5) %base_hi) {82; GFX900-LABEL: chain_hi_to_lo_private_different_bases:83; GFX900: ; %bb.0: ; %bb84; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)85; GFX900-NEXT: buffer_load_ushort v0, v0, s[0:3], 0 offen86; GFX900-NEXT: s_nop 087; GFX900-NEXT: buffer_load_short_d16_hi v0, v1, s[0:3], 0 offen88; GFX900-NEXT: s_waitcnt vmcnt(0)89; GFX900-NEXT: s_setpc_b64 s[30:31]90;91; FLATSCR-LABEL: chain_hi_to_lo_private_different_bases:92; FLATSCR: ; %bb.0: ; %bb93; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)94; FLATSCR-NEXT: scratch_load_ushort v0, v0, off95; FLATSCR-NEXT: s_nop 096; FLATSCR-NEXT: scratch_load_short_d16_hi v0, v1, off97; FLATSCR-NEXT: s_waitcnt vmcnt(0)98; FLATSCR-NEXT: s_setpc_b64 s[30:31]99;100; GFX10_DEFAULT-LABEL: chain_hi_to_lo_private_different_bases:101; GFX10_DEFAULT: ; %bb.0: ; %bb102; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)103; GFX10_DEFAULT-NEXT: s_clause 0x1104; GFX10_DEFAULT-NEXT: buffer_load_ushort v0, v0, s[0:3], 0 offen105; GFX10_DEFAULT-NEXT: buffer_load_short_d16_hi v0, v1, s[0:3], 0 offen106; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)107; GFX10_DEFAULT-NEXT: s_setpc_b64 s[30:31]108;109; FLATSCR_GFX10-LABEL: chain_hi_to_lo_private_different_bases:110; FLATSCR_GFX10: ; %bb.0: ; %bb111; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)112; FLATSCR_GFX10-NEXT: scratch_load_ushort v0, v0, off113; FLATSCR_GFX10-NEXT: scratch_load_short_d16_hi v0, v1, off114; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)115; FLATSCR_GFX10-NEXT: s_setpc_b64 s[30:31]116;117; GFX11-TRUE16-LABEL: chain_hi_to_lo_private_different_bases:118; GFX11-TRUE16: ; %bb.0: ; %bb119; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)120; GFX11-TRUE16-NEXT: scratch_load_d16_b16 v0, v0, off121; GFX11-TRUE16-NEXT: scratch_load_d16_hi_b16 v0, v1, off122; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)123; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]124;125; GFX11-FAKE16-LABEL: chain_hi_to_lo_private_different_bases:126; GFX11-FAKE16: ; %bb.0: ; %bb127; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)128; GFX11-FAKE16-NEXT: scratch_load_u16 v0, v0, off129; GFX11-FAKE16-NEXT: scratch_load_d16_hi_b16 v0, v1, off130; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)131; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]132bb:133 %load_lo = load half, ptr addrspace(5) %base_lo134 %load_hi = load half, ptr addrspace(5) %base_hi135 136 %temp = insertelement <2 x half> poison, half %load_lo, i32 0137 %result = insertelement <2 x half> %temp, half %load_hi, i32 1138 139 ret <2 x half> %result140}141 142define <2 x half> @chain_hi_to_lo_arithmatic(ptr addrspace(5) %base, half %in) {143; GFX900-LABEL: chain_hi_to_lo_arithmatic:144; GFX900: ; %bb.0: ; %bb145; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)146; GFX900-NEXT: v_add_f16_e32 v1, 1.0, v1147; GFX900-NEXT: buffer_load_short_d16_hi v1, v0, s[0:3], 0 offen148; GFX900-NEXT: s_waitcnt vmcnt(0)149; GFX900-NEXT: v_mov_b32_e32 v0, v1150; GFX900-NEXT: s_setpc_b64 s[30:31]151;152; FLATSCR-LABEL: chain_hi_to_lo_arithmatic:153; FLATSCR: ; %bb.0: ; %bb154; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)155; FLATSCR-NEXT: v_add_f16_e32 v1, 1.0, v1156; FLATSCR-NEXT: scratch_load_short_d16_hi v1, v0, off157; FLATSCR-NEXT: s_waitcnt vmcnt(0)158; FLATSCR-NEXT: v_mov_b32_e32 v0, v1159; FLATSCR-NEXT: s_setpc_b64 s[30:31]160;161; GFX10_DEFAULT-LABEL: chain_hi_to_lo_arithmatic:162; GFX10_DEFAULT: ; %bb.0: ; %bb163; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)164; GFX10_DEFAULT-NEXT: v_add_f16_e32 v1, 1.0, v1165; GFX10_DEFAULT-NEXT: buffer_load_short_d16_hi v1, v0, s[0:3], 0 offen166; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)167; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v0, v1168; GFX10_DEFAULT-NEXT: s_setpc_b64 s[30:31]169;170; FLATSCR_GFX10-LABEL: chain_hi_to_lo_arithmatic:171; FLATSCR_GFX10: ; %bb.0: ; %bb172; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)173; FLATSCR_GFX10-NEXT: v_add_f16_e32 v1, 1.0, v1174; FLATSCR_GFX10-NEXT: scratch_load_short_d16_hi v1, v0, off175; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)176; FLATSCR_GFX10-NEXT: v_mov_b32_e32 v0, v1177; FLATSCR_GFX10-NEXT: s_setpc_b64 s[30:31]178;179; GFX11-TRUE16-LABEL: chain_hi_to_lo_arithmatic:180; GFX11-TRUE16: ; %bb.0: ; %bb181; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)182; GFX11-TRUE16-NEXT: v_add_f16_e32 v1.l, 1.0, v1.l183; GFX11-TRUE16-NEXT: scratch_load_d16_hi_b16 v1, v0, off184; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)185; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, v1186; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]187;188; GFX11-FAKE16-LABEL: chain_hi_to_lo_arithmatic:189; GFX11-FAKE16: ; %bb.0: ; %bb190; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)191; GFX11-FAKE16-NEXT: v_add_f16_e32 v1, 1.0, v1192; GFX11-FAKE16-NEXT: scratch_load_d16_hi_b16 v1, v0, off193; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)194; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, v1195; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]196bb:197 %arith_lo = fadd half %in, 1.0198 %load_hi = load half, ptr addrspace(5) %base199 200 %temp = insertelement <2 x half> poison, half %arith_lo, i32 0201 %result = insertelement <2 x half> %temp, half %load_hi, i32 1202 203 ret <2 x half> %result204}205 206define <2 x half> @chain_hi_to_lo_group() {207; GCN-LABEL: chain_hi_to_lo_group:208; GCN: ; %bb.0: ; %bb209; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)210; GCN-NEXT: v_mov_b32_e32 v1, 0211; GCN-NEXT: ds_read_u16 v0, v1 offset:2212; GCN-NEXT: s_waitcnt lgkmcnt(0)213; GCN-NEXT: ds_read_u16_d16_hi v0, v1214; GCN-NEXT: s_waitcnt lgkmcnt(0)215; GCN-NEXT: s_setpc_b64 s[30:31]216;217; GFX10-LABEL: chain_hi_to_lo_group:218; GFX10: ; %bb.0: ; %bb219; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)220; GFX10-NEXT: v_mov_b32_e32 v1, 0221; GFX10-NEXT: ds_read_u16 v0, v1 offset:2222; GFX10-NEXT: s_waitcnt lgkmcnt(0)223; GFX10-NEXT: ds_read_u16_d16_hi v0, v1224; GFX10-NEXT: s_waitcnt lgkmcnt(0)225; GFX10-NEXT: s_setpc_b64 s[30:31]226;227; GFX11-TRUE16-LABEL: chain_hi_to_lo_group:228; GFX11-TRUE16: ; %bb.0: ; %bb229; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)230; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0231; GFX11-TRUE16-NEXT: ds_load_u16_d16 v0, v1 offset:2232; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)233; GFX11-TRUE16-NEXT: ds_load_u16_d16_hi v0, v1234; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)235; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]236;237; GFX11-FAKE16-LABEL: chain_hi_to_lo_group:238; GFX11-FAKE16: ; %bb.0: ; %bb239; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)240; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 0241; GFX11-FAKE16-NEXT: ds_load_u16 v0, v1 offset:2242; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)243; GFX11-FAKE16-NEXT: ds_load_u16_d16_hi v0, v1244; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)245; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]246bb:247 %gep_lo = getelementptr inbounds half, ptr addrspace(3) null, i64 1248 %load_lo = load half, ptr addrspace(3) %gep_lo249 %load_hi = load half, ptr addrspace(3) null250 251 %temp = insertelement <2 x half> poison, half %load_lo, i32 0252 %result = insertelement <2 x half> %temp, half %load_hi, i32 1253 254 ret <2 x half> %result255}256 257define <2 x half> @chain_hi_to_lo_group_different_bases(ptr addrspace(3) %base_lo, ptr addrspace(3) %base_hi) {258; GCN-LABEL: chain_hi_to_lo_group_different_bases:259; GCN: ; %bb.0: ; %bb260; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)261; GCN-NEXT: ds_read_u16 v0, v0262; GCN-NEXT: s_waitcnt lgkmcnt(0)263; GCN-NEXT: ds_read_u16_d16_hi v0, v1264; GCN-NEXT: s_waitcnt lgkmcnt(0)265; GCN-NEXT: s_setpc_b64 s[30:31]266;267; GFX10-LABEL: chain_hi_to_lo_group_different_bases:268; GFX10: ; %bb.0: ; %bb269; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)270; GFX10-NEXT: ds_read_u16 v0, v0271; GFX10-NEXT: s_waitcnt lgkmcnt(0)272; GFX10-NEXT: ds_read_u16_d16_hi v0, v1273; GFX10-NEXT: s_waitcnt lgkmcnt(0)274; GFX10-NEXT: s_setpc_b64 s[30:31]275;276; GFX11-TRUE16-LABEL: chain_hi_to_lo_group_different_bases:277; GFX11-TRUE16: ; %bb.0: ; %bb278; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)279; GFX11-TRUE16-NEXT: ds_load_u16_d16 v0, v0280; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)281; GFX11-TRUE16-NEXT: ds_load_u16_d16_hi v0, v1282; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)283; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]284;285; GFX11-FAKE16-LABEL: chain_hi_to_lo_group_different_bases:286; GFX11-FAKE16: ; %bb.0: ; %bb287; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)288; GFX11-FAKE16-NEXT: ds_load_u16 v0, v0289; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)290; GFX11-FAKE16-NEXT: ds_load_u16_d16_hi v0, v1291; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)292; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]293bb:294 %load_lo = load half, ptr addrspace(3) %base_lo295 %load_hi = load half, ptr addrspace(3) %base_hi296 297 %temp = insertelement <2 x half> poison, half %load_lo, i32 0298 %result = insertelement <2 x half> %temp, half %load_hi, i32 1299 300 ret <2 x half> %result301}302 303define <2 x half> @chain_hi_to_lo_global() {304; GCN-LABEL: chain_hi_to_lo_global:305; GCN: ; %bb.0: ; %bb306; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)307; GCN-NEXT: v_mov_b32_e32 v0, 2308; GCN-NEXT: v_mov_b32_e32 v1, 0309; GCN-NEXT: global_load_ushort v0, v[0:1], off310; GCN-NEXT: v_mov_b32_e32 v1, 0311; GCN-NEXT: v_mov_b32_e32 v2, 0312; GCN-NEXT: global_load_short_d16_hi v0, v[1:2], off313; GCN-NEXT: s_waitcnt vmcnt(0)314; GCN-NEXT: s_setpc_b64 s[30:31]315;316; GFX10-LABEL: chain_hi_to_lo_global:317; GFX10: ; %bb.0: ; %bb318; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)319; GFX10-NEXT: v_mov_b32_e32 v0, 2320; GFX10-NEXT: v_mov_b32_e32 v1, 0321; GFX10-NEXT: global_load_ushort v0, v[0:1], off322; GFX10-NEXT: v_mov_b32_e32 v1, 0323; GFX10-NEXT: v_mov_b32_e32 v2, 0324; GFX10-NEXT: global_load_short_d16_hi v0, v[1:2], off325; GFX10-NEXT: s_waitcnt vmcnt(0)326; GFX10-NEXT: s_setpc_b64 s[30:31]327;328; GFX11-TRUE16-LABEL: chain_hi_to_lo_global:329; GFX11-TRUE16: ; %bb.0: ; %bb330; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)331; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, 2332; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0333; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v[0:1], off334; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0335; GFX11-TRUE16-NEXT: v_mov_b32_e32 v2, 0336; GFX11-TRUE16-NEXT: global_load_d16_hi_b16 v0, v[1:2], off337; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)338; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]339;340; GFX11-FAKE16-LABEL: chain_hi_to_lo_global:341; GFX11-FAKE16: ; %bb.0: ; %bb342; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)343; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, 2344; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 0345; GFX11-FAKE16-NEXT: global_load_u16 v0, v[0:1], off346; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 0347; GFX11-FAKE16-NEXT: v_mov_b32_e32 v2, 0348; GFX11-FAKE16-NEXT: global_load_d16_hi_b16 v0, v[1:2], off349; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)350; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]351bb:352 %gep_lo = getelementptr inbounds half, ptr addrspace(1) null, i64 1353 %load_lo = load half, ptr addrspace(1) %gep_lo354 %load_hi = load half, ptr addrspace(1) null355 356 %temp = insertelement <2 x half> poison, half %load_lo, i32 0357 %result = insertelement <2 x half> %temp, half %load_hi, i32 1358 359 ret <2 x half> %result360}361 362define <2 x half> @chain_hi_to_lo_global_different_bases(ptr addrspace(1) %base_lo, ptr addrspace(1) %base_hi) {363; GCN-LABEL: chain_hi_to_lo_global_different_bases:364; GCN: ; %bb.0: ; %bb365; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)366; GCN-NEXT: global_load_ushort v0, v[0:1], off367; GCN-NEXT: s_nop 0368; GCN-NEXT: global_load_short_d16_hi v0, v[2:3], off369; GCN-NEXT: s_waitcnt vmcnt(0)370; GCN-NEXT: s_setpc_b64 s[30:31]371;372; GFX10-LABEL: chain_hi_to_lo_global_different_bases:373; GFX10: ; %bb.0: ; %bb374; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)375; GFX10-NEXT: global_load_ushort v0, v[0:1], off376; GFX10-NEXT: global_load_short_d16_hi v0, v[2:3], off377; GFX10-NEXT: s_waitcnt vmcnt(0)378; GFX10-NEXT: s_setpc_b64 s[30:31]379;380; GFX11-TRUE16-LABEL: chain_hi_to_lo_global_different_bases:381; GFX11-TRUE16: ; %bb.0: ; %bb382; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)383; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v[0:1], off384; GFX11-TRUE16-NEXT: global_load_d16_hi_b16 v0, v[2:3], off385; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)386; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]387;388; GFX11-FAKE16-LABEL: chain_hi_to_lo_global_different_bases:389; GFX11-FAKE16: ; %bb.0: ; %bb390; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)391; GFX11-FAKE16-NEXT: global_load_u16 v0, v[0:1], off392; GFX11-FAKE16-NEXT: global_load_d16_hi_b16 v0, v[2:3], off393; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)394; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]395bb:396 %load_lo = load half, ptr addrspace(1) %base_lo397 %load_hi = load half, ptr addrspace(1) %base_hi398 399 %temp = insertelement <2 x half> poison, half %load_lo, i32 0400 %result = insertelement <2 x half> %temp, half %load_hi, i32 1401 402 ret <2 x half> %result403}404 405define <2 x half> @chain_hi_to_lo_flat(ptr inreg %ptr) {406; GFX900-LABEL: chain_hi_to_lo_flat:407; GFX900: ; %bb.0: ; %bb408; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)409; GFX900-NEXT: v_mov_b32_e32 v0, s16410; GFX900-NEXT: v_mov_b32_e32 v1, s17411; GFX900-NEXT: flat_load_ushort v0, v[0:1] offset:2412; GFX900-NEXT: v_mov_b32_e32 v1, 0413; GFX900-NEXT: v_mov_b32_e32 v2, 0414; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)415; GFX900-NEXT: flat_load_short_d16_hi v0, v[1:2]416; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)417; GFX900-NEXT: s_setpc_b64 s[30:31]418;419; FLATSCR-LABEL: chain_hi_to_lo_flat:420; FLATSCR: ; %bb.0: ; %bb421; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)422; FLATSCR-NEXT: v_mov_b32_e32 v0, s0423; FLATSCR-NEXT: v_mov_b32_e32 v1, s1424; FLATSCR-NEXT: flat_load_ushort v0, v[0:1] offset:2425; FLATSCR-NEXT: v_mov_b32_e32 v1, 0426; FLATSCR-NEXT: v_mov_b32_e32 v2, 0427; FLATSCR-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)428; FLATSCR-NEXT: flat_load_short_d16_hi v0, v[1:2]429; FLATSCR-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)430; FLATSCR-NEXT: s_setpc_b64 s[30:31]431;432; GFX10_DEFAULT-LABEL: chain_hi_to_lo_flat:433; GFX10_DEFAULT: ; %bb.0: ; %bb434; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)435; GFX10_DEFAULT-NEXT: s_add_u32 s4, s16, 2436; GFX10_DEFAULT-NEXT: s_addc_u32 s5, s17, 0437; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v0, s4438; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v1, s5439; GFX10_DEFAULT-NEXT: flat_load_ushort v0, v[0:1]440; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v1, 0441; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v2, 0442; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)443; GFX10_DEFAULT-NEXT: flat_load_short_d16_hi v0, v[1:2]444; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)445; GFX10_DEFAULT-NEXT: s_setpc_b64 s[30:31]446;447; FLATSCR_GFX10-LABEL: chain_hi_to_lo_flat:448; FLATSCR_GFX10: ; %bb.0: ; %bb449; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)450; FLATSCR_GFX10-NEXT: s_add_u32 s0, s0, 2451; FLATSCR_GFX10-NEXT: s_addc_u32 s1, s1, 0452; FLATSCR_GFX10-NEXT: v_mov_b32_e32 v0, s0453; FLATSCR_GFX10-NEXT: v_mov_b32_e32 v1, s1454; FLATSCR_GFX10-NEXT: flat_load_ushort v0, v[0:1]455; FLATSCR_GFX10-NEXT: v_mov_b32_e32 v1, 0456; FLATSCR_GFX10-NEXT: v_mov_b32_e32 v2, 0457; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)458; FLATSCR_GFX10-NEXT: flat_load_short_d16_hi v0, v[1:2]459; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)460; FLATSCR_GFX10-NEXT: s_setpc_b64 s[30:31]461;462; GFX11-TRUE16-LABEL: chain_hi_to_lo_flat:463; GFX11-TRUE16: ; %bb.0: ; %bb464; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)465; GFX11-TRUE16-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1466; GFX11-TRUE16-NEXT: flat_load_d16_b16 v0, v[0:1] offset:2467; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0468; GFX11-TRUE16-NEXT: v_mov_b32_e32 v2, 0469; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)470; GFX11-TRUE16-NEXT: flat_load_d16_hi_b16 v0, v[1:2]471; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)472; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]473;474; GFX11-FAKE16-LABEL: chain_hi_to_lo_flat:475; GFX11-FAKE16: ; %bb.0: ; %bb476; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)477; GFX11-FAKE16-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1478; GFX11-FAKE16-NEXT: flat_load_u16 v0, v[0:1] offset:2479; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 0480; GFX11-FAKE16-NEXT: v_mov_b32_e32 v2, 0481; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)482; GFX11-FAKE16-NEXT: flat_load_d16_hi_b16 v0, v[1:2]483; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)484; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]485bb:486 %gep_lo = getelementptr inbounds half, ptr %ptr, i64 1487 %load_lo = load half, ptr %gep_lo488 %load_hi = load half, ptr null489 490 %temp = insertelement <2 x half> poison, half %load_lo, i32 0491 %result = insertelement <2 x half> %temp, half %load_hi, i32 1492 493 ret <2 x half> %result494}495 496define <2 x half> @chain_hi_to_lo_flat_different_bases(ptr %base_lo, ptr %base_hi) {497; GCN-LABEL: chain_hi_to_lo_flat_different_bases:498; GCN: ; %bb.0: ; %bb499; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)500; GCN-NEXT: flat_load_ushort v0, v[0:1]501; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)502; GCN-NEXT: flat_load_short_d16_hi v0, v[2:3]503; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)504; GCN-NEXT: s_setpc_b64 s[30:31]505;506; GFX10-LABEL: chain_hi_to_lo_flat_different_bases:507; GFX10: ; %bb.0: ; %bb508; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)509; GFX10-NEXT: flat_load_ushort v0, v[0:1]510; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)511; GFX10-NEXT: flat_load_short_d16_hi v0, v[2:3]512; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)513; GFX10-NEXT: s_setpc_b64 s[30:31]514;515; GFX11-TRUE16-LABEL: chain_hi_to_lo_flat_different_bases:516; GFX11-TRUE16: ; %bb.0: ; %bb517; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)518; GFX11-TRUE16-NEXT: flat_load_d16_b16 v0, v[0:1]519; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)520; GFX11-TRUE16-NEXT: flat_load_d16_hi_b16 v0, v[2:3]521; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)522; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]523;524; GFX11-FAKE16-LABEL: chain_hi_to_lo_flat_different_bases:525; GFX11-FAKE16: ; %bb.0: ; %bb526; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)527; GFX11-FAKE16-NEXT: flat_load_u16 v0, v[0:1]528; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)529; GFX11-FAKE16-NEXT: flat_load_d16_hi_b16 v0, v[2:3]530; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)531; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]532bb:533 %load_lo = load half, ptr %base_lo534 %load_hi = load half, ptr %base_hi535 536 %temp = insertelement <2 x half> poison, half %load_lo, i32 0537 %result = insertelement <2 x half> %temp, half %load_hi, i32 1538 539 ret <2 x half> %result540}541 542; Make sure we don't lose any of the private stores.543define amdgpu_kernel void @vload2_private(ptr addrspace(1) nocapture readonly %in, ptr addrspace(1) nocapture %out) #0 {544; GFX900-LABEL: vload2_private:545; GFX900: ; %bb.0: ; %entry546; GFX900-NEXT: s_load_dwordx4 s[4:7], s[8:9], 0x0547; GFX900-NEXT: v_mov_b32_e32 v2, 0548; GFX900-NEXT: s_add_u32 s0, s0, s17549; GFX900-NEXT: s_addc_u32 s1, s1, 0550; GFX900-NEXT: s_waitcnt lgkmcnt(0)551; GFX900-NEXT: global_load_ushort v0, v2, s[4:5]552; GFX900-NEXT: s_waitcnt vmcnt(0)553; GFX900-NEXT: buffer_store_short v0, off, s[0:3], 0554; GFX900-NEXT: s_waitcnt vmcnt(0)555; GFX900-NEXT: global_load_ushort v0, v2, s[4:5] offset:2556; GFX900-NEXT: s_waitcnt vmcnt(0)557; GFX900-NEXT: buffer_store_short v0, off, s[0:3], 0 offset:2558; GFX900-NEXT: s_waitcnt vmcnt(0)559; GFX900-NEXT: global_load_ushort v0, v2, s[4:5] offset:4560; GFX900-NEXT: s_mov_b32 s4, 0x5040100561; GFX900-NEXT: s_waitcnt vmcnt(0)562; GFX900-NEXT: buffer_store_short v0, off, s[0:3], 0 offset:4563; GFX900-NEXT: s_waitcnt vmcnt(0)564; GFX900-NEXT: buffer_load_ushort v0, off, s[0:3], 0 offset:2565; GFX900-NEXT: buffer_load_ushort v3, off, s[0:3], 0566; GFX900-NEXT: s_waitcnt vmcnt(1)567; GFX900-NEXT: v_mov_b32_e32 v1, v0568; GFX900-NEXT: buffer_load_short_d16_hi v1, off, s[0:3], 0 offset:4569; GFX900-NEXT: s_waitcnt vmcnt(1)570; GFX900-NEXT: v_perm_b32 v0, v0, v3, s4571; GFX900-NEXT: s_waitcnt vmcnt(0)572; GFX900-NEXT: global_store_dwordx2 v2, v[0:1], s[6:7]573; GFX900-NEXT: s_endpgm574;575; FLATSCR-LABEL: vload2_private:576; FLATSCR: ; %bb.0: ; %entry577; FLATSCR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0578; FLATSCR-NEXT: v_mov_b32_e32 v2, 0579; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13580; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0581; FLATSCR-NEXT: s_mov_b32 s4, 0582; FLATSCR-NEXT: s_waitcnt lgkmcnt(0)583; FLATSCR-NEXT: global_load_ushort v0, v2, s[0:1]584; FLATSCR-NEXT: s_waitcnt vmcnt(0)585; FLATSCR-NEXT: scratch_store_short off, v0, s4586; FLATSCR-NEXT: s_waitcnt vmcnt(0)587; FLATSCR-NEXT: global_load_ushort v0, v2, s[0:1] offset:2588; FLATSCR-NEXT: s_waitcnt vmcnt(0)589; FLATSCR-NEXT: scratch_store_short off, v0, s4 offset:2590; FLATSCR-NEXT: s_waitcnt vmcnt(0)591; FLATSCR-NEXT: global_load_ushort v0, v2, s[0:1] offset:4592; FLATSCR-NEXT: s_mov_b32 s0, 0593; FLATSCR-NEXT: s_waitcnt vmcnt(0)594; FLATSCR-NEXT: scratch_store_short off, v0, s0 offset:4595; FLATSCR-NEXT: s_waitcnt vmcnt(0)596; FLATSCR-NEXT: scratch_load_dword v0, off, s0597; FLATSCR-NEXT: s_waitcnt vmcnt(0)598; FLATSCR-NEXT: v_lshrrev_b32_e32 v1, 16, v0599; FLATSCR-NEXT: scratch_load_short_d16_hi v1, off, s0 offset:4600; FLATSCR-NEXT: s_waitcnt vmcnt(0)601; FLATSCR-NEXT: global_store_dwordx2 v2, v[0:1], s[2:3]602; FLATSCR-NEXT: s_endpgm603;604; GFX10_DEFAULT-LABEL: vload2_private:605; GFX10_DEFAULT: ; %bb.0: ; %entry606; GFX10_DEFAULT-NEXT: s_load_dwordx4 s[4:7], s[8:9], 0x0607; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v2, 0608; GFX10_DEFAULT-NEXT: s_add_u32 s0, s0, s17609; GFX10_DEFAULT-NEXT: s_addc_u32 s1, s1, 0610; GFX10_DEFAULT-NEXT: s_waitcnt lgkmcnt(0)611; GFX10_DEFAULT-NEXT: global_load_ushort v0, v2, s[4:5]612; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)613; GFX10_DEFAULT-NEXT: buffer_store_short v0, off, s[0:3], 0614; GFX10_DEFAULT-NEXT: s_waitcnt_vscnt null, 0x0615; GFX10_DEFAULT-NEXT: global_load_ushort v0, v2, s[4:5] offset:2616; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)617; GFX10_DEFAULT-NEXT: buffer_store_short v0, off, s[0:3], 0 offset:2618; GFX10_DEFAULT-NEXT: s_waitcnt_vscnt null, 0x0619; GFX10_DEFAULT-NEXT: global_load_ushort v0, v2, s[4:5] offset:4620; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)621; GFX10_DEFAULT-NEXT: buffer_store_short v0, off, s[0:3], 0 offset:4622; GFX10_DEFAULT-NEXT: s_waitcnt_vscnt null, 0x0623; GFX10_DEFAULT-NEXT: s_clause 0x1624; GFX10_DEFAULT-NEXT: buffer_load_ushort v0, off, s[0:3], 0 offset:2625; GFX10_DEFAULT-NEXT: buffer_load_ushort v3, off, s[0:3], 0626; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(1)627; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v1, v0628; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)629; GFX10_DEFAULT-NEXT: v_perm_b32 v0, v0, v3, 0x5040100630; GFX10_DEFAULT-NEXT: buffer_load_short_d16_hi v1, off, s[0:3], 0 offset:4631; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)632; GFX10_DEFAULT-NEXT: global_store_dwordx2 v2, v[0:1], s[6:7]633; GFX10_DEFAULT-NEXT: s_endpgm634;635; FLATSCR_GFX10-LABEL: vload2_private:636; FLATSCR_GFX10: ; %bb.0: ; %entry637; FLATSCR_GFX10-NEXT: s_add_u32 s8, s8, s13638; FLATSCR_GFX10-NEXT: s_addc_u32 s9, s9, 0639; FLATSCR_GFX10-NEXT: s_setreg_b32 hwreg(HW_REG_FLAT_SCR_LO), s8640; FLATSCR_GFX10-NEXT: s_setreg_b32 hwreg(HW_REG_FLAT_SCR_HI), s9641; FLATSCR_GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0642; FLATSCR_GFX10-NEXT: v_mov_b32_e32 v2, 0643; FLATSCR_GFX10-NEXT: s_mov_b32 s4, 0644; FLATSCR_GFX10-NEXT: s_waitcnt lgkmcnt(0)645; FLATSCR_GFX10-NEXT: global_load_ushort v0, v2, s[0:1]646; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)647; FLATSCR_GFX10-NEXT: scratch_store_short off, v0, s4648; FLATSCR_GFX10-NEXT: s_waitcnt_vscnt null, 0x0649; FLATSCR_GFX10-NEXT: global_load_ushort v0, v2, s[0:1] offset:2650; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)651; FLATSCR_GFX10-NEXT: scratch_store_short off, v0, s4 offset:2652; FLATSCR_GFX10-NEXT: s_waitcnt_vscnt null, 0x0653; FLATSCR_GFX10-NEXT: global_load_ushort v0, v2, s[0:1] offset:4654; FLATSCR_GFX10-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)655; FLATSCR_GFX10-NEXT: s_mov_b32 s0, 0656; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)657; FLATSCR_GFX10-NEXT: scratch_store_short off, v0, s0 offset:4658; FLATSCR_GFX10-NEXT: s_waitcnt_vscnt null, 0x0659; FLATSCR_GFX10-NEXT: scratch_load_dword v0, off, s0660; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)661; FLATSCR_GFX10-NEXT: v_lshrrev_b32_e32 v1, 16, v0662; FLATSCR_GFX10-NEXT: scratch_load_short_d16_hi v1, off, s0 offset:4663; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)664; FLATSCR_GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[2:3]665; FLATSCR_GFX10-NEXT: s_endpgm666;667; GFX11-TRUE16-LABEL: vload2_private:668; GFX11-TRUE16: ; %bb.0: ; %entry669; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x0670; GFX11-TRUE16-NEXT: v_mov_b32_e32 v2, 0671; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)672; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v2, s[0:1]673; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)674; GFX11-TRUE16-NEXT: scratch_store_b16 off, v0, off dlc675; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0676; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v2, s[0:1] offset:2677; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)678; GFX11-TRUE16-NEXT: scratch_store_b16 off, v0, off offset:2 dlc679; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0680; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v2, s[0:1] offset:4681; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)682; GFX11-TRUE16-NEXT: scratch_store_b16 off, v0, off offset:4 dlc683; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0684; GFX11-TRUE16-NEXT: scratch_load_b32 v0, off, off685; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)686; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.h687; GFX11-TRUE16-NEXT: scratch_load_d16_hi_b16 v1, off, off offset:4688; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)689; GFX11-TRUE16-NEXT: global_store_b64 v2, v[0:1], s[2:3]690; GFX11-TRUE16-NEXT: s_endpgm691;692; GFX11-FAKE16-LABEL: vload2_private:693; GFX11-FAKE16: ; %bb.0: ; %entry694; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x0695; GFX11-FAKE16-NEXT: v_mov_b32_e32 v2, 0696; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)697; GFX11-FAKE16-NEXT: global_load_u16 v0, v2, s[0:1]698; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)699; GFX11-FAKE16-NEXT: scratch_store_b16 off, v0, off dlc700; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0701; GFX11-FAKE16-NEXT: global_load_u16 v0, v2, s[0:1] offset:2702; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)703; GFX11-FAKE16-NEXT: scratch_store_b16 off, v0, off offset:2 dlc704; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0705; GFX11-FAKE16-NEXT: global_load_u16 v0, v2, s[0:1] offset:4706; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)707; GFX11-FAKE16-NEXT: scratch_store_b16 off, v0, off offset:4 dlc708; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0709; GFX11-FAKE16-NEXT: scratch_load_b32 v0, off, off710; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)711; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0712; GFX11-FAKE16-NEXT: scratch_load_d16_hi_b16 v1, off, off offset:4713; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)714; GFX11-FAKE16-NEXT: global_store_b64 v2, v[0:1], s[2:3]715; GFX11-FAKE16-NEXT: s_endpgm716entry:717 %loc = alloca [3 x i16], align 2, addrspace(5)718 %tmp = load i16, ptr addrspace(1) %in, align 2719 store volatile i16 %tmp, ptr addrspace(5) %loc720 %arrayidx.1 = getelementptr inbounds i16, ptr addrspace(1) %in, i64 1721 %tmp1 = load i16, ptr addrspace(1) %arrayidx.1, align 2722 %loc.2.sroa_idx3 = getelementptr inbounds [3 x i16], ptr addrspace(5) %loc, i32 0, i32 1723 store volatile i16 %tmp1, ptr addrspace(5) %loc.2.sroa_idx3724 %arrayidx.2 = getelementptr inbounds i16, ptr addrspace(1) %in, i64 2725 %tmp2 = load i16, ptr addrspace(1) %arrayidx.2, align 2726 %loc.4.sroa_idx = getelementptr inbounds [3 x i16], ptr addrspace(5) %loc, i32 0, i32 2727 store volatile i16 %tmp2, ptr addrspace(5) %loc.4.sroa_idx728 %loc.0. = load <2 x i16>, ptr addrspace(5) %loc, align 2729 store <2 x i16> %loc.0., ptr addrspace(1) %out, align 4730 %loc.2.sroa_idx = getelementptr inbounds [3 x i16], ptr addrspace(5) %loc, i32 0, i32 1731 %loc.2. = load <2 x i16>, ptr addrspace(5) %loc.2.sroa_idx, align 2732 %arrayidx6 = getelementptr inbounds <2 x i16>, ptr addrspace(1) %out, i64 1733 store <2 x i16> %loc.2., ptr addrspace(1) %arrayidx6, align 4734 ret void735}736 737; There is another instruction between the misordered instruction and738; the value dependent load, so a simple operand check is insufficient.739define <2 x i16> @chain_hi_to_lo_group_other_dep(ptr addrspace(3) %ptr) {740; GCN-LABEL: chain_hi_to_lo_group_other_dep:741; GCN: ; %bb.0: ; %bb742; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)743; GCN-NEXT: ds_read_u16_d16_hi v1, v0744; GCN-NEXT: s_waitcnt lgkmcnt(0)745; GCN-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]746; GCN-NEXT: ds_read_u16_d16 v1, v0 offset:2747; GCN-NEXT: s_waitcnt lgkmcnt(0)748; GCN-NEXT: v_mov_b32_e32 v0, v1749; GCN-NEXT: s_setpc_b64 s[30:31]750;751; GFX10-LABEL: chain_hi_to_lo_group_other_dep:752; GFX10: ; %bb.0: ; %bb753; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)754; GFX10-NEXT: ds_read_u16_d16_hi v1, v0755; GFX10-NEXT: s_waitcnt lgkmcnt(0)756; GFX10-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]757; GFX10-NEXT: ds_read_u16_d16 v1, v0 offset:2758; GFX10-NEXT: s_waitcnt lgkmcnt(0)759; GFX10-NEXT: v_mov_b32_e32 v0, v1760; GFX10-NEXT: s_setpc_b64 s[30:31]761;762; GFX11-LABEL: chain_hi_to_lo_group_other_dep:763; GFX11: ; %bb.0: ; %bb764; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)765; GFX11-NEXT: ds_load_u16_d16_hi v1, v0766; GFX11-NEXT: s_waitcnt lgkmcnt(0)767; GFX11-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]768; GFX11-NEXT: ds_load_u16_d16 v1, v0 offset:2769; GFX11-NEXT: s_waitcnt lgkmcnt(0)770; GFX11-NEXT: v_mov_b32_e32 v0, v1771; GFX11-NEXT: s_setpc_b64 s[30:31]772bb:773 %gep_lo = getelementptr inbounds i16, ptr addrspace(3) %ptr, i64 1774 %load_lo = load i16, ptr addrspace(3) %gep_lo775 %load_hi = load i16, ptr addrspace(3) %ptr776 %to.hi = insertelement <2 x i16> poison, i16 %load_hi, i32 1777 %op.hi = add <2 x i16> %to.hi, <i16 12, i16 12>778 %result = insertelement <2 x i16> %op.hi, i16 %load_lo, i32 0779 ret <2 x i16> %result780}781 782; The volatile operations aren't put on the same chain783define <2 x i16> @chain_hi_to_lo_group_other_dep_multi_chain(ptr addrspace(3) %ptr) {784; GFX900-LABEL: chain_hi_to_lo_group_other_dep_multi_chain:785; GFX900: ; %bb.0: ; %bb786; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)787; GFX900-NEXT: ds_read_u16 v1, v0 offset:2788; GFX900-NEXT: ds_read_u16_d16_hi v0, v0789; GFX900-NEXT: s_mov_b32 s4, 0xffff790; GFX900-NEXT: s_waitcnt lgkmcnt(0)791; GFX900-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]792; GFX900-NEXT: v_bfi_b32 v0, s4, v1, v0793; GFX900-NEXT: s_setpc_b64 s[30:31]794;795; FLATSCR-LABEL: chain_hi_to_lo_group_other_dep_multi_chain:796; FLATSCR: ; %bb.0: ; %bb797; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)798; FLATSCR-NEXT: ds_read_u16 v1, v0 offset:2799; FLATSCR-NEXT: ds_read_u16_d16_hi v0, v0800; FLATSCR-NEXT: s_mov_b32 s0, 0xffff801; FLATSCR-NEXT: s_waitcnt lgkmcnt(0)802; FLATSCR-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]803; FLATSCR-NEXT: v_bfi_b32 v0, s0, v1, v0804; FLATSCR-NEXT: s_setpc_b64 s[30:31]805;806; GFX10-LABEL: chain_hi_to_lo_group_other_dep_multi_chain:807; GFX10: ; %bb.0: ; %bb808; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)809; GFX10-NEXT: ds_read_u16 v1, v0 offset:2810; GFX10-NEXT: ds_read_u16_d16_hi v0, v0811; GFX10-NEXT: s_waitcnt lgkmcnt(0)812; GFX10-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]813; GFX10-NEXT: v_bfi_b32 v0, 0xffff, v1, v0814; GFX10-NEXT: s_setpc_b64 s[30:31]815;816; GFX11-TRUE16-LABEL: chain_hi_to_lo_group_other_dep_multi_chain:817; GFX11-TRUE16: ; %bb.0: ; %bb818; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)819; GFX11-TRUE16-NEXT: ds_load_u16_d16 v1, v0 offset:2820; GFX11-TRUE16-NEXT: ds_load_u16_d16_hi v0, v0821; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)822; GFX11-TRUE16-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]823; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)824; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v0.h825; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, v1826; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]827;828; GFX11-FAKE16-LABEL: chain_hi_to_lo_group_other_dep_multi_chain:829; GFX11-FAKE16: ; %bb.0: ; %bb830; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)831; GFX11-FAKE16-NEXT: ds_load_u16 v1, v0 offset:2832; GFX11-FAKE16-NEXT: ds_load_u16_d16_hi v0, v0833; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)834; GFX11-FAKE16-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]835; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)836; GFX11-FAKE16-NEXT: v_bfi_b32 v0, 0xffff, v1, v0837; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]838bb:839 %gep_lo = getelementptr inbounds i16, ptr addrspace(3) %ptr, i64 1840 %load_lo = load volatile i16, ptr addrspace(3) %gep_lo841 %load_hi = load volatile i16, ptr addrspace(3) %ptr842 %to.hi = insertelement <2 x i16> poison, i16 %load_hi, i32 1843 %op.hi = add <2 x i16> %to.hi, <i16 12, i16 12>844 %result = insertelement <2 x i16> %op.hi, i16 %load_lo, i32 0845 ret <2 x i16> %result846}847 848define <2 x i16> @chain_hi_to_lo_private_other_dep(ptr addrspace(5) %ptr) {849; GFX900-LABEL: chain_hi_to_lo_private_other_dep:850; GFX900: ; %bb.0: ; %bb851; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)852; GFX900-NEXT: buffer_load_short_d16_hi v1, v0, s[0:3], 0 offen853; GFX900-NEXT: s_waitcnt vmcnt(0)854; GFX900-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]855; GFX900-NEXT: buffer_load_short_d16 v1, v0, s[0:3], 0 offen offset:2856; GFX900-NEXT: s_waitcnt vmcnt(0)857; GFX900-NEXT: v_mov_b32_e32 v0, v1858; GFX900-NEXT: s_setpc_b64 s[30:31]859;860; FLATSCR-LABEL: chain_hi_to_lo_private_other_dep:861; FLATSCR: ; %bb.0: ; %bb862; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)863; FLATSCR-NEXT: scratch_load_short_d16_hi v1, v0, off864; FLATSCR-NEXT: s_waitcnt vmcnt(0)865; FLATSCR-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]866; FLATSCR-NEXT: scratch_load_short_d16 v1, v0, off offset:2867; FLATSCR-NEXT: s_waitcnt vmcnt(0)868; FLATSCR-NEXT: v_mov_b32_e32 v0, v1869; FLATSCR-NEXT: s_setpc_b64 s[30:31]870;871; GFX10_DEFAULT-LABEL: chain_hi_to_lo_private_other_dep:872; GFX10_DEFAULT: ; %bb.0: ; %bb873; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)874; GFX10_DEFAULT-NEXT: buffer_load_short_d16_hi v1, v0, s[0:3], 0 offen875; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)876; GFX10_DEFAULT-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]877; GFX10_DEFAULT-NEXT: buffer_load_short_d16 v1, v0, s[0:3], 0 offen offset:2878; GFX10_DEFAULT-NEXT: s_waitcnt vmcnt(0)879; GFX10_DEFAULT-NEXT: v_mov_b32_e32 v0, v1880; GFX10_DEFAULT-NEXT: s_setpc_b64 s[30:31]881;882; FLATSCR_GFX10-LABEL: chain_hi_to_lo_private_other_dep:883; FLATSCR_GFX10: ; %bb.0: ; %bb884; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)885; FLATSCR_GFX10-NEXT: scratch_load_short_d16_hi v1, v0, off886; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)887; FLATSCR_GFX10-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]888; FLATSCR_GFX10-NEXT: scratch_load_short_d16 v1, v0, off offset:2889; FLATSCR_GFX10-NEXT: s_waitcnt vmcnt(0)890; FLATSCR_GFX10-NEXT: v_mov_b32_e32 v0, v1891; FLATSCR_GFX10-NEXT: s_setpc_b64 s[30:31]892;893; GFX11-LABEL: chain_hi_to_lo_private_other_dep:894; GFX11: ; %bb.0: ; %bb895; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)896; GFX11-NEXT: scratch_load_d16_hi_b16 v1, v0, off897; GFX11-NEXT: s_waitcnt vmcnt(0)898; GFX11-NEXT: v_pk_add_u16 v1, v1, 12 op_sel_hi:[1,0]899; GFX11-NEXT: scratch_load_d16_b16 v1, v0, off offset:2900; GFX11-NEXT: s_waitcnt vmcnt(0)901; GFX11-NEXT: v_mov_b32_e32 v0, v1902; GFX11-NEXT: s_setpc_b64 s[30:31]903bb:904 %gep_lo = getelementptr inbounds i16, ptr addrspace(5) %ptr, i64 1905 %load_lo = load i16, ptr addrspace(5) %gep_lo906 %load_hi = load i16, ptr addrspace(5) %ptr907 %to.hi = insertelement <2 x i16> poison, i16 %load_hi, i32 1908 %op.hi = add <2 x i16> %to.hi, <i16 12, i16 12>909 %result = insertelement <2 x i16> %op.hi, i16 %load_lo, i32 0910 ret <2 x i16> %result911}912 913define <2 x i16> @chain_hi_to_lo_global_other_dep(ptr addrspace(1) %ptr) {914; GFX900-LABEL: chain_hi_to_lo_global_other_dep:915; GFX900: ; %bb.0: ; %bb916; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)917; GFX900-NEXT: global_load_ushort v2, v[0:1], off offset:2 glc918; GFX900-NEXT: s_waitcnt vmcnt(0)919; GFX900-NEXT: global_load_short_d16_hi v0, v[0:1], off glc920; GFX900-NEXT: s_waitcnt vmcnt(0)921; GFX900-NEXT: s_mov_b32 s4, 0xffff922; GFX900-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]923; GFX900-NEXT: v_bfi_b32 v0, s4, v2, v0924; GFX900-NEXT: s_setpc_b64 s[30:31]925;926; FLATSCR-LABEL: chain_hi_to_lo_global_other_dep:927; FLATSCR: ; %bb.0: ; %bb928; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)929; FLATSCR-NEXT: global_load_ushort v2, v[0:1], off offset:2 glc930; FLATSCR-NEXT: s_waitcnt vmcnt(0)931; FLATSCR-NEXT: global_load_short_d16_hi v0, v[0:1], off glc932; FLATSCR-NEXT: s_waitcnt vmcnt(0)933; FLATSCR-NEXT: s_mov_b32 s0, 0xffff934; FLATSCR-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]935; FLATSCR-NEXT: v_bfi_b32 v0, s0, v2, v0936; FLATSCR-NEXT: s_setpc_b64 s[30:31]937;938; GFX10-LABEL: chain_hi_to_lo_global_other_dep:939; GFX10: ; %bb.0: ; %bb940; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)941; GFX10-NEXT: global_load_ushort v2, v[0:1], off offset:2 glc dlc942; GFX10-NEXT: s_waitcnt vmcnt(0)943; GFX10-NEXT: global_load_short_d16_hi v0, v[0:1], off glc dlc944; GFX10-NEXT: s_waitcnt vmcnt(0)945; GFX10-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]946; GFX10-NEXT: v_bfi_b32 v0, 0xffff, v2, v0947; GFX10-NEXT: s_setpc_b64 s[30:31]948;949; GFX11-TRUE16-LABEL: chain_hi_to_lo_global_other_dep:950; GFX11-TRUE16: ; %bb.0: ; %bb951; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)952; GFX11-TRUE16-NEXT: global_load_d16_b16 v2, v[0:1], off offset:2 glc dlc953; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)954; GFX11-TRUE16-NEXT: global_load_d16_hi_b16 v0, v[0:1], off glc dlc955; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)956; GFX11-TRUE16-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]957; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)958; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v0.h959; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, v2960; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]961;962; GFX11-FAKE16-LABEL: chain_hi_to_lo_global_other_dep:963; GFX11-FAKE16: ; %bb.0: ; %bb964; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)965; GFX11-FAKE16-NEXT: global_load_u16 v2, v[0:1], off offset:2 glc dlc966; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)967; GFX11-FAKE16-NEXT: global_load_d16_hi_b16 v0, v[0:1], off glc dlc968; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)969; GFX11-FAKE16-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]970; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)971; GFX11-FAKE16-NEXT: v_bfi_b32 v0, 0xffff, v2, v0972; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]973bb:974 %gep_lo = getelementptr inbounds i16, ptr addrspace(1) %ptr, i64 1975 %load_lo = load volatile i16, ptr addrspace(1) %gep_lo976 %load_hi = load volatile i16, ptr addrspace(1) %ptr977 %to.hi = insertelement <2 x i16> poison, i16 %load_hi, i32 1978 %op.hi = add <2 x i16> %to.hi, <i16 12, i16 12>979 %result = insertelement <2 x i16> %op.hi, i16 %load_lo, i32 0980 ret <2 x i16> %result981}982 983define <2 x i16> @chain_hi_to_lo_flat_other_dep(ptr addrspace(0) %ptr) {984; GFX900-LABEL: chain_hi_to_lo_flat_other_dep:985; GFX900: ; %bb.0: ; %bb986; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)987; GFX900-NEXT: flat_load_ushort v2, v[0:1] offset:2 glc988; GFX900-NEXT: s_waitcnt vmcnt(0)989; GFX900-NEXT: flat_load_short_d16_hi v0, v[0:1] glc990; GFX900-NEXT: s_waitcnt vmcnt(0)991; GFX900-NEXT: s_mov_b32 s4, 0xffff992; GFX900-NEXT: s_waitcnt lgkmcnt(0)993; GFX900-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]994; GFX900-NEXT: v_bfi_b32 v0, s4, v2, v0995; GFX900-NEXT: s_setpc_b64 s[30:31]996;997; FLATSCR-LABEL: chain_hi_to_lo_flat_other_dep:998; FLATSCR: ; %bb.0: ; %bb999; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1000; FLATSCR-NEXT: flat_load_ushort v2, v[0:1] offset:2 glc1001; FLATSCR-NEXT: s_waitcnt vmcnt(0)1002; FLATSCR-NEXT: flat_load_short_d16_hi v0, v[0:1] glc1003; FLATSCR-NEXT: s_waitcnt vmcnt(0)1004; FLATSCR-NEXT: s_mov_b32 s0, 0xffff1005; FLATSCR-NEXT: s_waitcnt lgkmcnt(0)1006; FLATSCR-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]1007; FLATSCR-NEXT: v_bfi_b32 v0, s0, v2, v01008; FLATSCR-NEXT: s_setpc_b64 s[30:31]1009;1010; GFX10-LABEL: chain_hi_to_lo_flat_other_dep:1011; GFX10: ; %bb.0: ; %bb1012; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1013; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v0, 21014; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v1, vcc_lo1015; GFX10-NEXT: flat_load_ushort v2, v[2:3] glc dlc1016; GFX10-NEXT: s_waitcnt vmcnt(0)1017; GFX10-NEXT: flat_load_short_d16_hi v0, v[0:1] glc dlc1018; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)1019; GFX10-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]1020; GFX10-NEXT: v_bfi_b32 v0, 0xffff, v2, v01021; GFX10-NEXT: s_setpc_b64 s[30:31]1022;1023; GFX11-TRUE16-LABEL: chain_hi_to_lo_flat_other_dep:1024; GFX11-TRUE16: ; %bb.0: ; %bb1025; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1026; GFX11-TRUE16-NEXT: flat_load_d16_b16 v2, v[0:1] offset:2 glc dlc1027; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)1028; GFX11-TRUE16-NEXT: flat_load_d16_hi_b16 v0, v[0:1] glc dlc1029; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)1030; GFX11-TRUE16-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]1031; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1032; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.h, v0.h1033; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, v21034; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1035;1036; GFX11-FAKE16-LABEL: chain_hi_to_lo_flat_other_dep:1037; GFX11-FAKE16: ; %bb.0: ; %bb1038; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1039; GFX11-FAKE16-NEXT: flat_load_u16 v2, v[0:1] offset:2 glc dlc1040; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)1041; GFX11-FAKE16-NEXT: flat_load_d16_hi_b16 v0, v[0:1] glc dlc1042; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)1043; GFX11-FAKE16-NEXT: v_pk_add_u16 v0, v0, 12 op_sel_hi:[1,0]1044; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1045; GFX11-FAKE16-NEXT: v_bfi_b32 v0, 0xffff, v2, v01046; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1047bb:1048 %gep_lo = getelementptr inbounds i16, ptr addrspace(0) %ptr, i64 11049 %load_lo = load volatile i16, ptr addrspace(0) %gep_lo1050 %load_hi = load volatile i16, ptr addrspace(0) %ptr1051 %to.hi = insertelement <2 x i16> poison, i16 %load_hi, i32 11052 %op.hi = add <2 x i16> %to.hi, <i16 12, i16 12>1053 %result = insertelement <2 x i16> %op.hi, i16 %load_lo, i32 01054 ret <2 x i16> %result1055}1056 1057define <2 x i16> @chain_hi_to_lo_group_may_alias_store(ptr addrspace(3) %ptr, ptr addrspace(3) %may.alias) {1058; GFX900-LABEL: chain_hi_to_lo_group_may_alias_store:1059; GFX900: ; %bb.0: ; %bb1060; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1061; GFX900-NEXT: v_mov_b32_e32 v3, 0x7b1062; GFX900-NEXT: ds_read_u16 v2, v01063; GFX900-NEXT: ds_write_b16 v1, v31064; GFX900-NEXT: ds_read_u16 v0, v0 offset:21065; GFX900-NEXT: s_mov_b32 s4, 0x50401001066; GFX900-NEXT: s_waitcnt lgkmcnt(0)1067; GFX900-NEXT: v_perm_b32 v0, v2, v0, s41068; GFX900-NEXT: s_setpc_b64 s[30:31]1069;1070; FLATSCR-LABEL: chain_hi_to_lo_group_may_alias_store:1071; FLATSCR: ; %bb.0: ; %bb1072; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1073; FLATSCR-NEXT: v_mov_b32_e32 v3, 0x7b1074; FLATSCR-NEXT: ds_read_u16 v2, v01075; FLATSCR-NEXT: ds_write_b16 v1, v31076; FLATSCR-NEXT: ds_read_u16 v0, v0 offset:21077; FLATSCR-NEXT: s_mov_b32 s0, 0x50401001078; FLATSCR-NEXT: s_waitcnt lgkmcnt(0)1079; FLATSCR-NEXT: v_perm_b32 v0, v2, v0, s01080; FLATSCR-NEXT: s_setpc_b64 s[30:31]1081;1082; GFX10-LABEL: chain_hi_to_lo_group_may_alias_store:1083; GFX10: ; %bb.0: ; %bb1084; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1085; GFX10-NEXT: v_mov_b32_e32 v2, 0x7b1086; GFX10-NEXT: ds_read_u16 v3, v01087; GFX10-NEXT: ds_write_b16 v1, v21088; GFX10-NEXT: ds_read_u16 v0, v0 offset:21089; GFX10-NEXT: s_waitcnt lgkmcnt(0)1090; GFX10-NEXT: v_perm_b32 v0, v3, v0, 0x50401001091; GFX10-NEXT: s_setpc_b64 s[30:31]1092;1093; GFX11-TRUE16-LABEL: chain_hi_to_lo_group_may_alias_store:1094; GFX11-TRUE16: ; %bb.0: ; %bb1095; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1096; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, 0x7b1097; GFX11-TRUE16-NEXT: ds_load_u16_d16_hi v2, v01098; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)1099; GFX11-TRUE16-NEXT: ds_store_b16 v1, v21100; GFX11-TRUE16-NEXT: ds_load_u16_d16 v2, v0 offset:21101; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)1102; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, v21103; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]1104;1105; GFX11-FAKE16-LABEL: chain_hi_to_lo_group_may_alias_store:1106; GFX11-FAKE16: ; %bb.0: ; %bb1107; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1108; GFX11-FAKE16-NEXT: v_mov_b32_e32 v2, 0x7b1109; GFX11-FAKE16-NEXT: ds_load_u16 v3, v01110; GFX11-FAKE16-NEXT: ds_store_b16 v1, v21111; GFX11-FAKE16-NEXT: ds_load_u16 v0, v0 offset:21112; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)1113; GFX11-FAKE16-NEXT: v_perm_b32 v0, v3, v0, 0x50401001114; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]1115bb:1116 %gep_lo = getelementptr inbounds i16, ptr addrspace(3) %ptr, i64 11117 %load_hi = load i16, ptr addrspace(3) %ptr1118 store i16 123, ptr addrspace(3) %may.alias1119 %load_lo = load i16, ptr addrspace(3) %gep_lo1120 1121 %to.hi = insertelement <2 x i16> poison, i16 %load_hi, i32 11122 %result = insertelement <2 x i16> %to.hi, i16 %load_lo, i32 01123 ret <2 x i16> %result1124}1125