@@ -856,17 +856,11 @@ defvar MayNotNeedAGPRs_gisel = [{
856856 return !MF.getInfo<SIMachineFunctionInfo>()->mayNeedAGPRs();
857857}];
858858
859- class AgprMAIFrag<SDPatternOperator Op, bit HasAbid = true,
860- bit Scaled = false> :
861- MAIFrag<Op, MayNeedAGPRs, HasAbid, Scaled> {
862- let GISelPredicateCode = MayNeedAGPRs_gisel;
863- }
859+ class AgprMAIFrag<SDPatternOperator Op, bit HasAbid = true, bit Scaled = false>
860+ : MAIFrag<Op, [{}], HasAbid, Scaled> {}
864861
865- class VgprMAIFrag<SDPatternOperator Op, bit HasAbid = true,
866- bit Scaled = false> :
867- MAIFrag<Op, MayNotNeedAGPRs, HasAbid, Scaled> {
868- let GISelPredicateCode = MayNotNeedAGPRs_gisel;
869- }
862+ class VgprMAIFrag<SDPatternOperator Op, bit HasAbid = true, bit Scaled = false>
863+ : MAIFrag<Op, [{}], HasAbid, Scaled> {}
870864
871865let isAsCheapAsAMove = 1, isReMaterializable = 1 in {
872866 defm V_ACCVGPR_READ_B32 : VOP3Inst<"v_accvgpr_read_b32", VOPProfileAccRead>;
@@ -917,10 +911,14 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node = null_frag,
917911 !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, AgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
918912 MFMATable<0, "AGPR", NAME # "_e64">;
919913
920- let OtherPredicates = [isGFX90APlus], Mnemonic = OpName in
921- def _vgprcd_e64 : MAIInst<OpName # "_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD"),
922- !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
923- MFMATable<0, "VGPR", NAME # "_vgprcd_e64", NAME # "_e64">;
914+ let OtherPredicates = [isGFX90APlus], Mnemonic = OpName,
915+ AddedComplexity = 10 in def _vgprcd_e64
916+ : MAIInst<OpName#"_vgprcd",
917+ !cast<VOPProfileMAI>("VOPProfileMAI_"#P#"_VCD"),
918+ !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag,
919+ VgprMAIFrag<node, HasAbid, Scaled>),
920+ Scaled>,
921+ MFMATable<0, "VGPR", NAME#"_vgprcd_e64", NAME#"_e64">;
924922 }
925923
926924 if NoDstOverlap then {
@@ -931,16 +929,22 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node = null_frag,
931929 !if(!eq(node, null_frag), null_frag, AgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
932930 MFMATable<1, "AGPR", NAME # "_e64", NAME # "_mac_e64">;
933931
934- let OtherPredicates = [isGFX90APlus] in
935- def _mac_vgprcd_e64 : MAIInst<OpName # "_mac_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD"),
936- !if(!eq(node, null_frag), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
937- MFMATable<1, "VGPR", NAME # "_vgprcd_e64", NAME # "_mac_e64">;
932+ let OtherPredicates = [isGFX90APlus],
933+ AddedComplexity = 10 in def _mac_vgprcd_e64
934+ : MAIInst<OpName#"_mac_vgprcd",
935+ !cast<VOPProfileMAI>("VOPProfileMAI_"#P#"_VCD"),
936+ !if(!eq(node, null_frag), null_frag,
937+ VgprMAIFrag<node, HasAbid, Scaled>),
938+ Scaled>,
939+ MFMATable<1, "VGPR", NAME#"_vgprcd_e64", NAME#"_mac_e64">;
938940 }
939941 }
940942 } // End isConvergent = 1, mayRaiseFPException = 0, ReadsModeReg = 1
941943}
942944
943- // Provide a wrapper around MAIInst that provides the appended operands from V_MFMA_LD_SCALE_B32
945+ // Provide a wrapper around MAIInst that provides the appended operands from
946+ // V_MFMA_LD_SCALE_B32 AGPR variants are never selected; VGPR is selected and
947+ // may later be rewritten to AGPR.
944948multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOperator node> {
945949 defvar VariantSuffix = !subst(!toupper(OpName), "", NAME); // Drop the main opcode name prefix to get the "_fN_fM" suffix.
946950 defvar UnscaledOpName = UnscaledOpName_#VariantSuffix;
@@ -949,9 +953,9 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
949953
950954 defvar NoDstOverlap = !cast<VOPProfileMAI>(!cast<MAIInst>(UnscaledOpName#"_e64").Pfl).NoDstOverlap;
951955
952- def _e64 : ScaledMAIInst<OpName,
953- !cast<MAIInst>(UnscaledOpName#"_e64"), !if(NoDstOverlap, null_frag, AgprMAIFrag<node, HasAbid, true>) >,
954- MFMATable<0, "AGPR", NAME # "_e64">;
956+ def _e64
957+ : ScaledMAIInst<OpName, !cast<MAIInst>(UnscaledOpName#"_e64"), null_frag>,
958+ MFMATable<0, "AGPR", NAME# "_e64">;
955959
956960 def _vgprcd_e64 : ScaledMAIInst<OpName # "_vgprcd",
957961 !cast<MAIInst>(UnscaledOpName#"_vgprcd_e64"), !if(NoDstOverlap, null_frag, VgprMAIFrag<node, HasAbid, true>)>,
@@ -961,9 +965,10 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
961965 let Constraints = !if(NoDstOverlap, "$vdst = $src2", ""),
962966 isConvertibleToThreeAddress = NoDstOverlap,
963967 Mnemonic = UnscaledOpName_ in {
964- def _mac_e64 : ScaledMAIInst<OpName # "_mac",
965- !cast<MAIInst>(UnscaledOpName # "_mac_e64"), AgprMAIFrag<node, HasAbid, true>>,
966- MFMATable<1, "AGPR", NAME # "_e64">;
968+ def _mac_e64
969+ : ScaledMAIInst<OpName#"_mac",
970+ !cast<MAIInst>(UnscaledOpName#"_mac_e64"), null_frag>,
971+ MFMATable<1, "AGPR", NAME#"_e64">;
967972
968973 def _mac_vgprcd_e64 : ScaledMAIInst<OpName # " _mac_vgprcd",
969974 !cast<MAIInst>(UnscaledOpName # "_mac_vgprcd_e64"), VgprMAIFrag<node, HasAbid, true>>,
0 commit comments