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