diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/BranchCoalescing.cpp (renamed from llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp) | 89 | ||||
-rw-r--r-- | llvm/lib/CodeGen/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/CodeGen.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/TargetPassConfig.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/PPC.h | 1 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | 8 |
7 files changed, 41 insertions, 63 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp b/llvm/lib/CodeGen/BranchCoalescing.cpp index 467cb261b9f..2c41b597843 100644 --- a/llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp +++ b/llvm/lib/CodeGen/BranchCoalescing.cpp @@ -13,7 +13,6 @@ /// //===----------------------------------------------------------------------===// -#include "PPC.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineDominators.h" @@ -28,18 +27,18 @@ using namespace llvm; -#define DEBUG_TYPE "ppc-branch-coalescing" +#define DEBUG_TYPE "branch-coalescing" + +static cl::opt<cl::boolOrDefault> + EnableBranchCoalescing("enable-branch-coalesce", cl::Hidden, + cl::desc("enable coalescing of duplicate branches")); STATISTIC(NumBlocksCoalesced, "Number of blocks coalesced"); STATISTIC(NumPHINotMoved, "Number of PHI Nodes that cannot be merged"); STATISTIC(NumBlocksNotCoalesced, "Number of blocks not coalesced"); -namespace llvm { - void initializePPCBranchCoalescingPass(PassRegistry&); -} - //===----------------------------------------------------------------------===// -// PPCBranchCoalescing +// BranchCoalescing //===----------------------------------------------------------------------===// /// /// Improve scheduling by coalescing branches that depend on the same condition. @@ -47,17 +46,13 @@ namespace llvm { /// and attempts to merge the blocks together. Such opportunities arise from /// the expansion of select statements in the IR. /// -/// This pass does not handle implicit operands on branch statements. In order -/// to run on targets that use implicit operands, changes need to be made in the -/// canCoalesceBranch and canMerge methods. -/// -/// Example: the following LLVM IR +/// For example, consider the following LLVM IR: /// -/// %test = icmp eq i32 %x 0 -/// %tmp1 = select i1 %test, double %a, double 2.000000e-03 -/// %tmp2 = select i1 %test, double %b, double 5.000000e-03 +/// %test = icmp eq i32 %x 0 +/// %tmp1 = select i1 %test, double %a, double 2.000000e-03 +/// %tmp2 = select i1 %test, double %b, double 5.000000e-03 /// -/// expands to the following machine code: +/// This IR expands to the following machine code on PowerPC: /// /// BB#0: derived from LLVM BB %entry /// Live Ins: %F1 %F3 %X6 @@ -137,7 +132,7 @@ namespace llvm { namespace { -class PPCBranchCoalescing : public MachineFunctionPass { +class BranchCoalescing : public MachineFunctionPass { struct CoalescingCandidateInfo { MachineBasicBlock *BranchBlock; // Block containing the branch MachineBasicBlock *BranchTargetBlock; // Block branched to @@ -162,11 +157,15 @@ class PPCBranchCoalescing : public MachineFunctionPass { bool validateCandidates(CoalescingCandidateInfo &SourceRegion, CoalescingCandidateInfo &TargetRegion) const; + static bool isBranchCoalescingEnabled() { + return EnableBranchCoalescing == cl::BOU_TRUE; + } + public: static char ID; - PPCBranchCoalescing() : MachineFunctionPass(ID) { - initializePPCBranchCoalescingPass(*PassRegistry::getPassRegistry()); + BranchCoalescing() : MachineFunctionPass(ID) { + initializeBranchCoalescingPass(*PassRegistry::getPassRegistry()); } void getAnalysisUsage(AnalysisUsage &AU) const override { @@ -191,25 +190,21 @@ public: }; } // End anonymous namespace. -char PPCBranchCoalescing::ID = 0; -/// createPPCBranchCoalescingPass - returns an instance of the Branch Coalescing -/// Pass -FunctionPass *llvm::createPPCBranchCoalescingPass() { - return new PPCBranchCoalescing(); -} +char BranchCoalescing::ID = 0; +char &llvm::BranchCoalescingID = BranchCoalescing::ID; -INITIALIZE_PASS_BEGIN(PPCBranchCoalescing, DEBUG_TYPE, +INITIALIZE_PASS_BEGIN(BranchCoalescing, DEBUG_TYPE, "Branch Coalescing", false, false) INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree) -INITIALIZE_PASS_END(PPCBranchCoalescing, DEBUG_TYPE, "Branch Coalescing", +INITIALIZE_PASS_END(BranchCoalescing, DEBUG_TYPE, "Branch Coalescing", false, false) -PPCBranchCoalescing::CoalescingCandidateInfo::CoalescingCandidateInfo() +BranchCoalescing::CoalescingCandidateInfo::CoalescingCandidateInfo() : BranchBlock(nullptr), BranchTargetBlock(nullptr), FallThroughBlock(nullptr), MustMoveDown(false), MustMoveUp(false) {} -void PPCBranchCoalescing::CoalescingCandidateInfo::clear() { +void BranchCoalescing::CoalescingCandidateInfo::clear() { BranchBlock = nullptr; BranchTargetBlock = nullptr; FallThroughBlock = nullptr; @@ -218,7 +213,7 @@ void PPCBranchCoalescing::CoalescingCandidateInfo::clear() { MustMoveUp = false; } -void PPCBranchCoalescing::initialize(MachineFunction &MF) { +void BranchCoalescing::initialize(MachineFunction &MF) { MDT = &getAnalysis<MachineDominatorTree>(); MPDT = &getAnalysis<MachinePostDominatorTree>(); TII = MF.getSubtarget().getInstrInfo(); @@ -235,7 +230,7 @@ void PPCBranchCoalescing::initialize(MachineFunction &MF) { ///\param[in,out] Cand The coalescing candidate to analyze ///\return true if and only if the branch can be coalesced, false otherwise /// -bool PPCBranchCoalescing::canCoalesceBranch(CoalescingCandidateInfo &Cand) { +bool BranchCoalescing::canCoalesceBranch(CoalescingCandidateInfo &Cand) { DEBUG(dbgs() << "Determine if branch block " << Cand.BranchBlock->getNumber() << " can be coalesced:"); MachineBasicBlock *FalseMBB = nullptr; @@ -251,19 +246,6 @@ bool PPCBranchCoalescing::canCoalesceBranch(CoalescingCandidateInfo &Cand) { if (!I.isBranch()) continue; - // The analyzeBranch method does not include any implicit operands. - // This is not an issue on PPC but must be handled on other targets. - // For this pass to be made target-independent, the analyzeBranch API - // need to be updated to support implicit operands and there would - // need to be a way to verify that any implicit operands would not be - // clobbered by merging blocks. This would include identifying the - // implicit operands as well as the basic block they are defined in. - // This could be done by changing the analyzeBranch API to have it also - // record and return the implicit operands and the blocks where they are - // defined. Alternatively, the BranchCoalescing code would need to be - // extended to identify the implicit operands. The analysis in canMerge - // must then be extended to prove that none of the implicit operands are - // changed in the blocks that are combined during coalescing. if (I.getNumOperands() != I.getNumExplicitOperands()) { DEBUG(dbgs() << "Terminator contains implicit operands - skip : " << I << "\n"); @@ -327,7 +309,7 @@ bool PPCBranchCoalescing::canCoalesceBranch(CoalescingCandidateInfo &Cand) { /// \param[in] OpList2 operand list /// \return true if and only if the operands lists are identical /// -bool PPCBranchCoalescing::identicalOperands( +bool BranchCoalescing::identicalOperands( ArrayRef<MachineOperand> OpList1, ArrayRef<MachineOperand> OpList2) const { if (OpList1.size() != OpList2.size()) { @@ -379,7 +361,7 @@ bool PPCBranchCoalescing::identicalOperands( /// \param[in] SourceMBB block to move PHI instructions from /// \param[in] TargetMBB block to move PHI instructions to /// -void PPCBranchCoalescing::moveAndUpdatePHIs(MachineBasicBlock *SourceMBB, +void BranchCoalescing::moveAndUpdatePHIs(MachineBasicBlock *SourceMBB, MachineBasicBlock *TargetMBB) { MachineBasicBlock::iterator MI = SourceMBB->begin(); @@ -412,7 +394,7 @@ void PPCBranchCoalescing::moveAndUpdatePHIs(MachineBasicBlock *SourceMBB, /// \return true if it is safe to move MI to beginning of TargetMBB, /// false otherwise. /// -bool PPCBranchCoalescing::canMoveToBeginning(const MachineInstr &MI, +bool BranchCoalescing::canMoveToBeginning(const MachineInstr &MI, const MachineBasicBlock &TargetMBB ) const { @@ -443,7 +425,7 @@ bool PPCBranchCoalescing::canMoveToBeginning(const MachineInstr &MI, /// \return true if it is safe to move MI to end of TargetMBB, /// false otherwise. /// -bool PPCBranchCoalescing::canMoveToEnd(const MachineInstr &MI, +bool BranchCoalescing::canMoveToEnd(const MachineInstr &MI, const MachineBasicBlock &TargetMBB ) const { @@ -475,7 +457,7 @@ bool PPCBranchCoalescing::canMoveToEnd(const MachineInstr &MI, /// \return true if all instructions in SourceRegion.BranchBlock can be merged /// into a block in TargetRegion; false otherwise. /// -bool PPCBranchCoalescing::validateCandidates( +bool BranchCoalescing::validateCandidates( CoalescingCandidateInfo &SourceRegion, CoalescingCandidateInfo &TargetRegion) const { @@ -518,7 +500,7 @@ bool PPCBranchCoalescing::validateCandidates( /// \return true if all instructions in SourceRegion.BranchBlock can be merged /// into a block in TargetRegion, false otherwise. /// -bool PPCBranchCoalescing::canMerge(CoalescingCandidateInfo &SourceRegion, +bool BranchCoalescing::canMerge(CoalescingCandidateInfo &SourceRegion, CoalescingCandidateInfo &TargetRegion) const { if (!validateCandidates(SourceRegion, TargetRegion)) return false; @@ -623,7 +605,7 @@ bool PPCBranchCoalescing::canMerge(CoalescingCandidateInfo &SourceRegion, /// \param[in] SourceRegion The candidate to move blocks from /// \param[in] TargetRegion The candidate to move blocks to /// -bool PPCBranchCoalescing::mergeCandidates(CoalescingCandidateInfo &SourceRegion, +bool BranchCoalescing::mergeCandidates(CoalescingCandidateInfo &SourceRegion, CoalescingCandidateInfo &TargetRegion) { if (SourceRegion.MustMoveUp && SourceRegion.MustMoveDown) { @@ -703,9 +685,10 @@ bool PPCBranchCoalescing::mergeCandidates(CoalescingCandidateInfo &SourceRegion, return true; } -bool PPCBranchCoalescing::runOnMachineFunction(MachineFunction &MF) { +bool BranchCoalescing::runOnMachineFunction(MachineFunction &MF) { - if (skipFunction(*MF.getFunction()) || MF.empty()) + if (skipFunction(*MF.getFunction()) || MF.empty() || + !isBranchCoalescingEnabled()) return false; bool didSomething = false; diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 7ec7fda4e44..7f3c6da9126 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -4,6 +4,7 @@ add_llvm_library(LLVMCodeGen Analysis.cpp AtomicExpandPass.cpp BasicTargetTransformInfo.cpp + BranchCoalescing.cpp BranchFolding.cpp BranchRelaxation.cpp BuiltinGCs.cpp diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 5acd6d52ea8..b7fd45a3f6a 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -21,6 +21,7 @@ using namespace llvm; /// initializeCodeGen - Initialize all passes linked into the CodeGen library. void llvm::initializeCodeGen(PassRegistry &Registry) { initializeAtomicExpandPass(Registry); + initializeBranchCoalescingPass(Registry); initializeBranchFolderPassPass(Registry); initializeBranchRelaxationPass(Registry); initializeCodeGenPreparePass(Registry); diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp index 34d96a81130..481baea2dff 100644 --- a/llvm/lib/CodeGen/TargetPassConfig.cpp +++ b/llvm/lib/CodeGen/TargetPassConfig.cpp @@ -919,6 +919,9 @@ void TargetPassConfig::addMachineSSAOptimization() { addPass(&MachineLICMID, false); addPass(&MachineCSEID, false); + // Coalesce basic blocks with the same branch condition + addPass(&BranchCoalescingID); + addPass(&MachineSinkingID); addPass(&PeepholeOptimizerID); diff --git a/llvm/lib/Target/PowerPC/CMakeLists.txt b/llvm/lib/Target/PowerPC/CMakeLists.txt index 4aa6dfab525..7ca4c199900 100644 --- a/llvm/lib/Target/PowerPC/CMakeLists.txt +++ b/llvm/lib/Target/PowerPC/CMakeLists.txt @@ -16,7 +16,6 @@ add_llvm_target(PowerPCCodeGen PPCBoolRetToInt.cpp PPCAsmPrinter.cpp PPCBranchSelector.cpp - PPCBranchCoalescing.cpp PPCCCState.cpp PPCCTRLoops.cpp PPCHazardRecognizers.cpp diff --git a/llvm/lib/Target/PowerPC/PPC.h b/llvm/lib/Target/PowerPC/PPC.h index 40790011f9b..ad92ac8ce12 100644 --- a/llvm/lib/Target/PowerPC/PPC.h +++ b/llvm/lib/Target/PowerPC/PPC.h @@ -41,7 +41,6 @@ namespace llvm { FunctionPass *createPPCVSXSwapRemovalPass(); FunctionPass *createPPCMIPeepholePass(); FunctionPass *createPPCBranchSelectionPass(); - FunctionPass *createPPCBranchCoalescingPass(); FunctionPass *createPPCQPXLoadSplatPass(); FunctionPass *createPPCISelDag(PPCTargetMachine &TM, CodeGenOpt::Level OL); FunctionPass *createPPCTLSDynamicCallPass(); diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp index 18426bdb6bf..bc5d32b37fd 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -40,10 +40,6 @@ using namespace llvm; - -static cl::opt<bool> - DisableBranchCoalescing("disable-ppc-branch-coalesce", cl::Hidden, - cl::desc("disable coalescing of duplicate branches for PPC")); static cl:: opt<bool> DisableCTRLoops("disable-ppc-ctrloops", cl::Hidden, cl::desc("Disable CTR loops for PPC")); @@ -382,10 +378,6 @@ bool PPCPassConfig::addInstSelector() { } void PPCPassConfig::addMachineSSAOptimization() { - // PPCBranchCoalescingPass need to be done before machine sinking - // since it merges empty blocks. - if (!DisableBranchCoalescing && getOptLevel() != CodeGenOpt::None) - addPass(createPPCBranchCoalescingPass()); TargetPassConfig::addMachineSSAOptimization(); // For little endian, remove where possible the vector swap instructions // introduced at code generation to normalize vector element order. |