@@ -932,17 +932,11 @@ defvar MayNotNeedAGPRs_gisel = [{
932932 return !MF.getInfo<SIMachineFunctionInfo>()->mayNeedAGPRs();
933933}];
934934
935- class AgprMAIFrag<SDPatternOperator Op, bit HasAbid = true,
936- bit Scaled = false> :
937- MAIFrag<Op, MayNeedAGPRs, HasAbid, Scaled> {
938- let GISelPredicateCode = MayNeedAGPRs_gisel;
939- }
935+ class AgprMAIFrag<SDPatternOperator Op, bit HasAbid = true, bit Scaled = false>
936+ : MAIFrag<Op, [{}], HasAbid, Scaled> {}
940937
941- class VgprMAIFrag<SDPatternOperator Op, bit HasAbid = true,
942- bit Scaled = false> :
943- MAIFrag<Op, MayNotNeedAGPRs, HasAbid, Scaled> {
944- let GISelPredicateCode = MayNotNeedAGPRs_gisel;
945- }
938+ class VgprMAIFrag<SDPatternOperator Op, bit HasAbid = true, bit Scaled = false>
939+ : MAIFrag<Op, [{}], HasAbid, Scaled> {}
946940
947941let isAsCheapAsAMove = 1, isReMaterializable = 1 in {
948942 defm V_ACCVGPR_READ_B32 : VOP3Inst<"v_accvgpr_read_b32", VOPProfileAccRead>;
@@ -993,10 +987,14 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node = null_frag,
993987 !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, AgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
994988 MFMATable<0, "AGPR", NAME # "_e64">;
995989
996- let OtherPredicates = [isGFX90APlus], Mnemonic = OpName in
997- def _vgprcd_e64 : MAIInst<OpName # "_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD"),
998- !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
999- MFMATable<0, "VGPR", NAME # "_vgprcd_e64", NAME # "_e64">;
990+ let OtherPredicates = [isGFX90APlus], Mnemonic = OpName,
991+ AddedComplexity = 10 in def _vgprcd_e64
992+ : MAIInst<OpName#"_vgprcd",
993+ !cast<VOPProfileMAI>("VOPProfileMAI_"#P#"_VCD"),
994+ !if(!or(NoDstOverlap, !eq(node, null_frag)), null_frag,
995+ VgprMAIFrag<node, HasAbid, Scaled>),
996+ Scaled>,
997+ MFMATable<0, "VGPR", NAME#"_vgprcd_e64", NAME#"_e64">;
1000998 }
1001999
10021000 if NoDstOverlap then {
@@ -1007,16 +1005,22 @@ multiclass MAIInst<string OpName, string P, SDPatternOperator node = null_frag,
10071005 !if(!eq(node, null_frag), null_frag, AgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
10081006 MFMATable<1, "AGPR", NAME # "_e64", NAME # "_mac_e64">;
10091007
1010- let OtherPredicates = [isGFX90APlus] in
1011- def _mac_vgprcd_e64 : MAIInst<OpName # "_mac_vgprcd", !cast<VOPProfileMAI>("VOPProfileMAI_" # P # "_VCD"),
1012- !if(!eq(node, null_frag), null_frag, VgprMAIFrag<node, HasAbid, Scaled>), Scaled>,
1013- MFMATable<1, "VGPR", NAME # "_vgprcd_e64", NAME # "_mac_e64">;
1008+ let OtherPredicates = [isGFX90APlus],
1009+ AddedComplexity = 10 in def _mac_vgprcd_e64
1010+ : MAIInst<OpName#"_mac_vgprcd",
1011+ !cast<VOPProfileMAI>("VOPProfileMAI_"#P#"_VCD"),
1012+ !if(!eq(node, null_frag), null_frag,
1013+ VgprMAIFrag<node, HasAbid, Scaled>),
1014+ Scaled>,
1015+ MFMATable<1, "VGPR", NAME#"_vgprcd_e64", NAME#"_mac_e64">;
10141016 }
10151017 }
10161018 } // End isConvergent = 1, mayRaiseFPException = 0, ReadsModeReg = 1
10171019}
10181020
1019- // Provide a wrapper around MAIInst that provides the appended operands from V_MFMA_LD_SCALE_B32
1021+ // Provide a wrapper around MAIInst that provides the appended operands from
1022+ // V_MFMA_LD_SCALE_B32 AGPR variants are never selected; VGPR is selected and
1023+ // may later be rewritten to AGPR.
10201024multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOperator node> {
10211025 defvar VariantSuffix = !subst(!toupper(OpName), "", NAME); // Drop the main opcode name prefix to get the "_fN_fM" suffix.
10221026 defvar UnscaledOpName = UnscaledOpName_#VariantSuffix;
@@ -1025,9 +1029,9 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
10251029
10261030 defvar NoDstOverlap = !cast<VOPProfileMAI>(!cast<MAIInst>(UnscaledOpName#"_e64").Pfl).NoDstOverlap;
10271031
1028- def _e64 : ScaledMAIInst<OpName,
1029- !cast<MAIInst>(UnscaledOpName#"_e64"), !if(NoDstOverlap, null_frag, AgprMAIFrag<node, HasAbid, true>) >,
1030- MFMATable<0, "AGPR", NAME # "_e64">;
1032+ def _e64
1033+ : ScaledMAIInst<OpName, !cast<MAIInst>(UnscaledOpName#"_e64"), null_frag>,
1034+ MFMATable<0, "AGPR", NAME# "_e64">;
10311035
10321036 def _vgprcd_e64 : ScaledMAIInst<OpName # "_vgprcd",
10331037 !cast<MAIInst>(UnscaledOpName#"_vgprcd_e64"), !if(NoDstOverlap, null_frag, VgprMAIFrag<node, HasAbid, true>)>,
@@ -1037,9 +1041,10 @@ multiclass ScaledMAIInst_mc<string OpName, string UnscaledOpName_, SDPatternOper
10371041 let Constraints = !if(NoDstOverlap, "$vdst = $src2", ""),
10381042 isConvertibleToThreeAddress = NoDstOverlap,
10391043 Mnemonic = UnscaledOpName_ in {
1040- def _mac_e64 : ScaledMAIInst<OpName # "_mac",
1041- !cast<MAIInst>(UnscaledOpName # "_mac_e64"), AgprMAIFrag<node, HasAbid, true>>,
1042- MFMATable<1, "AGPR", NAME # "_e64">;
1044+ def _mac_e64
1045+ : ScaledMAIInst<OpName#"_mac",
1046+ !cast<MAIInst>(UnscaledOpName#"_mac_e64"), null_frag>,
1047+ MFMATable<1, "AGPR", NAME#"_e64">;
10431048
10441049 def _mac_vgprcd_e64 : ScaledMAIInst<OpName # " _mac_vgprcd",
10451050 !cast<MAIInst>(UnscaledOpName # "_mac_vgprcd_e64"), VgprMAIFrag<node, HasAbid, true>>,
0 commit comments