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,35 @@ OS << SimplifiedAttrs << "},\n"; } + #ifndef NDEBUG + bool CheckCorrectness() const{ + // Check that Uses, Defs are same for entries in memory folding table + auto& RegInstRec = *RegInst->TheDef; + auto& MemInstRec = *MemInst->TheDef; + auto ListOfUses_l = RegInstRec.getValueAsListOfDefs("Uses"); + auto ListOfUses_r = MemInstRec.getValueAsListOfDefs("Uses"); + auto ListOfDefs_l = RegInstRec.getValueAsListOfDefs("Defs"); + auto ListOfDefs_r = MemInstRec.getValueAsListOfDefs("Defs"); + bool ret = true; + if (ListOfUses_l.size() != ListOfUses_r.size() || + ListOfDefs_l.size() != ListOfDefs_r.size()) + ret = false; + for (unsigned long i = 0; i < ListOfUses_l.size(); i++) { + if (ListOfUses_l[i] != ListOfUses_r[i]) + ret = false; + } + for (unsigned long i = 0; i < ListOfDefs_l.size(); i++) { + if (ListOfDefs_l[i] != ListOfDefs_r[i]) + ret = false; + } + if (!ret) { + errs() << "Error: Incorrect converting "; + errs() << RegInstRec.getName() << " to "; + errs() << MemInstRec.getName() << "\n"; + } + return ret; + } + #endif }; // NOTE: We check the fold tables are sorted in X86InstrFoldTables.cpp by the enum of the @@ -600,6 +629,24 @@ &(Target.getInstruction(MemInstIter)), Entry.Strategy, true); } + #ifndef NDEBUG + // To Check if the instructions convertion in MemFoldTable change the Uses + // and Defs, it's wrong when we convert it and changed its Defs/Uses. + auto CheckMemFoldTable = [] (const FoldTable& table) -> void { + for (const auto &record: table){ + auto& FoldEntry = record.second; + if(!FoldEntry.CheckCorrectness()){ + break; + } + } + }; + CheckMemFoldTable(Table2Addr); + CheckMemFoldTable(Table0); + CheckMemFoldTable(Table1); + CheckMemFoldTable(Table2); + CheckMemFoldTable(Table3); + CheckMemFoldTable(Table4); + #endif // Print all tables. printTable(Table2Addr, "Table2Addr", OS); printTable(Table0, "Table0", OS);