From: XinWang10 Date: Wed, 17 May 2023 02:53:02 +0000 (-0400) Subject: [X86]check that Uses, Defs are same for entries in memory folding table X-Git-Tag: upstream/17.0.6~8219 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=744b12adb4ec7467a038b75a7fd63dd70e9dca14;p=platform%2Fupstream%2Fllvm.git [X86]check that Uses, Defs are same for entries in memory folding table Add expensive check that Uses, Defs are same for entries in memory folding table. MemFolding could not change the Uses/Defs. Reviewed By: skan Differential Revision: https://reviews.llvm.org/D150633 --- diff --git a/llvm/utils/TableGen/X86FoldTablesEmitter.cpp b/llvm/utils/TableGen/X86FoldTablesEmitter.cpp index 475a577..89d93e4 100644 --- a/llvm/utils/TableGen/X86FoldTablesEmitter.cpp +++ b/llvm/utils/TableGen/X86FoldTablesEmitter.cpp @@ -107,6 +107,21 @@ class X86FoldTablesEmitter { OS << SimplifiedAttrs << "},\n"; } +#ifndef NDEBUG + // Check that Uses and Defs are same after memory fold. + void checkCorrectness() const { + auto &RegInstRec = *RegInst->TheDef; + auto &MemInstRec = *MemInst->TheDef; + auto ListOfUsesReg = RegInstRec.getValueAsListOfDefs("Uses"); + auto ListOfUsesMem = MemInstRec.getValueAsListOfDefs("Uses"); + auto ListOfDefsReg = RegInstRec.getValueAsListOfDefs("Defs"); + auto ListOfDefsMem = MemInstRec.getValueAsListOfDefs("Defs"); + if (ListOfUsesReg != ListOfUsesMem || ListOfDefsReg != ListOfDefsMem) + report_fatal_error("Uses/Defs couldn't be changed after folding " + + RegInstRec.getName() + " to " + + MemInstRec.getName()); + } +#endif }; // NOTE: We check the fold tables are sorted in X86InstrFoldTables.cpp by the enum of the @@ -600,6 +615,20 @@ void X86FoldTablesEmitter::run(raw_ostream &o) { &(Target.getInstruction(MemInstIter)), Entry.Strategy, true); } +#ifndef NDEBUG + auto CheckMemFoldTable = [](const FoldTable &Table) -> void { + for (const auto &Record : Table) { + auto &FoldEntry = Record.second; + FoldEntry.checkCorrectness(); + } + }; + CheckMemFoldTable(Table2Addr); + CheckMemFoldTable(Table0); + CheckMemFoldTable(Table1); + CheckMemFoldTable(Table2); + CheckMemFoldTable(Table3); + CheckMemFoldTable(Table4); +#endif // Print all tables. printTable(Table2Addr, "Table2Addr", OS); printTable(Table0, "Table0", OS);