Skip to content

Commit b572547

Browse files
committed
Used only one PatFrag to handle the new constrain introduced.
1 parent de20a1d commit b572547

File tree

1 file changed

+59
-71
lines changed

1 file changed

+59
-71
lines changed

llvm/lib/Target/AMDGPU/SMInstructions.td

Lines changed: 59 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
909889
def aligned_smrd_load : SMRDAlignedLoadPat<smrd_load>;
910-
def unaligned_smrd_load : SMRDUnalignedLoadPat<smrd_load>;
911890

912891
multiclass 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

979966
multiclass SMLoad_Pattern <string Instr, ValueType vt, bit immci = true> {
@@ -1087,6 +1074,8 @@ defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_ubyte, "S_BUFFER_LOAD_U8">;
10871074
defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_short, "S_BUFFER_LOAD_I16">;
10881075
defm : ScalarBufferLoadIntrinsicPat <SIsbuffer_load_ushort, "S_BUFFER_LOAD_U16">;
10891076

1077+
} // End let AddedComplexity = 100
1078+
10901079
foreach vt = Reg32Types.types in {
10911080
defm : SMRD_Pattern <"S_LOAD_DWORD", vt>;
10921081
}
@@ -1111,7 +1100,6 @@ foreach vt = SReg_512.RegTypes in {
11111100
defm : SMRD_Pattern <"S_LOAD_DWORDX16", vt>;
11121101
}
11131102

1114-
} // End let AddedComplexity = 100
11151103

11161104
defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORD", i32>;
11171105
defm : SMLoad_Pattern <"S_BUFFER_LOAD_DWORDX2", v2i32>;

0 commit comments

Comments
 (0)