@@ -868,103 +868,60 @@ def SMRDBufferImm32 : ComplexPattern<iPTR, 1, "SelectSMRDBufferImm32">;
868868def SMRDBufferSgprImm : ComplexPattern<iPTR, 2, "SelectSMRDBufferSgprImm">;
869869
870870class 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+
871875 // Returns true if it is a naturally aligned multi-dword load.
872876 LoadSDNode *Ld = cast<LoadSDNode>(N);
873877 unsigned Size = Ld->getMemoryVT().getStoreSize();
874- return ( Size <= 4) || ( Ld->getAlign().value() >= PowerOf2Ceil( Size)) ;
878+ return Size <= 4 || Ld->getAlign().value() >= Size;
875879}]> {
876880 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;
880887 }];
881888}
882889
883890class 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+
884895 // Returns true if it is an under aligned multi-dword load.
885896 LoadSDNode *Ld = cast<LoadSDNode>(N);
886897 unsigned Size = Ld->getMemoryVT().getStoreSize();
887- return ( Size > 4) && (Ld->getAlign().value() < PowerOf2Ceil( Size) );
898+ return Size > 4 && (Ld->getAlign().value() < Size);
888899}]> {
889900 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);
893907 }];
894908}
895909
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>;
959912
960913multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
961914
962915 // 1. IMM offset
963916 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+ >;
968925
969926 // 2. 32-bit IMM offset on CI
970927 if immci then def : GCNPat <
@@ -975,19 +932,49 @@ multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
975932
976933 // 3. SGPR offset
977934 def : GCNPat <
978- (smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
935+ (aligned_smrd_load (SMRDSgpr i64:$sbase, i32:$soffset)),
979936 (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+ }
981955 }
982956
983- // 4. No offset
957+ // 4. SGPR+IMM offset
984958 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 ];
988962 }
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+ }
989969
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))>;
991978}
992979
993980multiclass SMLoad_Pattern <string Instr, ValueType vt, bit immci = true> {
0 commit comments