[AMDGPU][GlobalISel] Fold G_TRUNC(G_LSHR(x, 16)) into hi16 subregister copy in True16 mode
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp index f3c4f55..52a7fdf 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp
@@ -2505,6 +2505,51 @@ return true; } +static Register stripCopy(Register Reg, MachineRegisterInfo &MRI) { + return getDefSrcRegIgnoringCopies(Reg, MRI)->Reg; +} + +static Register stripBitCast(Register Reg, MachineRegisterInfo &MRI) { + Register BitcastSrc; + if (mi_match(Reg, MRI, m_GBitcast(m_Reg(BitcastSrc)))) + Reg = BitcastSrc; + return Reg; +} + +static bool isExtractHiElt(MachineRegisterInfo &MRI, Register In, + Register &Out) { + Register Trunc; + if (!mi_match(In, MRI, m_GTrunc(m_Reg(Trunc)))) + return false; + + Register LShlSrc; + Register Cst; + if (mi_match(Trunc, MRI, m_GLShr(m_Reg(LShlSrc), m_Reg(Cst)))) { + Cst = stripCopy(Cst, MRI); + if (mi_match(Cst, MRI, m_SpecificICst(16))) { + Out = stripBitCast(LShlSrc, MRI); + return true; + } + } + + MachineInstr *Shuffle = MRI.getVRegDef(Trunc); + if (Shuffle->getOpcode() != AMDGPU::G_SHUFFLE_VECTOR) + return false; + + assert(MRI.getType(Shuffle->getOperand(0).getReg()) == + LLT::fixed_vector(2, 16)); + + ArrayRef<int> Mask = Shuffle->getOperand(3).getShuffleMask(); + assert(Mask.size() == 2); + + if (Mask[0] == 1 && Mask[1] <= 1) { + Out = Shuffle->getOperand(0).getReg(); + return true; + } + + return false; +} + bool AMDGPUInstructionSelector::selectG_TRUNC(MachineInstr &I) const { Register DstReg = I.getOperand(0).getReg(); Register SrcReg = I.getOperand(1).getReg(); @@ -2546,8 +2591,16 @@ assert(STI.useRealTrue16Insts()); const DebugLoc &DL = I.getDebugLoc(); MachineBasicBlock *MBB = I.getParent(); - BuildMI(*MBB, I, DL, TII.get(AMDGPU::COPY), DstReg) - .addReg(SrcReg, {}, AMDGPU::lo16); + // G_TRUNC(G_LSHR(src32, 16)) -> COPY DstReg, src32.hi16 + Register HiSrc; + if (isExtractHiElt(*MRI, DstReg, HiSrc) && + RBI.constrainGenericRegister(HiSrc, *SrcRC, *MRI)) { + BuildMI(*MBB, I, DL, TII.get(AMDGPU::COPY), DstReg) + .addReg(HiSrc, {}, AMDGPU::hi16); + } else { + BuildMI(*MBB, I, DL, TII.get(AMDGPU::COPY), DstReg) + .addReg(SrcReg, {}, AMDGPU::lo16); + } I.eraseFromParent(); return true; } @@ -2816,51 +2869,6 @@ return false; } -static Register stripCopy(Register Reg, MachineRegisterInfo &MRI) { - return getDefSrcRegIgnoringCopies(Reg, MRI)->Reg; -} - -static Register stripBitCast(Register Reg, MachineRegisterInfo &MRI) { - Register BitcastSrc; - if (mi_match(Reg, MRI, m_GBitcast(m_Reg(BitcastSrc)))) - Reg = BitcastSrc; - return Reg; -} - -static bool isExtractHiElt(MachineRegisterInfo &MRI, Register In, - Register &Out) { - Register Trunc; - if (!mi_match(In, MRI, m_GTrunc(m_Reg(Trunc)))) - return false; - - Register LShlSrc; - Register Cst; - if (mi_match(Trunc, MRI, m_GLShr(m_Reg(LShlSrc), m_Reg(Cst)))) { - Cst = stripCopy(Cst, MRI); - if (mi_match(Cst, MRI, m_SpecificICst(16))) { - Out = stripBitCast(LShlSrc, MRI); - return true; - } - } - - MachineInstr *Shuffle = MRI.getVRegDef(Trunc); - if (Shuffle->getOpcode() != AMDGPU::G_SHUFFLE_VECTOR) - return false; - - assert(MRI.getType(Shuffle->getOperand(0).getReg()) == - LLT::fixed_vector(2, 16)); - - ArrayRef<int> Mask = Shuffle->getOperand(3).getShuffleMask(); - assert(Mask.size() == 2); - - if (Mask[0] == 1 && Mask[1] <= 1) { - Out = Shuffle->getOperand(0).getReg(); - return true; - } - - return false; -} - bool AMDGPUInstructionSelector::selectG_FPEXT(MachineInstr &I) const { if (!Subtarget->hasSALUFloatInsts()) return false;
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/uaddsat.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/uaddsat.ll index 5676566..533f77fa 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/uaddsat.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/uaddsat.ll
@@ -669,32 +669,34 @@ ; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v2, 8, v0 ; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v4, 8, v1 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 24, v0 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v6, 16, v1 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v7, 24, v1 -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.h, v2.l -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v4.l -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.h, v5.l -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v6.h, v7.l +; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 24, v0 +; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 24, v1 +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v6.l, v0.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v7.l, v1.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v6.h, v2.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v7.h, v4.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, v1.h +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.h, v3.l +; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v2, 8, v6 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v3, 8, v7 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v5.l ; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v0, 8, v0 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_pk_add_u16 v2, v2, v3 clamp ; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v1, 8, v1 op_sel_hi:[0,1] -; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v2, 8, v3 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_pk_lshrrev_b16 v2, 8, v2 op_sel_hi:[0,1] ; GFX11-TRUE16-NEXT: v_pk_add_u16 v0, v0, v1 clamp -; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v1, 8, v6 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, v2.h ; GFX11-TRUE16-NEXT: v_pk_lshrrev_b16 v0, 8, v0 op_sel_hi:[0,1] -; GFX11-TRUE16-NEXT: v_pk_add_u16 v1, v2, v1 clamp -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.h -; GFX11-TRUE16-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1] -; GFX11-TRUE16-NEXT: v_and_b32_e32 v2, 0xff, v2 -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v1.h ; GFX11-TRUE16-NEXT: v_and_b32_e32 v1, 0xff, v1 -; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v2, 8, v2 +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v0.h +; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0xff, v0 +; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 8, v1 ; GFX11-TRUE16-NEXT: v_and_b32_e32 v3, 0xff, v3 -; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 16, v1 -; GFX11-TRUE16-NEXT: v_and_or_b32 v0, 0xff, v0, v2 +; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v0, 16, v0 +; GFX11-TRUE16-NEXT: v_and_or_b32 v1, 0xff, v2, v1 ; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v2, 24, v3 -; GFX11-TRUE16-NEXT: v_or3_b32 v0, v0, v1, v2 +; GFX11-TRUE16-NEXT: v_or3_b32 v0, v1, v0, v2 ; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-FAKE16-LABEL: v_uaddsat_v4i8:
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/usubsat.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/usubsat.ll index e17706b..7d185f8 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/usubsat.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/usubsat.ll
@@ -657,32 +657,34 @@ ; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v2, 8, v0 ; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v4, 8, v1 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 24, v0 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v6, 16, v1 -; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v7, 24, v1 -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.h, v2.l -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v4.l -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.h, v5.l -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v6.h, v7.l +; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 24, v0 +; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 24, v1 +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v6.l, v0.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v7.l, v1.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v6.h, v2.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v7.h, v4.l +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, v1.h +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.h, v3.l +; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v2, 8, v6 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v3, 8, v7 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.h, v5.l ; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v0, 8, v0 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_pk_sub_u16 v2, v2, v3 clamp ; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v1, 8, v1 op_sel_hi:[0,1] -; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v2, 8, v3 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_pk_lshrrev_b16 v2, 8, v2 op_sel_hi:[0,1] ; GFX11-TRUE16-NEXT: v_pk_sub_u16 v0, v0, v1 clamp -; GFX11-TRUE16-NEXT: v_pk_lshlrev_b16 v1, 8, v6 op_sel_hi:[0,1] +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, v2.h ; GFX11-TRUE16-NEXT: v_pk_lshrrev_b16 v0, 8, v0 op_sel_hi:[0,1] -; GFX11-TRUE16-NEXT: v_pk_sub_u16 v1, v2, v1 clamp -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.h -; GFX11-TRUE16-NEXT: v_pk_lshrrev_b16 v1, 8, v1 op_sel_hi:[0,1] -; GFX11-TRUE16-NEXT: v_and_b32_e32 v2, 0xff, v2 -; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v1.h ; GFX11-TRUE16-NEXT: v_and_b32_e32 v1, 0xff, v1 -; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v2, 8, v2 +; GFX11-TRUE16-NEXT: v_mov_b16_e32 v3.l, v0.h +; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0xff, v0 +; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 8, v1 ; GFX11-TRUE16-NEXT: v_and_b32_e32 v3, 0xff, v3 -; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 16, v1 -; GFX11-TRUE16-NEXT: v_and_or_b32 v0, 0xff, v0, v2 +; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v0, 16, v0 +; GFX11-TRUE16-NEXT: v_and_or_b32 v1, 0xff, v2, v1 ; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v2, 24, v3 -; GFX11-TRUE16-NEXT: v_or3_b32 v0, v0, v1, v2 +; GFX11-TRUE16-NEXT: v_or3_b32 v0, v1, v0, v2 ; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-FAKE16-LABEL: v_usubsat_v4i8:
diff --git a/llvm/test/CodeGen/AMDGPU/bitreverse.ll b/llvm/test/CodeGen/AMDGPU/bitreverse.ll index 5e5e6a6..9a8dd14 100644 --- a/llvm/test/CodeGen/AMDGPU/bitreverse.ll +++ b/llvm/test/CodeGen/AMDGPU/bitreverse.ll
@@ -922,9 +922,8 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %bb ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_bfrev_b32_e32 v0, v0 -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v0, 16, v0 -; GFX11-GISEL-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: missing_truncate_promote_bitreverse:
diff --git a/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll b/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll index 28efba6..fad4927 100644 --- a/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll +++ b/llvm/test/CodeGen/AMDGPU/flat-saddr-store.ll
@@ -1167,24 +1167,11 @@ ; -------------------------------------------------------------------------------- define amdgpu_ps void @flat_store_saddr_i16_d16hi_zext_vgpr(ptr inreg %sbase, i32 %voffset, <2 x i16> %data) { -; GFX1250-SDAG-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr: -; GFX1250-SDAG: ; %bb.0: -; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-SDAG-NEXT: flat_store_d16_hi_b16 v0, v1, s[2:3] -; GFX1250-SDAG-NEXT: s_endpgm -; -; GFX1250-GISEL-FAKE16-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr: -; GFX1250-GISEL-FAKE16: ; %bb.0: -; GFX1250-GISEL-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-GISEL-FAKE16-NEXT: flat_store_d16_hi_b16 v0, v1, s[2:3] -; GFX1250-GISEL-FAKE16-NEXT: s_endpgm -; -; GFX1250-GISEL-REAL16-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr: -; GFX1250-GISEL-REAL16: ; %bb.0: -; GFX1250-GISEL-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-GISEL-REAL16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX1250-GISEL-REAL16-NEXT: flat_store_b16 v0, v1, s[2:3] -; GFX1250-GISEL-REAL16-NEXT: s_endpgm +; GFX1250-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr: +; GFX1250: ; %bb.0: +; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-NEXT: flat_store_d16_hi_b16 v0, v1, s[2:3] +; GFX1250-NEXT: s_endpgm %zext.offset = zext i32 %voffset to i64 %gep0 = getelementptr inbounds i8, ptr %sbase, i64 %zext.offset %data.hi = extractelement <2 x i16> %data, i32 1 @@ -1193,24 +1180,11 @@ } define amdgpu_ps void @flat_store_saddr_i16_d16hi_zext_vgpr_offset_neg128(ptr inreg %sbase, i32 %voffset, <2 x i16> %data) { -; GFX1250-SDAG-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr_offset_neg128: -; GFX1250-SDAG: ; %bb.0: -; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-SDAG-NEXT: flat_store_d16_hi_b16 v0, v1, s[2:3] offset:-128 -; GFX1250-SDAG-NEXT: s_endpgm -; -; GFX1250-GISEL-FAKE16-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr_offset_neg128: -; GFX1250-GISEL-FAKE16: ; %bb.0: -; GFX1250-GISEL-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-GISEL-FAKE16-NEXT: flat_store_d16_hi_b16 v0, v1, s[2:3] offset:-128 -; GFX1250-GISEL-FAKE16-NEXT: s_endpgm -; -; GFX1250-GISEL-REAL16-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr_offset_neg128: -; GFX1250-GISEL-REAL16: ; %bb.0: -; GFX1250-GISEL-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-GISEL-REAL16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX1250-GISEL-REAL16-NEXT: flat_store_b16 v0, v1, s[2:3] offset:-128 -; GFX1250-GISEL-REAL16-NEXT: s_endpgm +; GFX1250-LABEL: flat_store_saddr_i16_d16hi_zext_vgpr_offset_neg128: +; GFX1250: ; %bb.0: +; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 +; GFX1250-NEXT: flat_store_d16_hi_b16 v0, v1, s[2:3] offset:-128 +; GFX1250-NEXT: s_endpgm %zext.offset = zext i32 %voffset to i64 %gep0 = getelementptr inbounds i8, ptr %sbase, i64 %zext.offset %gep1 = getelementptr inbounds i8, ptr %gep0, i64 -128 @@ -1248,5 +1222,7 @@ ret void } ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; GFX1250-GISEL-FAKE16: {{.*}} +; GFX1250-GISEL-REAL16: {{.*}} ; GFX1250-SDAG-FAKE16: {{.*}} ; GFX1250-SDAG-REAL16: {{.*}}
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.f16.fp8.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.f16.fp8.ll index 4af8e94..c48a48c 100644 --- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.f16.fp8.ll +++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.f16.fp8.ll
@@ -479,9 +479,7 @@ ; GFX1250-GISEL-REAL16-LABEL: test_cvt_pk_f16_fp8_v_hi: ; GFX1250-GISEL-REAL16: ; %bb.0: ; GFX1250-GISEL-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-GISEL-REAL16-NEXT: v_lshrrev_b32_e32 v0, 16, v0 -; GFX1250-GISEL-REAL16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX1250-GISEL-REAL16-NEXT: v_cvt_pk_f16_fp8 v0, v0.l +; GFX1250-GISEL-REAL16-NEXT: v_cvt_pk_f16_fp8 v0, v0.h ; GFX1250-GISEL-REAL16-NEXT: ; return to shader part epilog ; ; GFX1250-GISEL-FAKE16-LABEL: test_cvt_pk_f16_fp8_v_hi:
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.fp8.f16.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.fp8.f16.ll index 96d1166..2c9a883 100644 --- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.fp8.f16.ll +++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.cvt.fp8.f16.ll
@@ -385,10 +385,8 @@ ; GFX1250-GISEL-REAL16-LABEL: test_cvt_sr_bf8_f16_hi_byte0: ; GFX1250-GISEL-REAL16: ; %bb.0: ; GFX1250-GISEL-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-GISEL-REAL16-NEXT: v_dual_lshrrev_b32 v0, 16, v0 :: v_dual_mov_b32 v6, v3 -; GFX1250-GISEL-REAL16-NEXT: v_mov_b32_e32 v7, v4 -; GFX1250-GISEL-REAL16-NEXT: s_delay_alu instid0(VALU_DEP_2) -; GFX1250-GISEL-REAL16-NEXT: v_cvt_sr_bf8_f16 v2, v0.l, v1 +; GFX1250-GISEL-REAL16-NEXT: v_dual_mov_b32 v6, v3 :: v_dual_mov_b32 v7, v4 +; GFX1250-GISEL-REAL16-NEXT: v_cvt_sr_bf8_f16 v2, v0.h, v1 ; GFX1250-GISEL-REAL16-NEXT: global_store_b32 v[6:7], v2, off ; GFX1250-GISEL-REAL16-NEXT: s_endpgm ; @@ -577,10 +575,8 @@ ; GFX1250-GISEL-REAL16-LABEL: test_cvt_sr_fp8_f16_hi_byte0: ; GFX1250-GISEL-REAL16: ; %bb.0: ; GFX1250-GISEL-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 -; GFX1250-GISEL-REAL16-NEXT: v_dual_lshrrev_b32 v0, 16, v0 :: v_dual_mov_b32 v6, v3 -; GFX1250-GISEL-REAL16-NEXT: v_mov_b32_e32 v7, v4 -; GFX1250-GISEL-REAL16-NEXT: s_delay_alu instid0(VALU_DEP_2) -; GFX1250-GISEL-REAL16-NEXT: v_cvt_sr_fp8_f16 v2, v0.l, v1 +; GFX1250-GISEL-REAL16-NEXT: v_dual_mov_b32 v6, v3 :: v_dual_mov_b32 v7, v4 +; GFX1250-GISEL-REAL16-NEXT: v_cvt_sr_fp8_f16 v2, v0.h, v1 ; GFX1250-GISEL-REAL16-NEXT: global_store_b32 v[6:7], v2, off ; GFX1250-GISEL-REAL16-NEXT: s_endpgm ;
diff --git a/llvm/test/CodeGen/AMDGPU/vector-reduce-fadd.ll b/llvm/test/CodeGen/AMDGPU/vector-reduce-fadd.ll index 0ec4c18..625b9887 100644 --- a/llvm/test/CodeGen/AMDGPU/vector-reduce-fadd.ll +++ b/llvm/test/CodeGen/AMDGPU/vector-reduce-fadd.ll
@@ -87,9 +87,8 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v2half: @@ -134,9 +133,8 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v2half: @@ -415,13 +413,11 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v4half: @@ -477,13 +473,11 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v4half: @@ -671,21 +665,17 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.l ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v8half: @@ -763,21 +753,17 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.l ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v8half: @@ -1097,37 +1083,29 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v5 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v5.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v6 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v5.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v6.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v7 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v6.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v7.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v8 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v7.h ; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v8.l ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v8.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v16half: @@ -1249,37 +1227,29 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v2.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v3.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v5 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v4.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v5.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v6 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v5.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v6.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v7 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v6.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v7.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v8 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v7.h ; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v8.l ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_add_f16_e32 v0.l, v0.l, v8.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fadd_v16half:
diff --git a/llvm/test/CodeGen/AMDGPU/vector-reduce-fmul.ll b/llvm/test/CodeGen/AMDGPU/vector-reduce-fmul.ll index 57dc288..bec4429 100644 --- a/llvm/test/CodeGen/AMDGPU/vector-reduce-fmul.ll +++ b/llvm/test/CodeGen/AMDGPU/vector-reduce-fmul.ll
@@ -87,9 +87,8 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v2half: @@ -134,9 +133,8 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v2half: @@ -415,13 +413,11 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v4half: @@ -477,13 +473,11 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v4half: @@ -671,21 +665,17 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.l ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v8half: @@ -763,21 +753,17 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.l ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v8half: @@ -1097,37 +1083,29 @@ ; GFX11-GISEL-TRUE16: ; %bb.0: ; %entry ; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v5 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v5.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v6 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v5.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v6.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v7 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v6.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v7.l -; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v8 +; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v7.h ; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v8.l ; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX11-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v8.h ; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX11-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v16half: @@ -1249,37 +1227,29 @@ ; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: s_wait_kmcnt 0x0 ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1 -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v2 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v3 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v2.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v4 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v3.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v5 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v4.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v5.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v6 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v5.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v6.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v7 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v6.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v7.l -; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l -; GFX12-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v8 +; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v7.h ; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v8.l ; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) -; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v1.l +; GFX12-GISEL-TRUE16-NEXT: v_mul_f16_e32 v0.l, v0.l, v8.h ; GFX12-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] ; ; GFX12-GISEL-FAKE16-LABEL: test_vector_reduce_fmul_v16half: