diff --git a/llvm/include/llvm/CodeGen/MIRPrinter.h b/llvm/include/llvm/CodeGen/MIRPrinter.h index d0a11e1c4a2fd..e98ef72243b8d 100644 --- a/llvm/include/llvm/CodeGen/MIRPrinter.h +++ b/llvm/include/llvm/CodeGen/MIRPrinter.h @@ -46,7 +46,8 @@ void printMIR(raw_ostream &OS, const Module &M); /// Print a machine function using the MIR serialization format to the given /// output stream. -void printMIR(raw_ostream &OS, const MachineFunction &MF); +void printMIR(raw_ostream &OS, const MachineModuleInfo &MMI, + const MachineFunction &MF); /// Determine a possible list of successors of a basic block based on the /// basic block machine operand being used inside the block. This should give diff --git a/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h b/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h index fc7635edd82c7..3bf0fde1e26ef 100644 --- a/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h +++ b/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h @@ -33,7 +33,8 @@ class MachineModuleSlotTracker : public ModuleSlotTracker { bool ShouldInitializeAllMetadata); public: - MachineModuleSlotTracker(const MachineFunction *MF, + MachineModuleSlotTracker(const MachineModuleInfo &MMI, + const MachineFunction *MF, bool ShouldInitializeAllMetadata = true); ~MachineModuleSlotTracker(); diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index 48c3e0d7a97e6..63fb887b09b0d 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -101,13 +101,15 @@ namespace llvm { /// format. class MIRPrinter { raw_ostream &OS; + const MachineModuleInfo &MMI; DenseMap RegisterMaskIds; /// Maps from stack object indices to operand indices which will be used when /// printing frame index machine operands. DenseMap StackObjectOperandMapping; public: - MIRPrinter(raw_ostream &OS) : OS(OS) {} + MIRPrinter(raw_ostream &OS, const MachineModuleInfo &MMI) + : OS(OS), MMI(MMI) {} void print(const MachineFunction &MF); @@ -222,7 +224,7 @@ void MIRPrinter::print(const MachineFunction &MF) { MachineFunctionProperties::Property::TracksDebugUserValues); convert(YamlMF, MF.getRegInfo(), MF.getSubtarget().getRegisterInfo()); - MachineModuleSlotTracker MST(&MF); + MachineModuleSlotTracker MST(MMI, &MF); MST.incorporateFunction(MF.getFunction()); convert(MST, YamlMF.FrameInfo, MF.getFrameInfo()); convertStackObjects(YamlMF, MF, MST); @@ -1005,12 +1007,13 @@ void llvm::printMIR(raw_ostream &OS, const Module &M) { Out << const_cast(M); } -void llvm::printMIR(raw_ostream &OS, const MachineFunction &MF) { +void llvm::printMIR(raw_ostream &OS, const MachineModuleInfo &MMI, + const MachineFunction &MF) { // RemoveDIs: as there's no textual form for DbgRecords yet, print debug-info // in dbg.value format. ScopedDbgInfoFormatSetter FormatSetter( const_cast(MF.getFunction()), WriteNewDbgInfoFormat); - MIRPrinter Printer(OS); + MIRPrinter Printer(OS, MMI); Printer.print(MF); } diff --git a/llvm/lib/CodeGen/MIRPrintingPass.cpp b/llvm/lib/CodeGen/MIRPrintingPass.cpp index f70c0731ffafa..fc79410f97b58 100644 --- a/llvm/lib/CodeGen/MIRPrintingPass.cpp +++ b/llvm/lib/CodeGen/MIRPrintingPass.cpp @@ -13,7 +13,9 @@ #include "llvm/CodeGen/MIRPrinter.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/Passes.h" +#include "llvm/IR/Function.h" #include "llvm/InitializePasses.h" using namespace llvm; @@ -24,8 +26,13 @@ PreservedAnalyses PrintMIRPreparePass::run(Module &M, ModuleAnalysisManager &) { } PreservedAnalyses PrintMIRPass::run(MachineFunction &MF, - MachineFunctionAnalysisManager &) { - printMIR(OS, MF); + MachineFunctionAnalysisManager &MFAM) { + auto &MAMP = MFAM.getResult(MF); + Module *M = MF.getFunction().getParent(); + const MachineModuleInfo &MMI = + MAMP.getCachedResult(*M)->getMMI(); + + printMIR(OS, MMI, MF); return PreservedAnalyses::all(); } @@ -51,7 +58,11 @@ struct MIRPrintingPass : public MachineFunctionPass { bool runOnMachineFunction(MachineFunction &MF) override { std::string Str; raw_string_ostream StrOS(Str); - printMIR(StrOS, MF); + + const MachineModuleInfo &MMI = + getAnalysis().getMMI(); + + printMIR(StrOS, MMI, MF); MachineFunctions.append(Str); return false; } diff --git a/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp b/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp index 965539ddaca8d..8f10435e7998e 100644 --- a/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp +++ b/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp @@ -64,10 +64,11 @@ void MachineModuleSlotTracker::collectMachineMDNodes( } MachineModuleSlotTracker::MachineModuleSlotTracker( - const MachineFunction *MF, bool ShouldInitializeAllMetadata) + const MachineModuleInfo &MMI, const MachineFunction *MF, + bool ShouldInitializeAllMetadata) : ModuleSlotTracker(MF->getFunction().getParent(), ShouldInitializeAllMetadata), - TheFunction(MF->getFunction()), TheMMI(MF->getMMI()) { + TheFunction(MF->getFunction()), TheMMI(MMI) { setProcessHook([this](AbstractSlotTrackerStorage *AST, const Module *M, bool ShouldInitializeAllMetadata) { this->processMachineModule(AST, M, ShouldInitializeAllMetadata); diff --git a/llvm/tools/llvm-reduce/ReducerWorkItem.cpp b/llvm/tools/llvm-reduce/ReducerWorkItem.cpp index 78e6f72d7032d..629996d74194e 100644 --- a/llvm/tools/llvm-reduce/ReducerWorkItem.cpp +++ b/llvm/tools/llvm-reduce/ReducerWorkItem.cpp @@ -432,7 +432,7 @@ void ReducerWorkItem::print(raw_ostream &ROS, void *p) const { printMIR(ROS, *M); for (Function &F : *M) { if (auto *MF = MMI->getMachineFunction(F)) - printMIR(ROS, *MF); + printMIR(ROS, *MMI, *MF); } } else { M->print(ROS, /*AssemblyAnnotationWriter=*/nullptr, diff --git a/llvm/unittests/MIR/MachineMetadata.cpp b/llvm/unittests/MIR/MachineMetadata.cpp index 364ab187c2858..9b1c3ef1c465a 100644 --- a/llvm/unittests/MIR/MachineMetadata.cpp +++ b/llvm/unittests/MIR/MachineMetadata.cpp @@ -253,7 +253,7 @@ body: | auto *NewMMO = MF->getMachineMemOperand(OldMMO, AAInfo); MI.setMemRefs(*MF, NewMMO); - MachineModuleSlotTracker MST(MF); + MachineModuleSlotTracker MST(MMI, MF); // Print that MI with new machine metadata, which slot numbers should be // assigned. EXPECT_EQ("%1:gpr32 = LDRWui %0, 0 :: (load (s32) from %ir.p, " @@ -277,7 +277,7 @@ body: | EXPECT_EQ(Collected, Generated); // FileCheck the output from MIR printer. - std::string Output = print([&](raw_ostream &OS) { printMIR(OS, *MF); }); + std::string Output = print([&](raw_ostream &OS) { printMIR(OS, MMI, *MF); }); std::string CheckString = R"( CHECK: machineMetadataNodes: CHECK-DAG: ![[MMDOMAIN:[0-9]+]] = distinct !{!{{[0-9]+}}, !"domain"} @@ -403,7 +403,7 @@ body: | auto *NewMMO = MF->getMachineMemOperand(OldMMO, AAInfo); MI.setMemRefs(*MF, NewMMO); - MachineModuleSlotTracker MST(MF); + MachineModuleSlotTracker MST(MMI, MF); // Print that MI with new machine metadata, which slot numbers should be // assigned. EXPECT_EQ("%1:gr32 = MOV32rm %0, 1, $noreg, 0, $noreg :: (load (s32) from %ir.p, " @@ -427,7 +427,7 @@ body: | EXPECT_EQ(Collected, Generated); // FileCheck the output from MIR printer. - std::string Output = print([&](raw_ostream &OS) { printMIR(OS, *MF); }); + std::string Output = print([&](raw_ostream &OS) { printMIR(OS, MMI, *MF); }); std::string CheckString = R"( CHECK: machineMetadataNodes: CHECK-DAG: ![[MMDOMAIN:[0-9]+]] = distinct !{!{{[0-9]+}}, !"domain"} @@ -501,7 +501,7 @@ body: | auto *NewMMO = MF->getMachineMemOperand(OldMMO, AAInfo); MI.setMemRefs(*MF, NewMMO); - MachineModuleSlotTracker MST(MF); + MachineModuleSlotTracker MST(MMI, MF); // Print that MI with new machine metadata, which slot numbers should be // assigned. EXPECT_EQ( @@ -526,7 +526,7 @@ body: | EXPECT_EQ(Collected, Generated); // FileCheck the output from MIR printer. - std::string Output = print([&](raw_ostream &OS) { printMIR(OS, *MF); }); + std::string Output = print([&](raw_ostream &OS) { printMIR(OS, MMI, *MF); }); std::string CheckString = R"( CHECK: machineMetadataNodes: CHECK-DAG: ![[MMDOMAIN:[0-9]+]] = distinct !{!{{[0-9]+}}, !"domain"}