@@ -867,19 +867,12 @@ def SMRDBufferImm32 : ComplexPattern<iPTR, 1, "SelectSMRDBufferImm32">;
867867def SMRDBufferSgprImm : ComplexPattern<iPTR, 2, "SelectSMRDBufferSgprImm">;
868868
869869class SMRDAlignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr), [{
870- // Ignore the alignment check if XNACK support is disabled.
871- if (!Subtarget->isXNACKEnabled())
872- return true;
873-
874870 // Returns true if it is a single dword load or naturally aligned multi-dword load.
875871 LoadSDNode *Ld = cast<LoadSDNode>(N);
876872 unsigned Size = Ld->getMemoryVT().getStoreSize();
877873 return Size <= 4 || Ld->getAlign().value() >= Size;
878874}]> {
879875 let GISelPredicateCode = [{
880- if (!Subtarget->isXNACKEnabled())
881- return true;
882-
883876 auto &Ld = cast<GLoad>(MI);
884877 TypeSize Size = Ld.getMMO().getSize().getValue();
885878 return Size <= 4 || Ld.getMMO().getAlign().value() >= Size;
@@ -888,79 +881,59 @@ class SMRDAlignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr),
888881
889882def aligned_smrd_load : SMRDAlignedLoadPat<smrd_load>;
890883
891- multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
884+ multiclass SMRD_Patterns <string Instr, ValueType vt, PatFrag frag,
885+ bit immci = true, string suffix = ""> {
886+ // 1. IMM offset
887+ def : GCNPat <
888+ (frag (SMRDImm i64:$sbase, i32:$offset)),
889+ (vt (!cast<SM_Pseudo>(Instr#"_IMM"#suffix) $sbase, $offset, 0))>;
890+
891+ // 2. 32-bit IMM offset on CI
892+ if immci then def : GCNPat <
893+ (frag (SMRDImm32 i64:$sbase, i32:$offset)),
894+ (vt (!cast<InstSI>(Instr#"_IMM_ci"#suffix) $sbase, $offset, 0))> {
895+ let SubtargetPredicate = isGFX7Only;
896+ }
897+
898+ // 3. SGPR offset
899+ def : GCNPat <
900+ (frag (SMRDSgpr i64:$sbase, i32:$soffset)),
901+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR"#suffix) $sbase, $soffset, 0))> {
902+ let SubtargetPredicate = isNotGFX9Plus;
903+ }
904+ def : GCNPat <
905+ (frag (SMRDSgpr i64:$sbase, i32:$soffset)),
906+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM"#suffix) $sbase, $soffset, 0, 0))> {
907+ let SubtargetPredicate = isGFX9Plus;
908+ }
892909
893- let AddedComplexity = 101 in {
894- // 1. IMM offset
895- def : GCNPat <
896- (aligned_smrd_load (SMRDImm i64:$sbase, i32:$offset)),
897- (vt (!cast<SM_Pseudo>(Instr#"_IMM") $sbase, $offset, 0))>;
898-
899- // 2. 32-bit IMM offset on CI
900- if immci then def : GCNPat <
901- (smrd_load (SMRDImm32 i64:$sbase, i32:$offset)),
902- (vt (!cast<InstSI>(Instr#"_IMM_ci") $sbase, $offset, 0))> {
903- let SubtargetPredicate = isGFX7Only;
904- }
905-
906- // 3. SGPR offset
907- def : GCNPat <
908- (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
909- (vt (!cast<SM_Pseudo>(Instr#"_SGPR") $sbase, $soffset, 0))> {
910- let SubtargetPredicate = isNotGFX9Plus;
911- }
912- def : GCNPat <
913- (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
914- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM") $sbase, $soffset, 0, 0))> {
915- let SubtargetPredicate = isGFX9Plus;
916- }
917-
918- // 4. SGPR+IMM offset
919- def : GCNPat <
920- (aligned_smrd_load (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
921- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM") $sbase, $soffset, $offset, 0))> {
922- let SubtargetPredicate = isGFX9Plus;
923- }
924-
925- // 5. No offset
926- def : GCNPat <
927- (vt (aligned_smrd_load (i64 SReg_64:$sbase))),
928- (vt (!cast<SM_Pseudo>(Instr#"_IMM") i64:$sbase, 0, 0))>;
910+ // 4. SGPR+IMM offset
911+ def : GCNPat <
912+ (frag (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
913+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM"#suffix) $sbase, $soffset, $offset, 0))> {
914+ let SubtargetPredicate = isGFX9Plus;
929915 }
930916
931- // The constrained multi-dword load equivalents.
917+ // 5. No offset
918+ def : GCNPat <
919+ (vt (frag (i64 SReg_64:$sbase))),
920+ (vt (!cast<SM_Pseudo>(Instr#"_IMM"#suffix) i64:$sbase, 0, 0))>;
921+ }
922+
923+ multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
924+ // High priority when XNACK is enabled and the load was naturally aligned.
925+ let OtherPredicates = [HasXNACKEnabled], AddedComplexity = 102 in
926+ defm: SMRD_Patterns <Instr, vt, aligned_smrd_load, immci>;
927+
928+ // XNACK is enabled and the load wasn't naturally aligned. The constrained sload variant.
932929 if !gt(vt.Size, 32) then {
933- let AddedComplexity = 100 in {
934- // 1. IMM offset
935- def : GCNPat <
936- (smrd_load (SMRDImm i64:$sbase, i32:$offset)),
937- (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") $sbase, $offset, 0))>;
938-
939- // 2. SGPR offset
940- def : GCNPat <
941- (smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
942- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_ec") $sbase, $soffset, 0))> {
943- let SubtargetPredicate = isNotGFX9Plus;
944- }
945- def : GCNPat <
946- (smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
947- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM_ec") $sbase, $soffset, 0, 0))> {
948- let SubtargetPredicate = isGFX9Plus;
949- }
950-
951- // 3. SGPR+IMM offset
952- def : GCNPat <
953- (smrd_load (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
954- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM_ec") $sbase, $soffset, $offset, 0))> {
955- let SubtargetPredicate = isGFX9Plus;
956- }
957-
958- // 4. No offset
959- def : GCNPat <
960- (vt (smrd_load (i64 SReg_64:$sbase))),
961- (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") i64:$sbase, 0, 0))>;
962- }
930+ let OtherPredicates = [HasXNACKEnabled], AddedComplexity = 101 in
931+ defm: SMRD_Patterns <Instr, vt, smrd_load, /*immci=*/false, /*suffix=*/"_ec">;
963932 }
933+
934+ // XNACK is disabled.
935+ let AddedComplexity = 100 in
936+ defm: SMRD_Patterns <Instr, vt, smrd_load, immci>;
964937}
965938
966939multiclass SMLoad_Pattern <string Instr, ValueType vt, bit immci = true> {
0 commit comments