@@ -886,94 +886,81 @@ class SMRDAlignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr),
886
886
}];
887
887
}
888
888
889
- class SMRDUnalignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr), [{
890
- // Do the alignment check if XNACK support is enabled.
891
- if (!Subtarget->isXNACKEnabled())
892
- return false;
893
-
894
- // Returns true if it is an under aligned multi-dword load.
895
- LoadSDNode *Ld = cast<LoadSDNode>(N);
896
- unsigned Size = Ld->getMemoryVT().getStoreSize();
897
- return Size > 4 && Ld->getAlign().value() < Size;
898
- }]> {
899
- let GISelPredicateCode = [{
900
- if (!Subtarget->isXNACKEnabled())
901
- return false;
902
-
903
- auto &Ld = cast<GLoad>(MI);
904
- TypeSize Size = Ld.getMMO().getSize().getValue();
905
- return Size > 4 && Ld.getMMO().getAlign().value() < Size;
906
- }];
907
- }
908
-
909
889
def aligned_smrd_load : SMRDAlignedLoadPat<smrd_load>;
910
- def unaligned_smrd_load : SMRDUnalignedLoadPat<smrd_load>;
911
890
912
891
multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
913
892
914
- // 1. IMM offset
915
- def : GCNPat <
916
- (aligned_smrd_load (SMRDImm i64:$sbase, i32:$offset)),
917
- (vt (!cast<SM_Pseudo>(Instr#"_IMM") $sbase, $offset, 0))
918
- >;
919
- if !gt(vt.Size, 32) then
893
+ let AddedComplexity = 101 in {
894
+ // 1. IMM offset
920
895
def : GCNPat <
921
- (unaligned_smrd_load (SMRDImm i64:$sbase, i32:$offset)),
922
- (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") $sbase, $offset, 0))
923
- >;
924
-
925
- // 2. 32-bit IMM offset on CI
926
- if immci then def : GCNPat <
927
- (smrd_load (SMRDImm32 i64:$sbase, i32:$offset)),
928
- (vt (!cast<InstSI>(Instr#"_IMM_ci") $sbase, $offset, 0))> {
929
- let OtherPredicates = [isGFX7Only];
930
- }
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 OtherPredicates = [isGFX7Only];
904
+ }
931
905
932
- // 3. SGPR offset
933
- def : GCNPat <
934
- (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
935
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR") $sbase, $soffset, 0))> {
936
- let OtherPredicates = [isNotGFX9Plus];
937
- }
938
- def : GCNPat <
939
- (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
940
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM") $sbase, $soffset, 0, 0))> {
941
- let OtherPredicates = [isGFX9Plus];
942
- }
943
- if !gt(vt.Size, 32) then {
906
+ // 3. SGPR offset
944
907
def : GCNPat <
945
- (unaligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
946
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_ec ") $sbase, $soffset, 0))> {
908
+ (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
909
+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR ") $sbase, $soffset, 0))> {
947
910
let OtherPredicates = [isNotGFX9Plus];
948
911
}
949
912
def : GCNPat <
950
- (unaligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
951
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM_ec ") $sbase, $soffset, 0, 0))> {
913
+ (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
914
+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM ") $sbase, $soffset, 0, 0))> {
952
915
let OtherPredicates = [isGFX9Plus];
953
916
}
954
- }
955
917
956
- // 4. SGPR+IMM offset
957
- def : GCNPat <
958
- (aligned_smrd_load (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
959
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM") $sbase, $soffset, $offset, 0))> {
960
- let OtherPredicates = [isGFX9Plus];
961
- }
962
- if !gt(vt.Size, 32) then
918
+ // 4. SGPR+IMM offset
963
919
def : GCNPat <
964
- (unaligned_smrd_load (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
965
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM_ec ") $sbase, $soffset, $offset, 0))> {
920
+ (aligned_smrd_load (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
921
+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM ") $sbase, $soffset, $offset, 0))> {
966
922
let OtherPredicates = [isGFX9Plus];
967
923
}
968
924
969
- // 5. No offset
970
- def : GCNPat <
971
- (vt (aligned_smrd_load (i64 SReg_64:$sbase))),
972
- (vt (!cast<SM_Pseudo>(Instr#"_IMM") i64:$sbase, 0, 0))>;
973
- if !gt(vt.Size, 32) then
925
+ // 5. No offset
974
926
def : GCNPat <
975
- (vt (unaligned_smrd_load (i64 SReg_64:$sbase))),
976
- (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") i64:$sbase, 0, 0))>;
927
+ (vt (aligned_smrd_load (i64 SReg_64:$sbase))),
928
+ (vt (!cast<SM_Pseudo>(Instr#"_IMM") i64:$sbase, 0, 0))>;
929
+ }
930
+
931
+ // The constrained multi-dword load equivalents.
932
+ 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 OtherPredicates = [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 OtherPredicates = [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 OtherPredicates = [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
+ }
963
+ }
977
964
}
978
965
979
966
multiclass SMLoad_Pattern <string Instr, ValueType vt, bit immci = true> {
@@ -1087,6 +1074,8 @@ defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_ubyte, "S_BUFFER_LOAD_U8">;
1087
1074
defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_short, "S_BUFFER_LOAD_I16">;
1088
1075
defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_ushort, "S_BUFFER_LOAD_U16">;
1089
1076
1077
+ } // End let AddedComplexity = 100
1078
+
1090
1079
foreach vt = Reg32Types.types in {
1091
1080
defm : SMRD_Pattern <"S_LOAD_DWORD", vt>;
1092
1081
}
@@ -1111,7 +1100,6 @@ foreach vt = SReg_512.RegTypes in {
1111
1100
defm : SMRD_Pattern <"S_LOAD_DWORDX16", vt>;
1112
1101
}
1113
1102
1114
- } // End let AddedComplexity = 100
1115
1103
1116
1104
defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORD", i32>;
1117
1105
defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORDX2", v2i32>;
0 commit comments