[CodeGen][NPM] Port UnreachableMachineBlockElim to NPM (#136127)
diff --git a/llvm/include/llvm/CodeGen/UnreachableBlockElim.h b/llvm/include/llvm/CodeGen/UnreachableBlockElim.h index 7dbae77..3c2b701 100644 --- a/llvm/include/llvm/CodeGen/UnreachableBlockElim.h +++ b/llvm/include/llvm/CodeGen/UnreachableBlockElim.h
@@ -22,6 +22,7 @@ #ifndef LLVM_CODEGEN_UNREACHABLEBLOCKELIM_H #define LLVM_CODEGEN_UNREACHABLEBLOCKELIM_H +#include "llvm/CodeGen/MachinePassManager.h" #include "llvm/IR/PassManager.h" namespace llvm { @@ -31,6 +32,13 @@ public: PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; + +class UnreachableMachineBlockElimPass + : public PassInfoMixin<UnreachableMachineBlockElimPass> { +public: + PreservedAnalyses run(MachineFunction &F, MachineFunctionAnalysisManager &AM); +}; + } // end namespace llvm #endif // LLVM_CODEGEN_UNREACHABLEBLOCKELIM_H
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 9fd8f82..9bef8e4 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h
@@ -315,7 +315,7 @@ void initializeUnifyLoopExitsLegacyPassPass(PassRegistry &); void initializeUnpackMachineBundlesPass(PassRegistry &); void initializeUnreachableBlockElimLegacyPassPass(PassRegistry &); -void initializeUnreachableMachineBlockElimPass(PassRegistry &); +void initializeUnreachableMachineBlockElimLegacyPass(PassRegistry &); void initializeVerifierLegacyPassPass(PassRegistry &); void initializeVirtRegMapWrapperLegacyPass(PassRegistry &); void initializeVirtRegRewriterPass(PassRegistry &);
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index d092049..61e377d 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -47,6 +47,7 @@ #include "llvm/CodeGen/JMCInstrumenter.h" #include "llvm/CodeGen/LiveDebugValuesPass.h" #include "llvm/CodeGen/LiveIntervals.h" +#include "llvm/CodeGen/LiveVariables.h" #include "llvm/CodeGen/LocalStackSlotAllocation.h" #include "llvm/CodeGen/LowerEmuTLS.h" #include "llvm/CodeGen/MIRPrinter.h" @@ -1172,7 +1173,21 @@ addPass(ProcessImplicitDefsPass()); + // LiveVariables currently requires pure SSA form. + // + // FIXME: Once TwoAddressInstruction pass no longer uses kill flags, + // LiveVariables can be removed completely, and LiveIntervals can be directly + // computed. (We still either need to regenerate kill flags after regalloc, or + // preferably fix the scavenger to not depend on them). + // FIXME: UnreachableMachineBlockElim is a dependant pass of LiveVariables. + // When LiveVariables is removed this has to be removed/moved either. + // Explicit addition of UnreachableMachineBlockElim allows stopping before or + // after it with -stop-before/-stop-after. + addPass(UnreachableMachineBlockElimPass()); + addPass(RequireAnalysisPass<LiveVariablesAnalysis, MachineFunction>()); + // Edge splitting is smarter with machine loop info. + addPass(RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>()); addPass(PHIEliminationPass()); // Eventually, we want to run LiveIntervals before PHI elimination.
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index fff5083..8c22a28 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -194,6 +194,8 @@ MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass()) MACHINE_FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass()) MACHINE_FUNCTION_PASS("two-address-instruction", TwoAddressInstructionPass()) +MACHINE_FUNCTION_PASS("unreachable-mbb-elimination", + UnreachableMachineBlockElimPass()) MACHINE_FUNCTION_PASS("verify", MachineVerifierPass()) MACHINE_FUNCTION_PASS("verify<machine-trace-metrics>", MachineTraceMetricsVerifierPass()) MACHINE_FUNCTION_PASS("xray-instrumentation", XRayInstrumentationPass())
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 2b0e938..a34adcf 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp
@@ -140,7 +140,7 @@ initializeTypePromotionLegacyPass(Registry); initializeUnpackMachineBundlesPass(Registry); initializeUnreachableBlockElimLegacyPassPass(Registry); - initializeUnreachableMachineBlockElimPass(Registry); + initializeUnreachableMachineBlockElimLegacyPass(Registry); initializeVirtRegMapWrapperLegacyPass(Registry); initializeVirtRegRewriterPass(Registry); initializeWasmEHPreparePass(Registry);
diff --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp index ab95200..f8e058383 100644 --- a/llvm/lib/CodeGen/LiveVariables.cpp +++ b/llvm/lib/CodeGen/LiveVariables.cpp
@@ -61,7 +61,7 @@ char &llvm::LiveVariablesID = LiveVariablesWrapperPass::ID; INITIALIZE_PASS_BEGIN(LiveVariablesWrapperPass, "livevars", "Live Variable Analysis", false, false) -INITIALIZE_PASS_DEPENDENCY(UnreachableMachineBlockElim) +INITIALIZE_PASS_DEPENDENCY(UnreachableMachineBlockElimLegacy) INITIALIZE_PASS_END(LiveVariablesWrapperPass, "livevars", "Live Variable Analysis", false, false)
diff --git a/llvm/lib/CodeGen/UnreachableBlockElim.cpp b/llvm/lib/CodeGen/UnreachableBlockElim.cpp index aa4ccec..f9f7b47 100644 --- a/llvm/lib/CodeGen/UnreachableBlockElim.cpp +++ b/llvm/lib/CodeGen/UnreachableBlockElim.cpp
@@ -72,32 +72,58 @@ } namespace { - class UnreachableMachineBlockElim : public MachineFunctionPass { - bool runOnMachineFunction(MachineFunction &F) override; - void getAnalysisUsage(AnalysisUsage &AU) const override; +class UnreachableMachineBlockElim { + MachineDominatorTree *MDT; + MachineLoopInfo *MLI; - public: - static char ID; // Pass identification, replacement for typeid - UnreachableMachineBlockElim() : MachineFunctionPass(ID) {} - }; -} -char UnreachableMachineBlockElim::ID = 0; +public: + UnreachableMachineBlockElim(MachineDominatorTree *MDT, MachineLoopInfo *MLI) + : MDT(MDT), MLI(MLI) {} + bool run(MachineFunction &MF); +}; -INITIALIZE_PASS(UnreachableMachineBlockElim, "unreachable-mbb-elimination", - "Remove unreachable machine basic blocks", false, false) +class UnreachableMachineBlockElimLegacy : public MachineFunctionPass { + bool runOnMachineFunction(MachineFunction &F) override; + void getAnalysisUsage(AnalysisUsage &AU) const override; -char &llvm::UnreachableMachineBlockElimID = UnreachableMachineBlockElim::ID; +public: + static char ID; // Pass identification, replacement for typeid + UnreachableMachineBlockElimLegacy() : MachineFunctionPass(ID) {} +}; +} // namespace -void UnreachableMachineBlockElim::getAnalysisUsage(AnalysisUsage &AU) const { +char UnreachableMachineBlockElimLegacy::ID = 0; + +INITIALIZE_PASS(UnreachableMachineBlockElimLegacy, + "unreachable-mbb-elimination", + "Remove unreachable machine basic blocks", false, false) + +char &llvm::UnreachableMachineBlockElimID = + UnreachableMachineBlockElimLegacy::ID; + +void UnreachableMachineBlockElimLegacy::getAnalysisUsage( + AnalysisUsage &AU) const { AU.addPreserved<MachineLoopInfoWrapperPass>(); AU.addPreserved<MachineDominatorTreeWrapperPass>(); MachineFunctionPass::getAnalysisUsage(AU); } -bool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) { - df_iterator_default_set<MachineBasicBlock*> Reachable; - bool ModifiedPHI = false; +PreservedAnalyses +UnreachableMachineBlockElimPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &AM) { + auto *MDT = AM.getCachedResult<MachineDominatorTreeAnalysis>(MF); + auto *MLI = AM.getCachedResult<MachineLoopAnalysis>(MF); + if (!UnreachableMachineBlockElim(MDT, MLI).run(MF)) + return PreservedAnalyses::all(); + + return getMachineFunctionPassPreservedAnalyses() + .preserve<MachineLoopAnalysis>() + .preserve<MachineDominatorTreeAnalysis>(); +} + +bool UnreachableMachineBlockElimLegacy::runOnMachineFunction( + MachineFunction &MF) { MachineDominatorTreeWrapperPass *MDTWrapper = getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>(); MachineDominatorTree *MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr; @@ -105,6 +131,13 @@ getAnalysisIfAvailable<MachineLoopInfoWrapperPass>(); MachineLoopInfo *MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr; + return UnreachableMachineBlockElim(MDT, MLI).run(MF); +} + +bool UnreachableMachineBlockElim::run(MachineFunction &F) { + df_iterator_default_set<MachineBasicBlock *> Reachable; + bool ModifiedPHI = false; + // Mark all reachable blocks. for (MachineBasicBlock *BB : depth_first_ext(&F, Reachable)) (void)BB/* Mark all reachable blocks */;
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index a5c624b..e7057d9 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -167,6 +167,7 @@ #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/CodeGen/TwoAddressInstructionPass.h" #include "llvm/CodeGen/TypePromotion.h" +#include "llvm/CodeGen/UnreachableBlockElim.h" #include "llvm/CodeGen/VirtRegMap.h" #include "llvm/CodeGen/WasmEHPrepare.h" #include "llvm/CodeGen/WinEHPrepare.h"
diff --git a/llvm/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir b/llvm/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir index 79f9d5d..697c423 100644 --- a/llvm/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir +++ b/llvm/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir
@@ -1,4 +1,5 @@ # RUN: llc -mtriple=hexagon -run-pass unreachable-mbb-elimination %s -o - | FileCheck %s +# RUN: llc -mtriple=hexagon -passes unreachable-mbb-elimination %s -o - | FileCheck %s --- name: fred
diff --git a/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir b/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir index e77192d..feb5f12 100644 --- a/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir +++ b/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir
@@ -1,4 +1,5 @@ # RUN: llc -emit-call-site-info -mtriple=x86_64-pc-linux -run-pass=unreachable-mbb-elimination -o - %s | FileCheck %s +# RUN: llc -emit-call-site-info -mtriple=x86_64-pc-linux -passes=unreachable-mbb-elimination -o - %s | FileCheck %s # Verify that the call site information for the call residing in the eliminated # block is removed. This test case would previously trigger an assertion when