diff --git a/llvm/include/llvm/CodeGen/MachineCFGPrinter.h b/llvm/include/llvm/CodeGen/MachineCFGPrinter.h index ea3ff5a5c828b..f91a7caa5d0ca 100644 --- a/llvm/include/llvm/CodeGen/MachineCFGPrinter.h +++ b/llvm/include/llvm/CodeGen/MachineCFGPrinter.h @@ -12,6 +12,7 @@ #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/Support/DOTGraphTraits.h" namespace llvm { @@ -89,4 +90,15 @@ struct DOTGraphTraits : public DefaultDOTGraphTraits { "' function"; } }; + +class MachineCFGPrinterPass : public PassInfoMixin { + raw_ostream &OS; + +public: + explicit MachineCFGPrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM); + static bool isRequired() { return true; } +}; + } // namespace llvm diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index 8c22a28eba277..c0679913c9b8b 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -141,6 +141,7 @@ MACHINE_FUNCTION_PASS("block-placement-stats", MachineBlockPlacementStatsPass()) MACHINE_FUNCTION_PASS("branch-relaxation", BranchRelaxationPass()) MACHINE_FUNCTION_PASS("dead-mi-elimination", DeadMachineInstructionElimPass()) MACHINE_FUNCTION_PASS("detect-dead-lanes", DetectDeadLanesPass()) +MACHINE_FUNCTION_PASS("dot-machine-cfg", MachineCFGPrinterPass(errs())) MACHINE_FUNCTION_PASS("early-ifcvt", EarlyIfConverterPass()) MACHINE_FUNCTION_PASS("early-machinelicm", EarlyMachineLICMPass()) MACHINE_FUNCTION_PASS("early-tailduplication", EarlyTailDuplicatePass()) @@ -288,7 +289,6 @@ DUMMY_MACHINE_FUNCTION_PASS("break-false-deps", BreakFalseDepsPass) DUMMY_MACHINE_FUNCTION_PASS("cfguard-longjmp", CFGuardLongjmpPass) DUMMY_MACHINE_FUNCTION_PASS("cfi-fixup", CFIFixupPass) DUMMY_MACHINE_FUNCTION_PASS("cfi-instr-inserter", CFIInstrInserterPass) -DUMMY_MACHINE_FUNCTION_PASS("dot-machine-cfg", MachineCFGPrinter) DUMMY_MACHINE_FUNCTION_PASS("fs-profile-loader", MIRProfileLoaderNewPass) DUMMY_MACHINE_FUNCTION_PASS("funclet-layout", FuncletLayoutPass) DUMMY_MACHINE_FUNCTION_PASS("gc-empty-basic-blocks", GCEmptyBasicBlocksPass) diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp index 7bfb817713808..5576ebbebccd0 100644 --- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp +++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp @@ -54,6 +54,18 @@ static void writeMCFGToDotFile(MachineFunction &MF) { errs() << '\n'; } +PreservedAnalyses +MachineCFGPrinterPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + if (!MCFGFuncName.empty() && !MF.getName().contains(MCFGFuncName)) + return PreservedAnalyses::all(); + OS << "Writing Machine CFG for function "; + MF.getFunction().printAsOperand(OS, /*PrintType=*/false); + OS << '\n'; + writeMCFGToDotFile(MF); + return PreservedAnalyses::all(); +} + namespace { class MachineCFGPrinter : public MachineFunctionPass { diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index e7057d9a6b625..a9e74c7acf518 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -118,6 +118,7 @@ #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" #include "llvm/CodeGen/MachineBlockPlacement.h" #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" +#include "llvm/CodeGen/MachineCFGPrinter.h" #include "llvm/CodeGen/MachineCSE.h" #include "llvm/CodeGen/MachineCopyPropagation.h" #include "llvm/CodeGen/MachineCycleAnalysis.h" diff --git a/llvm/test/Analysis/DotMachineCFG/AMDGPU/functions.mir b/llvm/test/Analysis/DotMachineCFG/AMDGPU/functions.mir index b34493aea8668..970729f4cc50b 100644 --- a/llvm/test/Analysis/DotMachineCFG/AMDGPU/functions.mir +++ b/llvm/test/Analysis/DotMachineCFG/AMDGPU/functions.mir @@ -1,5 +1,7 @@ # RUN: llc -mtriple=amdgcn-- -run-pass=dot-machine-cfg -mcfg-dot-filename-prefix=%t -mcfg-func-name=func2 -o - %s 2>&1 > /dev/null # RUN: FileCheck %s -input-file=%t.func2.dot --check-prefix=MCFG +# RUN: llc -mtriple=amdgcn-- -passes=dot-machine-cfg -mcfg-dot-filename-prefix=%t -mcfg-func-name=func2 -filetype=null %s +# RUN: FileCheck %s -input-file=%t.func2.dot --check-prefix=MCFG # MCFG-NOT: digraph "Machine CFG for 'func1' function" name: func1 diff --git a/llvm/test/Analysis/DotMachineCFG/AMDGPU/irreducible.mir b/llvm/test/Analysis/DotMachineCFG/AMDGPU/irreducible.mir index 56ea4b528ba8f..3662789fb4499 100644 --- a/llvm/test/Analysis/DotMachineCFG/AMDGPU/irreducible.mir +++ b/llvm/test/Analysis/DotMachineCFG/AMDGPU/irreducible.mir @@ -2,6 +2,10 @@ # RUN: FileCheck %s -input-file=%t.irreducible.dot --check-prefix=MCFG # RUN: llc -mtriple=amdgcn-- -run-pass=dot-machine-cfg -mcfg-dot-filename-prefix=%t -dot-mcfg-only -o - %s 2>&1 > /dev/null # RUN: FileCheck %s -input-file=%t.irreducible.dot --check-prefix=MCFG-ONLY +# RUN: llc -mtriple=amdgcn-- -passes=dot-machine-cfg -mcfg-dot-filename-prefix=%t -filetype=null %s +# RUN: FileCheck %s -input-file=%t.irreducible.dot --check-prefix=MCFG +# RUN: llc -mtriple=amdgcn-- -passes=dot-machine-cfg -mcfg-dot-filename-prefix=%t -dot-mcfg-only -filetype=null %s +# RUN: FileCheck %s -input-file=%t.irreducible.dot --check-prefix=MCFG-ONLY # MCFG: digraph "Machine CFG for 'irreducible' function" # MCFG-NEXT: label="Machine CFG for 'irreducible' function"