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
&(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);