@@ -886,94 +886,81 @@ class SMRDAlignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr),
886886 }];
887887}
888888
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-
909889def aligned_smrd_load : SMRDAlignedLoadPat<smrd_load>;
910- def unaligned_smrd_load : SMRDUnalignedLoadPat<smrd_load>;
911890
912891multiclass SMRD_Pattern <string Instr, ValueType vt, bit immci = true> {
913892
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
920895 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+ }
931905
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
944907 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))> {
947910 let OtherPredicates = [isNotGFX9Plus];
948911 }
949912 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))> {
952915 let OtherPredicates = [isGFX9Plus];
953916 }
954- }
955917
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
963919 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))> {
966922 let OtherPredicates = [isGFX9Plus];
967923 }
968924
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
974926 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+ }
977964}
978965
979966multiclass SMLoad_Pattern <string Instr, ValueType vt, bit immci = true> {
@@ -1087,6 +1074,8 @@ defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_ubyte, "S_BUFFER_LOAD_U8">;
10871074defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_short, "S_BUFFER_LOAD_I16">;
10881075defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_ushort, "S_BUFFER_LOAD_U16">;
10891076
1077+ } // End let AddedComplexity = 100
1078+
10901079foreach vt = Reg32Types.types in {
10911080defm : SMRD_Pattern <"S_LOAD_DWORD", vt>;
10921081}
@@ -1111,7 +1100,6 @@ foreach vt = SReg_512.RegTypes in {
11111100defm : SMRD_Pattern <"S_LOAD_DWORDX16", vt>;
11121101}
11131102
1114- } // End let AddedComplexity = 100
11151103
11161104defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORD", i32>;
11171105defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORDX2", v2i32>;
0 commit comments