From 11da87d2e7791876f98afa33efef6b3c84730b30 Mon Sep 17 00:00:00 2001 From: Stanislav Mekhanoshin Date: Tue, 6 May 2025 14:35:54 -0700 Subject: [PATCH] [AMDGPU] Fix regclass check for PackedF32InputMods in AsmParser. Downstream patch by Pravin Jagtap. --- llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp | 4 ++-- llvm/lib/Target/AMDGPU/SIInstrInfo.td | 8 ++++++-- llvm/lib/Target/AMDGPU/VOP3Instructions.td | 2 +- llvm/test/MC/AMDGPU/gfx950_err.s | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 7ef6285ce7b1f..f6407479288c4 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -337,8 +337,8 @@ class AMDGPUOperand : public MCParsedAsmOperand { return isRegOrImmWithInputMods(AMDGPU::VS_32RegClassID, MVT::v2f16); } - bool isPackedFP32InputMods() const { - return isRegOrImmWithInputMods(AMDGPU::VS_64RegClassID, MVT::v2f32); + bool isPackedVGPRFP32InputMods() const { + return isRegOrImmWithInputMods(AMDGPU::VReg_64RegClassID, MVT::v2f32); } bool isVReg() const { diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td index adc7cd0b14af6..3710a54a828ce 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -1550,6 +1550,10 @@ class PackedFPInputModsMatchClass : AsmOperandClass { let PredicateMethod = "isPackedFP"#opSize#"InputMods"; } +class PackedVGPRFPInputModsMatchClass : PackedFPInputModsMatchClass { + let PredicateMethod = "isPackedVGPRFP"#opSize#"InputMods"; +} + class PackedIntInputModsMatchClass : AsmOperandClass { let Name = "PackedInt"#opSize#"InputMods"; let ParserMethod = "parseRegOrImm"; @@ -1559,7 +1563,7 @@ class PackedIntInputModsMatchClass : AsmOperandClass { def PackedF16InputModsMatchClass : PackedFPInputModsMatchClass<16>; def PackedI16InputModsMatchClass : PackedIntInputModsMatchClass<16>; -def PackedF32InputModsMatchClass : PackedFPInputModsMatchClass<32>; +def PackedVGPRF32InputModsMatchClass : PackedVGPRFPInputModsMatchClass<32>; class PackedFPInputMods : InputMods { let PrintMethod = "printOperandAndFPInputMods"; @@ -1571,7 +1575,7 @@ class PackedIntInputMods : InputMods < def PackedF16InputMods : PackedFPInputMods; def PackedI16InputMods : PackedIntInputMods; -def PackedF32InputMods : PackedFPInputMods; +def PackedVGPRF32InputMods : PackedFPInputMods; def MFMALdScaleModifierOp : TImmLeaf(Imm); diff --git a/llvm/lib/Target/AMDGPU/VOP3Instructions.td b/llvm/lib/Target/AMDGPU/VOP3Instructions.td index 8686a85620a17..73f7a5cccaa07 100644 --- a/llvm/lib/Target/AMDGPU/VOP3Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP3Instructions.td @@ -1049,7 +1049,7 @@ class VOP3_CVT_SCALE_SR_PK_F4_F32_TiedInput_Profile let Src0RC64 = !if(!gt(P.Src0VT.Size, 32), getVOP3VRegSrcForVT.ret, getVOP3SrcForVT.ret); - let InsVOP3OpSel = (ins PackedF32InputMods: $src0_modifiers, Src0RC64:$src0, + let InsVOP3OpSel = (ins PackedVGPRF32InputMods: $src0_modifiers, Src0RC64:$src0, Int32InputMods: $src1_modifiers, Src1RC64:$src1, FP32InputMods: $src2_modifiers, Src2RC64:$src2, VGPR_32:$vdst_in, op_sel0:$op_sel); diff --git a/llvm/test/MC/AMDGPU/gfx950_err.s b/llvm/test/MC/AMDGPU/gfx950_err.s index 099916f48b5e7..29838af063883 100644 --- a/llvm/test/MC/AMDGPU/gfx950_err.s +++ b/llvm/test/MC/AMDGPU/gfx950_err.s @@ -495,5 +495,5 @@ v_cvt_scalef32_2xpk16_bf6_f32 v[0:5], s[0:15], v[6:21], v16 // GFX950: :[[@LINE+1]]:{{[0-9]+}}: error: invalid operand for instruction v_cvt_scalef32_2xpk16_bf6_f32 v[0:5], v[6:21], s[0:15], v16 -// GFX950: v_cvt_scalef32_sr_pk_fp4_f32 v0, s[2:3]/*Invalid register, operand has 'VReg_64' register class*/, v4, v5 +// GFX950: :[[@LINE+1]]:{{[0-9]+}}: error: invalid operand for instruction v_cvt_scalef32_sr_pk_fp4_f32 v0, s[2:3], v4, v5