diff --git a/llvm/utils/TableGen/X86FoldTablesEmitter.cpp b/llvm/utils/TableGen/X86FoldTablesEmitter.cpp --- a/llvm/utils/TableGen/X86FoldTablesEmitter.cpp +++ b/llvm/utils/TableGen/X86FoldTablesEmitter.cpp @@ -107,6 +107,21 @@ 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 @@ &(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);