diff --git a/llvm/include/llvm/CodeGen/BranchFoldingPass.h b/llvm/include/llvm/CodeGen/BranchFoldingPass.h index 6ebef47252d25..b4380b5a4a6c8 100644 --- a/llvm/include/llvm/CodeGen/BranchFoldingPass.h +++ b/llvm/include/llvm/CodeGen/BranchFoldingPass.h @@ -24,6 +24,9 @@ class BranchFolderPass : public PassInfoMixin { return MachineFunctionProperties().set( MachineFunctionProperties::Property::NoPHIs); } + + void printPipeline(raw_ostream &OS, + function_ref MapClassName2PassName); }; } // namespace llvm diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h index d214ab9306c2f..426e430b947f9 100644 --- a/llvm/include/llvm/CodeGen/Passes.h +++ b/llvm/include/llvm/CodeGen/Passes.h @@ -257,6 +257,8 @@ namespace llvm { /// branches. extern char &BranchFolderPassID; + MachineFunctionPass *createBranchFolderPass(bool EnableTailMerge); + /// BranchRelaxation - This pass replaces branches that need to jump further /// than is supported by a branch instruction. extern char &BranchRelaxationPassID; diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index 6f5afbd2a996a..ad4ab3142d542 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -39,7 +39,6 @@ #include "llvm/CodeGen/MachineSizeOpts.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetOpcodes.h" -#include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -90,10 +89,13 @@ namespace { /// BranchFolderPass - Wrap branch folder in a machine function pass. class BranchFolderLegacy : public MachineFunctionPass { + bool EnableTailMerge; + public: static char ID; - explicit BranchFolderLegacy() : MachineFunctionPass(ID) {} + explicit BranchFolderLegacy(bool EnableTailMerge = true) + : MachineFunctionPass(ID), EnableTailMerge(EnableTailMerge) {} bool runOnMachineFunction(MachineFunction &MF) override; @@ -101,7 +103,6 @@ class BranchFolderLegacy : public MachineFunctionPass { AU.addRequired(); AU.addRequired(); AU.addRequired(); - AU.addRequired(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -123,9 +124,6 @@ INITIALIZE_PASS(BranchFolderLegacy, DEBUG_TYPE, "Control Flow Optimizer", false, PreservedAnalyses BranchFolderPass::run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) { MFPropsModifier _(*this, MF); - bool EnableTailMerge = - !MF.getTarget().requiresStructuredCFG() && this->EnableTailMerge; - auto &MBPI = MFAM.getResult(MF); auto *PSI = MFAM.getResult(MF) .getCachedResult( @@ -144,15 +142,17 @@ PreservedAnalyses BranchFolderPass::run(MachineFunction &MF, return getMachineFunctionPassPreservedAnalyses(); } +void BranchFolderPass::printPipeline( + raw_ostream &OS, function_ref MapClassName2PassName) { + OS << MapClassName2PassName(name()); + if (EnableTailMerge) + OS << ""; +} + bool BranchFolderLegacy::runOnMachineFunction(MachineFunction &MF) { if (skipFunction(MF.getFunction())) return false; - TargetPassConfig *PassConfig = &getAnalysis(); - // TailMerge can create jump into if branches that make CFG irreducible for - // HW that requires structurized CFG. - bool EnableTailMerge = !MF.getTarget().requiresStructuredCFG() && - PassConfig->getEnableTailMerge(); MBFIWrapper MBBFreqInfo( getAnalysis().getMBFI()); BranchFolder Folder( @@ -2080,3 +2080,7 @@ bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) { ++NumHoist; return true; } + +MachineFunctionPass *llvm::createBranchFolderPass(bool EnableTailMerge = true) { + return new BranchFolderLegacy(EnableTailMerge); +} diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp index fa1bb84ec5319..99caf31736baf 100644 --- a/llvm/lib/CodeGen/TargetPassConfig.cpp +++ b/llvm/lib/CodeGen/TargetPassConfig.cpp @@ -1514,7 +1514,9 @@ void TargetPassConfig::addMachineLateOptimization() { addPass(&MachineLateInstrsCleanupID); // Branch folding must be run after regalloc and prolog/epilog insertion. - addPass(&BranchFolderPassID); + if (!isPassSubstitutedOrOverridden(&BranchFolderPassID)) + addPass(createBranchFolderPass(!TM->requiresStructuredCFG() && + getEnableTailMerge())); // Tail duplication. // Note that duplicating tail just increases code size and degrades