@@ -867,19 +867,12 @@ def SMRDBufferImm32 : ComplexPattern<iPTR, 1, "SelectSMRDBufferImm32">;
867
867
def SMRDBufferSgprImm : ComplexPattern<iPTR, 2, "SelectSMRDBufferSgprImm">;
868
868
869
869
class 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
-
874
870
// Returns true if it is a single dword load or naturally aligned multi-dword load.
875
871
LoadSDNode *Ld = cast<LoadSDNode>(N);
876
872
unsigned Size = Ld->getMemoryVT().getStoreSize();
877
873
return Size <= 4 || Ld->getAlign().value() >= Size;
878
874
}]> {
879
875
let GISelPredicateCode = [{
880
- if (!Subtarget->isXNACKEnabled())
881
- return true;
882
-
883
876
auto &Ld = cast<GLoad>(MI);
884
877
TypeSize Size = Ld.getMMO().getSize().getValue();
885
878
return Size <= 4 || Ld.getMMO().getAlign().value() >= Size;
@@ -888,79 +881,59 @@ class SMRDAlignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr),
888
881
889
882
def aligned_smrd_load : SMRDAlignedLoadPat<smrd_load>;
890
883
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
+ }
892
909
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;
929
915
}
930
916
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.
932
929
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">;
963
932
}
933
+
934
+ // XNACK is disabled.
935
+ let AddedComplexity = 100 in
936
+ defm: SMRD_Patterns <Instr, vt, smrd_load, immci>;
964
937
}
965
938
966
939
multiclass SMLoad_Pattern <string Instr, ValueType vt, bit immci = true> {
0 commit comments