diff options
Diffstat (limited to 'backend/lib/MIR')
| -rw-r--r-- | backend/lib/MIR/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | backend/lib/MIR/ReachingDefPrinter.cpp | 81 |
2 files changed, 85 insertions, 0 deletions
diff --git a/backend/lib/MIR/CMakeLists.txt b/backend/lib/MIR/CMakeLists.txt index cbdf201..a93917b 100644 --- a/backend/lib/MIR/CMakeLists.txt +++ b/backend/lib/MIR/CMakeLists.txt @@ -3,6 +3,7 @@ set( RCCBackendMIRSources EmbeddedIR.cpp + ReachingDefPrinter.cpp "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MILexer.cpp" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MIParser.cpp" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MIRParser.cpp" @@ -16,6 +17,7 @@ set( "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MIRPrinter.h" "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MIRYamlMapping.h" "${RCC_BACKEND_SOURCE_DIR}/include/rcc/MIR/EmbeddedIR.h" + "${RCC_BACKEND_SOURCE_DIR}/include/rcc/MIR/ReachingDefPrinter.h" ) add_library(RCCBackendMIR ${RCCBackendMIRSources}) @@ -54,6 +56,7 @@ install( rcc_backend_register_format_files( "${CMAKE_CURRENT_SOURCE_DIR}/EmbeddedIR.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ReachingDefPrinter.cpp" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MILexer.cpp" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MILexer.h" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MIParser.cpp" @@ -64,6 +67,7 @@ rcc_backend_register_format_files( ) rcc_backend_register_tidy_files( "${CMAKE_CURRENT_SOURCE_DIR}/EmbeddedIR.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ReachingDefPrinter.cpp" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MILexer.cpp" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MIParser.cpp" "${RCC_BACKEND_SOURCE_DIR}/lib/CodeGen/MIRParser/MIRParser.cpp" diff --git a/backend/lib/MIR/ReachingDefPrinter.cpp b/backend/lib/MIR/ReachingDefPrinter.cpp new file mode 100644 index 0000000..5687590 --- /dev/null +++ b/backend/lib/MIR/ReachingDefPrinter.cpp @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "rcc/MIR/ReachingDefPrinter.h" + +#include "rcc/CodeGen/MIRPrinter.h" +#include "rcc/CodeGen/MachineBasicBlock.h" +#include "rcc/CodeGen/MachineFunction.h" +#include "rcc/CodeGen/MachineInstr.h" +#include "rcc/CodeGen/MachineOperand.h" +#include "rcc/CodeGen/ReachingDefAnalysis.h" + +#include <iostream> +#include <optional> + +namespace rcc::mir { + +const MachinePassContract &ReachingDefPrinterPass::contract() const noexcept { + static const MachinePassContract Contract = [] { + MachinePassContract Value{ + .Name = std::string(name()), + .Requires = {MachineFunctionProperty::NoVRegs}, + .Sets = {}, + .Clears = {}, + .RequiredAnalyses = {MachineFunctionAnalysisManager::id<ReachingDefAnalysis>()}, + .VerificationStage = std::nullopt, + }; + Value.DeclaredChanges = {}; + return Value; + }(); + return Contract; +} + +Expected<MachinePassResult> ReachingDefPrinterPass::run(MachineFunction &Function, + const TargetDescription &Target, + MachineFunctionAnalysisManager &Analyses) { + auto ReachingDefinitions = Analyses.getResult<ReachingDefAnalysis>(Function, Target); + if (!ReachingDefinitions) + return std::unexpected(ReachingDefinitions.error()); + auto Context = createMachineFunctionPrintContext(Function); + if (!Context) + return std::unexpected(Context.error()); + + std::cerr << "Reaching definitions for for machine function: " << Function.name() << '\n'; + for (MachineBasicBlock *Block = Function.firstBlock(); Block != nullptr; Block = Block->next()) { + std::cerr << "%bb." << Block->denseNumber().value_or(0) << ":\n"; + for (MachineInstr *Instruction = Block->firstInstruction(); Instruction != nullptr; + Instruction = Instruction->next()) { + for (const MachineOperand &Operand : Instruction->operands()) { + if (Operand.isRegister()) { + const std::optional<Register> Reg = Operand.registerValue(); + if (Operand.isDef() || !Reg || Reg->isNoRegister()) + continue; + } else if (Operand.kind() != MachineOperand::Kind::FrameIndex) { + continue; + } + + auto PrintedOperand = printMachineOperand(Operand, Target, *Context); + if (!PrintedOperand) + return std::unexpected(PrintedOperand.error()); + std::cerr << *PrintedOperand << ":{ "; + for (const MachineInstr *Definition : + (*ReachingDefinitions)->reachingDefinitions(Operand)) { + std::cerr << (*ReachingDefinitions)->instructionNumber(*Definition) << ' '; + } + std::cerr << "}\n"; + } + + auto PrintedInstruction = printMachineInstruction(*Instruction, Target, *Context); + if (!PrintedInstruction) + return std::unexpected(PrintedInstruction.error()); + std::cerr << (*ReachingDefinitions)->instructionNumber(*Instruction) << ": " + << *PrintedInstruction << "\n\n"; + } + } + + MachinePassResult Result; + Result.Preserved = PreservedAnalyses::all(); + return Result; +} + +} // namespace rcc::mir |
