@@ -867,103 +867,60 @@ 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
+
870
874
// Returns true if it is a naturally aligned multi-dword load.
871
875
LoadSDNode *Ld = cast<LoadSDNode>(N);
872
876
unsigned Size = Ld->getMemoryVT().getStoreSize();
873
- return ( Size <= 4) || ( Ld->getAlign().value() >= PowerOf2Ceil( Size)) ;
877
+ return Size <= 4 || Ld->getAlign().value() >= Size;
874
878
}]> {
875
879
let GISelPredicateCode = [{
876
- auto &Ld = cast<GLoad>(MI);
877
- TypeSize Size = Ld.getMMO().getSize().getValue();
878
- return (Size <= 4) || (Ld.getMMO().getAlign().value() >= PowerOf2Ceil(Size));
880
+ if (!Subtarget->isXNACKEnabled())
881
+ return true;
882
+
883
+ auto &Ld = cast<GLoad>(MI);
884
+ TypeSize Size = Ld.getMMO().getSize().getValue();
885
+ return Size <= 4 || Ld.getMMO().getAlign().value() >= Size;
879
886
}];
880
887
}
881
888
882
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
+
883
894
// Returns true if it is an under aligned multi-dword load.
884
895
LoadSDNode *Ld = cast<LoadSDNode>(N);
885
896
unsigned Size = Ld->getMemoryVT().getStoreSize();
886
- return ( Size > 4) && (Ld->getAlign().value() < PowerOf2Ceil( Size) );
897
+ return Size > 4 && (Ld->getAlign().value() < Size);
887
898
}]> {
888
899
let GISelPredicateCode = [{
889
- auto &Ld = cast<GLoad>(MI);
890
- TypeSize Size = Ld.getMMO().getSize().getValue();
891
- return (Size > 4) && (Ld.getMMO().getAlign().value() < PowerOf2Ceil(Size));
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);
892
906
}];
893
907
}
894
908
895
- def alignedmultidwordload : SMRDAlignedLoadPat<smrd_load>;
896
- def unalignedmultidwordload : SMRDUnalignedLoadPat<smrd_load>;
897
-
898
- multiclass SMRD_Align_Pattern <string Instr, ValueType vt> {
899
-
900
- // 1. IMM offset
901
- def : GCNPat <
902
- (alignedmultidwordload (SMRDImm i64:$sbase, i32:$offset)),
903
- (vt (!cast<SM_Pseudo>(Instr#"_IMM") $sbase, $offset, 0))> {
904
- let OtherPredicates = [isGFX8Plus];
905
- }
906
- def : GCNPat <
907
- (unalignedmultidwordload (SMRDImm i64:$sbase, i32:$offset)),
908
- (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") $sbase, $offset, 0))> {
909
- let OtherPredicates = [isGFX8Plus];
910
- }
911
-
912
- // 2. SGPR offset
913
- def : GCNPat <
914
- (alignedmultidwordload (SMRDSgpr i64:$sbase, i32:$soffset)),
915
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR") $sbase, $soffset, 0))> {
916
- let OtherPredicates = [isGFX8Only];
917
- }
918
- def : GCNPat <
919
- (unalignedmultidwordload (SMRDSgpr i64:$sbase, i32:$soffset)),
920
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_ec") $sbase, $soffset, 0))> {
921
- let OtherPredicates = [isGFX8Only];
922
- }
923
- def : GCNPat <
924
- (alignedmultidwordload (SMRDSgpr i64:$sbase, i32:$soffset)),
925
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM") $sbase, $soffset, 0, 0))> {
926
- let OtherPredicates = [isGFX9Plus];
927
- }
928
- def : GCNPat <
929
- (unalignedmultidwordload (SMRDSgpr i64:$sbase, i32:$soffset)),
930
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM_ec") $sbase, $soffset, 0, 0))> {
931
- let OtherPredicates = [isGFX9Plus];
932
- }
933
-
934
- // 3. SGPR+IMM offset
935
- def : GCNPat <
936
- (alignedmultidwordload (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
937
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM") $sbase, $soffset, $offset, 0))> {
938
- let OtherPredicates = [isGFX9Plus];
939
- }
940
- def : GCNPat <
941
- (unalignedmultidwordload (SMRDSgprImm i64:$sbase, i32:$soffset, i32:$offset)),
942
- (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM_ec") $sbase, $soffset, $offset, 0))> {
943
- let OtherPredicates = [isGFX9Plus];
944
- }
945
-
946
- // 4. No offset
947
- def : GCNPat <
948
- (vt (alignedmultidwordload (i64 SReg_64:$sbase))),
949
- (vt (!cast<SM_Pseudo>(Instr#"_IMM") i64:$sbase, 0, 0))> {
950
- let OtherPredicates = [isGFX8Plus];
951
- }
952
- def : GCNPat <
953
- (vt (unalignedmultidwordload (i64 SReg_64:$sbase))),
954
- (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") i64:$sbase, 0, 0))> {
955
- let OtherPredicates = [isGFX8Plus];
956
- }
957
- }
909
+ def aligned_smrd_load : SMRDAlignedLoadPat<smrd_load>;
910
+ def unaligned_smrd_load : SMRDUnalignedLoadPat<smrd_load>;
958
911
959
912
multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
960
913
961
914
// 1. IMM offset
962
915
def : GCNPat <
963
- (smrd_load (SMRDImm i64:$sbase, i32:$offset)),
964
- (vt (!cast<SM_Pseudo>(Instr#"_IMM") $sbase, $offset, 0))> {
965
- let OtherPredicates = [isGFX6GFX7];
966
- }
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
920
+ def : GCNPat <
921
+ (unaligned_smrd_load (SMRDImm i64:$sbase, i32:$offset)),
922
+ (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") $sbase, $offset, 0))
923
+ >;
967
924
968
925
// 2. 32-bit IMM offset on CI
969
926
if immci then def : GCNPat <
@@ -974,19 +931,49 @@ multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
974
931
975
932
// 3. SGPR offset
976
933
def : GCNPat <
977
- (smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
934
+ (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
978
935
(vt (!cast<SM_Pseudo>(Instr#"_SGPR") $sbase, $soffset, 0))> {
979
- let OtherPredicates = [isGFX6GFX7 ];
936
+ let OtherPredicates = [isNotGFX9Plus ];
980
937
}
981
-
982
- // 4. No offset
983
938
def : GCNPat <
984
- (vt (smrd_load (i64 SReg_64:$sbase))),
985
- (vt (!cast<SM_Pseudo>(Instr#"_IMM") i64:$sbase, 0, 0))> {
986
- let OtherPredicates = [isGFX6GFX7];
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 {
944
+ def : GCNPat <
945
+ (unaligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
946
+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR_ec") $sbase, $soffset, 0))> {
947
+ let OtherPredicates = [isNotGFX9Plus];
948
+ }
949
+ def : GCNPat <
950
+ (unaligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
951
+ (vt (!cast<SM_Pseudo>(Instr#"_SGPR_IMM_ec") $sbase, $soffset, 0, 0))> {
952
+ let OtherPredicates = [isGFX9Plus];
953
+ }
987
954
}
988
955
989
- defm : SMRD_Align_Pattern<Instr, vt>;
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
963
+ 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))> {
966
+ let OtherPredicates = [isGFX9Plus];
967
+ }
968
+
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
974
+ def : GCNPat <
975
+ (vt (unaligned_smrd_load (i64 SReg_64:$sbase))),
976
+ (vt (!cast<SM_Pseudo>(Instr#"_IMM_ec") i64:$sbase, 0, 0))>;
990
977
}
991
978
992
979
multiclass SMLoad_Pattern <string Instr, ValueType vt, bit immci = true> {
0 commit comments