| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 1 | //===-- BranchFolding.cpp - Fold machine code branch instructions ---------===// | 
| Misha Brukman | 835702a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 2 | // | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
| Chris Lattner | f3ebc3f | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
| Misha Brukman | 835702a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 7 | // | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This pass forwards branches to unconditional branches to make them branch | 
|  | 11 | // directly to the target block.  This pass often results in dead MBB's, which | 
|  | 12 | // it then removes. | 
|  | 13 | // | 
|  | 14 | // Note that this pass must be run after register allocation, it cannot handle | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 15 | // SSA form. It also must handle virtual registers for targets that emit virtual | 
|  | 16 | // ISA (e.g. NVPTX). | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 17 | // | 
|  | 18 | //===----------------------------------------------------------------------===// | 
|  | 19 |  | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 20 | #include "BranchFolding.h" | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 21 | #include "llvm/ADT/STLExtras.h" | 
|  | 22 | #include "llvm/ADT/SmallSet.h" | 
|  | 23 | #include "llvm/ADT/Statistic.h" | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 24 | #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" | 
|  | 25 | #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 26 | #include "llvm/CodeGen/MachineFunctionPass.h" | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 27 | #include "llvm/CodeGen/MachineJumpTableInfo.h" | 
| Chad Rosier | 3b67c8d | 2015-03-10 16:22:52 +0000 | [diff] [blame] | 28 | #include "llvm/CodeGen/MachineMemOperand.h" | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 29 | #include "llvm/CodeGen/MachineModuleInfo.h" | 
| Jakob Stoklund Olesen | d1664a1 | 2012-03-27 17:06:09 +0000 | [diff] [blame] | 30 | #include "llvm/CodeGen/MachineRegisterInfo.h" | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 31 | #include "llvm/CodeGen/Passes.h" | 
| Dale Johannesen | d05a1a2 | 2007-03-20 21:35:06 +0000 | [diff] [blame] | 32 | #include "llvm/CodeGen/RegisterScavenging.h" | 
| Chandler Carruth | 9fb823b | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 33 | #include "llvm/IR/Function.h" | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 34 | #include "llvm/Support/CommandLine.h" | 
| Chris Lattner | 56ec81f | 2006-11-18 21:56:39 +0000 | [diff] [blame] | 35 | #include "llvm/Support/Debug.h" | 
| Torok Edwin | 56d0659 | 2009-07-11 20:10:48 +0000 | [diff] [blame] | 36 | #include "llvm/Support/ErrorHandling.h" | 
| Bill Wendling | c3f05e8 | 2009-08-22 20:03:00 +0000 | [diff] [blame] | 37 | #include "llvm/Support/raw_ostream.h" | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 38 | #include "llvm/Target/TargetInstrInfo.h" | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 39 | #include "llvm/Target/TargetRegisterInfo.h" | 
| Eric Christopher | d913448 | 2014-08-04 21:25:23 +0000 | [diff] [blame] | 40 | #include "llvm/Target/TargetSubtargetInfo.h" | 
| Jeff Cohen | 7d6f3db | 2006-11-05 19:31:28 +0000 | [diff] [blame] | 41 | #include <algorithm> | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 42 | using namespace llvm; | 
|  | 43 |  | 
| Chandler Carruth | 1b9dde0 | 2014-04-22 02:02:50 +0000 | [diff] [blame] | 44 | #define DEBUG_TYPE "branchfolding" | 
|  | 45 |  | 
| Chris Lattner | aee775a | 2006-12-19 22:41:21 +0000 | [diff] [blame] | 46 | STATISTIC(NumDeadBlocks, "Number of dead blocks removed"); | 
|  | 47 | STATISTIC(NumBranchOpts, "Number of branches optimized"); | 
|  | 48 | STATISTIC(NumTailMerge , "Number of block tails merged"); | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 49 | STATISTIC(NumHoist     , "Number of times common instructions are hoisted"); | 
| Bob Wilson | 8984e6e | 2009-11-18 19:29:37 +0000 | [diff] [blame] | 50 |  | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 51 | static cl::opt<cl::boolOrDefault> FlagEnableTailMerge("enable-tail-merge", | 
| Dale Johannesen | 82810c8 | 2007-05-22 17:14:46 +0000 | [diff] [blame] | 52 | cl::init(cl::BOU_UNSET), cl::Hidden); | 
| Bob Wilson | 8984e6e | 2009-11-18 19:29:37 +0000 | [diff] [blame] | 53 |  | 
| Dan Gohman | d78c400 | 2008-05-13 00:00:25 +0000 | [diff] [blame] | 54 | // Throttle for huge numbers of predecessors (compile speed problems) | 
|  | 55 | static cl::opt<unsigned> | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 56 | TailMergeThreshold("tail-merge-threshold", | 
| Dan Gohman | d78c400 | 2008-05-13 00:00:25 +0000 | [diff] [blame] | 57 | cl::desc("Max number of predecessors to consider tail merging"), | 
| Dale Johannesen | 1d7e42c | 2008-10-27 02:10:21 +0000 | [diff] [blame] | 58 | cl::init(150), cl::Hidden); | 
| Dale Johannesen | 86798e5 | 2007-06-08 01:08:52 +0000 | [diff] [blame] | 59 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 60 | // Heuristic for tail merging (and, inversely, tail duplication). | 
|  | 61 | // TODO: This should be replaced with a target query. | 
|  | 62 | static cl::opt<unsigned> | 
| Bob Wilson | 699f5b9 | 2009-11-16 17:56:13 +0000 | [diff] [blame] | 63 | TailMergeSize("tail-merge-size", | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 64 | cl::desc("Min number of instructions to consider tail merging"), | 
|  | 65 | cl::init(3), cl::Hidden); | 
| Devang Patel | 09f162c | 2007-05-01 21:15:47 +0000 | [diff] [blame] | 66 |  | 
| Dan Gohman | a9b40a6e | 2009-11-12 01:59:26 +0000 | [diff] [blame] | 67 | namespace { | 
|  | 68 | /// BranchFolderPass - Wrap branch folder in a machine function pass. | 
| Andrew Trick | 58648e4 | 2012-02-08 21:22:48 +0000 | [diff] [blame] | 69 | class BranchFolderPass : public MachineFunctionPass { | 
| Dan Gohman | a9b40a6e | 2009-11-12 01:59:26 +0000 | [diff] [blame] | 70 | public: | 
|  | 71 | static char ID; | 
| Andrew Trick | 58648e4 | 2012-02-08 21:22:48 +0000 | [diff] [blame] | 72 | explicit BranchFolderPass(): MachineFunctionPass(ID) {} | 
| Dan Gohman | a9b40a6e | 2009-11-12 01:59:26 +0000 | [diff] [blame] | 73 |  | 
| Craig Topper | 4584cd5 | 2014-03-07 09:26:03 +0000 | [diff] [blame] | 74 | bool runOnMachineFunction(MachineFunction &MF) override; | 
| Andrew Trick | 58648e4 | 2012-02-08 21:22:48 +0000 | [diff] [blame] | 75 |  | 
| Craig Topper | 4584cd5 | 2014-03-07 09:26:03 +0000 | [diff] [blame] | 76 | void getAnalysisUsage(AnalysisUsage &AU) const override { | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 77 | AU.addRequired<MachineBlockFrequencyInfo>(); | 
|  | 78 | AU.addRequired<MachineBranchProbabilityInfo>(); | 
| Andrew Trick | 58648e4 | 2012-02-08 21:22:48 +0000 | [diff] [blame] | 79 | AU.addRequired<TargetPassConfig>(); | 
|  | 80 | MachineFunctionPass::getAnalysisUsage(AU); | 
|  | 81 | } | 
| Dan Gohman | a9b40a6e | 2009-11-12 01:59:26 +0000 | [diff] [blame] | 82 | }; | 
| Alexander Kornienko | f00654e | 2015-06-23 09:49:53 +0000 | [diff] [blame] | 83 | } | 
| Dan Gohman | a9b40a6e | 2009-11-12 01:59:26 +0000 | [diff] [blame] | 84 |  | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 85 | char BranchFolderPass::ID = 0; | 
| Andrew Trick | 58648e4 | 2012-02-08 21:22:48 +0000 | [diff] [blame] | 86 | char &llvm::BranchFolderPassID = BranchFolderPass::ID; | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 87 |  | 
| Andrew Trick | 58648e4 | 2012-02-08 21:22:48 +0000 | [diff] [blame] | 88 | INITIALIZE_PASS(BranchFolderPass, "branch-folder", | 
|  | 89 | "Control Flow Optimizer", false, false) | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 90 |  | 
|  | 91 | bool BranchFolderPass::runOnMachineFunction(MachineFunction &MF) { | 
| Paul Robinson | 7c99ec5 | 2014-03-31 17:43:35 +0000 | [diff] [blame] | 92 | if (skipOptnoneFunction(*MF.getFunction())) | 
|  | 93 | return false; | 
|  | 94 |  | 
| Andrew Trick | 58648e4 | 2012-02-08 21:22:48 +0000 | [diff] [blame] | 95 | TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>(); | 
| Vincent Lejeune | 92b0a64 | 2013-12-07 01:49:19 +0000 | [diff] [blame] | 96 | // TailMerge can create jump into if branches that make CFG irreducible for | 
|  | 97 | // HW that requires structurized CFG. | 
|  | 98 | bool EnableTailMerge = !MF.getTarget().requiresStructuredCFG() && | 
|  | 99 | PassConfig->getEnableTailMerge(); | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 100 | BranchFolder Folder(EnableTailMerge, /*CommonHoist=*/true, | 
|  | 101 | getAnalysis<MachineBlockFrequencyInfo>(), | 
|  | 102 | getAnalysis<MachineBranchProbabilityInfo>()); | 
| Eric Christopher | fc6de42 | 2014-08-05 02:39:49 +0000 | [diff] [blame] | 103 | return Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(), | 
|  | 104 | MF.getSubtarget().getRegisterInfo(), | 
|  | 105 | getAnalysisIfAvailable<MachineModuleInfo>()); | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 106 | } | 
|  | 107 |  | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 108 | BranchFolder::BranchFolder(bool defaultEnableTailMerge, bool CommonHoist, | 
|  | 109 | const MachineBlockFrequencyInfo &FreqInfo, | 
|  | 110 | const MachineBranchProbabilityInfo &ProbInfo) | 
|  | 111 | : EnableHoistCommonCode(CommonHoist), MBBFreqInfo(FreqInfo), | 
|  | 112 | MBPI(ProbInfo) { | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 113 | switch (FlagEnableTailMerge) { | 
|  | 114 | case cl::BOU_UNSET: EnableTailMerge = defaultEnableTailMerge; break; | 
|  | 115 | case cl::BOU_TRUE: EnableTailMerge = true; break; | 
|  | 116 | case cl::BOU_FALSE: EnableTailMerge = false; break; | 
|  | 117 | } | 
| Evan Cheng | 1f6e5eb | 2009-09-03 23:54:22 +0000 | [diff] [blame] | 118 | } | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 119 |  | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 120 | /// RemoveDeadBlock - Remove the specified dead machine basic block from the | 
|  | 121 | /// function, updating the CFG. | 
| Chris Lattner | 73da320 | 2006-10-17 23:17:27 +0000 | [diff] [blame] | 122 | void BranchFolder::RemoveDeadBlock(MachineBasicBlock *MBB) { | 
| Jim Laskey | 9df1a1d | 2007-02-22 16:39:03 +0000 | [diff] [blame] | 123 | assert(MBB->pred_empty() && "MBB must be dead!"); | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 124 | DEBUG(dbgs() << "\nRemoving MBB: " << *MBB); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 125 |  | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 126 | MachineFunction *MF = MBB->getParent(); | 
|  | 127 | // drop all successors. | 
|  | 128 | while (!MBB->succ_empty()) | 
|  | 129 | MBB->removeSuccessor(MBB->succ_end()-1); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 130 |  | 
| Rafael Espindola | 3aeaf9e | 2011-06-14 15:31:54 +0000 | [diff] [blame] | 131 | // Avoid matching if this pointer gets reused. | 
|  | 132 | TriedMerging.erase(MBB); | 
|  | 133 |  | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 134 | // Remove the block. | 
| Dan Gohman | 3b46030 | 2008-07-07 23:14:23 +0000 | [diff] [blame] | 135 | MF->erase(MBB); | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 136 | } | 
|  | 137 |  | 
| Evan Cheng | 9d33984 | 2008-04-10 02:32:10 +0000 | [diff] [blame] | 138 | /// OptimizeImpDefsBlock - If a basic block is just a bunch of implicit_def | 
|  | 139 | /// followed by terminators, and if the implicitly defined registers are not | 
|  | 140 | /// used by the terminators, remove those implicit_def's. e.g. | 
|  | 141 | /// BB1: | 
|  | 142 | ///   r0 = implicit_def | 
|  | 143 | ///   r1 = implicit_def | 
|  | 144 | ///   br | 
|  | 145 | /// This block can be optimized away later if the implicit instructions are | 
|  | 146 | /// removed. | 
|  | 147 | bool BranchFolder::OptimizeImpDefsBlock(MachineBasicBlock *MBB) { | 
|  | 148 | SmallSet<unsigned, 4> ImpDefRegs; | 
|  | 149 | MachineBasicBlock::iterator I = MBB->begin(); | 
|  | 150 | while (I != MBB->end()) { | 
| Chris Lattner | b06015a | 2010-02-09 19:54:29 +0000 | [diff] [blame] | 151 | if (!I->isImplicitDef()) | 
| Evan Cheng | 9d33984 | 2008-04-10 02:32:10 +0000 | [diff] [blame] | 152 | break; | 
|  | 153 | unsigned Reg = I->getOperand(0).getReg(); | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 154 | if (TargetRegisterInfo::isPhysicalRegister(Reg)) { | 
|  | 155 | for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true); | 
|  | 156 | SubRegs.isValid(); ++SubRegs) | 
|  | 157 | ImpDefRegs.insert(*SubRegs); | 
|  | 158 | } else { | 
|  | 159 | ImpDefRegs.insert(Reg); | 
|  | 160 | } | 
| Evan Cheng | 9d33984 | 2008-04-10 02:32:10 +0000 | [diff] [blame] | 161 | ++I; | 
|  | 162 | } | 
|  | 163 | if (ImpDefRegs.empty()) | 
|  | 164 | return false; | 
|  | 165 |  | 
|  | 166 | MachineBasicBlock::iterator FirstTerm = I; | 
|  | 167 | while (I != MBB->end()) { | 
|  | 168 | if (!TII->isUnpredicatedTerminator(I)) | 
|  | 169 | return false; | 
|  | 170 | // See if it uses any of the implicitly defined registers. | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 171 | for (const MachineOperand &MO : I->operands()) { | 
| Dan Gohman | 0d1e9a8 | 2008-10-03 15:45:36 +0000 | [diff] [blame] | 172 | if (!MO.isReg() || !MO.isUse()) | 
| Evan Cheng | 9d33984 | 2008-04-10 02:32:10 +0000 | [diff] [blame] | 173 | continue; | 
|  | 174 | unsigned Reg = MO.getReg(); | 
|  | 175 | if (ImpDefRegs.count(Reg)) | 
|  | 176 | return false; | 
|  | 177 | } | 
|  | 178 | ++I; | 
|  | 179 | } | 
|  | 180 |  | 
|  | 181 | I = MBB->begin(); | 
|  | 182 | while (I != FirstTerm) { | 
|  | 183 | MachineInstr *ImpDefMI = &*I; | 
|  | 184 | ++I; | 
|  | 185 | MBB->erase(ImpDefMI); | 
|  | 186 | } | 
|  | 187 |  | 
|  | 188 | return true; | 
|  | 189 | } | 
|  | 190 |  | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 191 | /// OptimizeFunction - Perhaps branch folding, tail merging and other | 
|  | 192 | /// CFG optimizations on the given function. | 
|  | 193 | bool BranchFolder::OptimizeFunction(MachineFunction &MF, | 
|  | 194 | const TargetInstrInfo *tii, | 
|  | 195 | const TargetRegisterInfo *tri, | 
|  | 196 | MachineModuleInfo *mmi) { | 
|  | 197 | if (!tii) return false; | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 198 |  | 
| Rafael Espindola | 3aeaf9e | 2011-06-14 15:31:54 +0000 | [diff] [blame] | 199 | TriedMerging.clear(); | 
|  | 200 |  | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 201 | TII = tii; | 
|  | 202 | TRI = tri; | 
|  | 203 | MMI = mmi; | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 204 | RS = nullptr; | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 205 |  | 
| Jakob Stoklund Olesen | d1664a1 | 2012-03-27 17:06:09 +0000 | [diff] [blame] | 206 | // Use a RegScavenger to help update liveness when required. | 
|  | 207 | MachineRegisterInfo &MRI = MF.getRegInfo(); | 
| Preston Gurd | 9a09147 | 2012-04-23 21:39:35 +0000 | [diff] [blame] | 208 | if (MRI.tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF)) | 
| Jakob Stoklund Olesen | d1664a1 | 2012-03-27 17:06:09 +0000 | [diff] [blame] | 209 | RS = new RegScavenger(); | 
|  | 210 | else | 
|  | 211 | MRI.invalidateLiveness(); | 
| Evan Cheng | 9d33984 | 2008-04-10 02:32:10 +0000 | [diff] [blame] | 212 |  | 
| Dale Johannesen | 420a85d | 2007-05-15 21:19:17 +0000 | [diff] [blame] | 213 | // Fix CFG.  The later algorithms expect it to be right. | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 214 | bool MadeChange = false; | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 215 | for (MachineBasicBlock &MBB : MF) { | 
|  | 216 | MachineBasicBlock *TBB = nullptr, *FBB = nullptr; | 
| Owen Anderson | 4f6bf04 | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 217 | SmallVector<MachineOperand, 4> Cond; | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 218 | if (!TII->AnalyzeBranch(MBB, TBB, FBB, Cond, true)) | 
|  | 219 | MadeChange |= MBB.CorrectExtraCFGEdges(TBB, FBB, !Cond.empty()); | 
|  | 220 | MadeChange |= OptimizeImpDefsBlock(&MBB); | 
| Dale Johannesen | 420a85d | 2007-05-15 21:19:17 +0000 | [diff] [blame] | 221 | } | 
|  | 222 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 223 | bool MadeChangeThisIteration = true; | 
|  | 224 | while (MadeChangeThisIteration) { | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 225 | MadeChangeThisIteration    = TailMergeBlocks(MF); | 
|  | 226 | MadeChangeThisIteration   |= OptimizeBranches(MF); | 
|  | 227 | if (EnableHoistCommonCode) | 
|  | 228 | MadeChangeThisIteration |= HoistCommonCode(MF); | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 229 | MadeChange |= MadeChangeThisIteration; | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 230 | } | 
|  | 231 |  | 
| Bob Wilson | bc5af98 | 2010-03-19 19:05:41 +0000 | [diff] [blame] | 232 | // See if any jump tables have become dead as the code generator | 
| Chris Lattner | c07657f | 2006-10-28 18:34:47 +0000 | [diff] [blame] | 233 | // did its thing. | 
|  | 234 | MachineJumpTableInfo *JTI = MF.getJumpTableInfo(); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 235 | if (!JTI) { | 
| Chris Lattner | b6db2c6 | 2010-01-25 23:26:13 +0000 | [diff] [blame] | 236 | delete RS; | 
|  | 237 | return MadeChange; | 
|  | 238 | } | 
| Andrew Trick | 9e76199 | 2012-02-08 21:22:43 +0000 | [diff] [blame] | 239 |  | 
| Bob Wilson | bc5af98 | 2010-03-19 19:05:41 +0000 | [diff] [blame] | 240 | // Walk the function to find jump tables that are live. | 
|  | 241 | BitVector JTIsLive(JTI->getJumpTables().size()); | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 242 | for (const MachineBasicBlock &BB : MF) { | 
|  | 243 | for (const MachineInstr &I : BB) | 
|  | 244 | for (const MachineOperand &Op : I.operands()) { | 
| Chris Lattner | b6db2c6 | 2010-01-25 23:26:13 +0000 | [diff] [blame] | 245 | if (!Op.isJTI()) continue; | 
| Chris Lattner | c07657f | 2006-10-28 18:34:47 +0000 | [diff] [blame] | 246 |  | 
| Chris Lattner | b6db2c6 | 2010-01-25 23:26:13 +0000 | [diff] [blame] | 247 | // Remember that this JT is live. | 
| Bob Wilson | bc5af98 | 2010-03-19 19:05:41 +0000 | [diff] [blame] | 248 | JTIsLive.set(Op.getIndex()); | 
| Chris Lattner | c07657f | 2006-10-28 18:34:47 +0000 | [diff] [blame] | 249 | } | 
|  | 250 | } | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 251 |  | 
| Bob Wilson | bc5af98 | 2010-03-19 19:05:41 +0000 | [diff] [blame] | 252 | // Finally, remove dead jump tables.  This happens when the | 
|  | 253 | // indirect jump was unreachable (and thus deleted). | 
| Chris Lattner | b6db2c6 | 2010-01-25 23:26:13 +0000 | [diff] [blame] | 254 | for (unsigned i = 0, e = JTIsLive.size(); i != e; ++i) | 
|  | 255 | if (!JTIsLive.test(i)) { | 
|  | 256 | JTI->RemoveJumpTable(i); | 
|  | 257 | MadeChange = true; | 
|  | 258 | } | 
|  | 259 |  | 
| Dale Johannesen | d05a1a2 | 2007-03-20 21:35:06 +0000 | [diff] [blame] | 260 | delete RS; | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 261 | return MadeChange; | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 262 | } | 
|  | 263 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 264 | //===----------------------------------------------------------------------===// | 
|  | 265 | //  Tail Merging of Blocks | 
|  | 266 | //===----------------------------------------------------------------------===// | 
|  | 267 |  | 
| NAKAMURA Takumi | 3746abb | 2015-06-20 06:21:48 +0000 | [diff] [blame] | 268 | /// HashMachineInstr - Compute a hash value for MI and its operands. | 
|  | 269 | static unsigned HashMachineInstr(const MachineInstr *MI) { | 
|  | 270 | unsigned Hash = MI->getOpcode(); | 
|  | 271 | for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { | 
|  | 272 | const MachineOperand &Op = MI->getOperand(i); | 
|  | 273 |  | 
| Benjamin Kramer | 8c57cfd | 2015-06-23 14:47:36 +0000 | [diff] [blame] | 274 | // Merge in bits from the operand if easy. We can't use MachineOperand's | 
|  | 275 | // hash_code here because it's not deterministic and we sort by hash value | 
|  | 276 | // later. | 
| NAKAMURA Takumi | 3746abb | 2015-06-20 06:21:48 +0000 | [diff] [blame] | 277 | unsigned OperandHash = 0; | 
|  | 278 | switch (Op.getType()) { | 
| NAKAMURA Takumi | 34d3376 | 2015-06-20 06:22:04 +0000 | [diff] [blame] | 279 | case MachineOperand::MO_Register: | 
|  | 280 | OperandHash = Op.getReg(); | 
|  | 281 | break; | 
|  | 282 | case MachineOperand::MO_Immediate: | 
|  | 283 | OperandHash = Op.getImm(); | 
|  | 284 | break; | 
| NAKAMURA Takumi | 3746abb | 2015-06-20 06:21:48 +0000 | [diff] [blame] | 285 | case MachineOperand::MO_MachineBasicBlock: | 
|  | 286 | OperandHash = Op.getMBB()->getNumber(); | 
|  | 287 | break; | 
|  | 288 | case MachineOperand::MO_FrameIndex: | 
|  | 289 | case MachineOperand::MO_ConstantPoolIndex: | 
|  | 290 | case MachineOperand::MO_JumpTableIndex: | 
|  | 291 | OperandHash = Op.getIndex(); | 
|  | 292 | break; | 
|  | 293 | case MachineOperand::MO_GlobalAddress: | 
|  | 294 | case MachineOperand::MO_ExternalSymbol: | 
|  | 295 | // Global address / external symbol are too hard, don't bother, but do | 
|  | 296 | // pull in the offset. | 
|  | 297 | OperandHash = Op.getOffset(); | 
|  | 298 | break; | 
| NAKAMURA Takumi | 34d3376 | 2015-06-20 06:22:04 +0000 | [diff] [blame] | 299 | default: | 
|  | 300 | break; | 
| NAKAMURA Takumi | 3746abb | 2015-06-20 06:21:48 +0000 | [diff] [blame] | 301 | } | 
|  | 302 |  | 
| NAKAMURA Takumi | 34d3376 | 2015-06-20 06:22:04 +0000 | [diff] [blame] | 303 | Hash += ((OperandHash << 3) | Op.getType()) << (i & 31); | 
| NAKAMURA Takumi | 3746abb | 2015-06-20 06:21:48 +0000 | [diff] [blame] | 304 | } | 
|  | 305 | return Hash; | 
|  | 306 | } | 
|  | 307 |  | 
| Dan Gohman | 2ad68de | 2010-05-03 14:35:47 +0000 | [diff] [blame] | 308 | /// HashEndOfMBB - Hash the last instruction in the MBB. | 
|  | 309 | static unsigned HashEndOfMBB(const MachineBasicBlock *MBB) { | 
| Benjamin Kramer | 6b56896 | 2015-06-23 14:47:29 +0000 | [diff] [blame] | 310 | MachineBasicBlock::const_iterator I = MBB->getLastNonDebugInstr(); | 
|  | 311 | if (I == MBB->end()) | 
|  | 312 | return 0; | 
| NAKAMURA Takumi | 3746abb | 2015-06-20 06:21:48 +0000 | [diff] [blame] | 313 |  | 
|  | 314 | return HashMachineInstr(I); | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 315 | } | 
|  | 316 |  | 
|  | 317 | /// ComputeCommonTailLength - Given two machine basic blocks, compute the number | 
|  | 318 | /// of instructions they actually have in common together at their end.  Return | 
|  | 319 | /// iterators for the first shared instruction in each block. | 
|  | 320 | static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1, | 
|  | 321 | MachineBasicBlock *MBB2, | 
|  | 322 | MachineBasicBlock::iterator &I1, | 
|  | 323 | MachineBasicBlock::iterator &I2) { | 
|  | 324 | I1 = MBB1->end(); | 
|  | 325 | I2 = MBB2->end(); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 326 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 327 | unsigned TailLen = 0; | 
|  | 328 | while (I1 != MBB1->begin() && I2 != MBB2->begin()) { | 
|  | 329 | --I1; --I2; | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 330 | // Skip debugging pseudos; necessary to avoid changing the code. | 
|  | 331 | while (I1->isDebugValue()) { | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 332 | if (I1==MBB1->begin()) { | 
|  | 333 | while (I2->isDebugValue()) { | 
|  | 334 | if (I2==MBB2->begin()) | 
|  | 335 | // I1==DBG at begin; I2==DBG at begin | 
|  | 336 | return TailLen; | 
|  | 337 | --I2; | 
|  | 338 | } | 
|  | 339 | ++I2; | 
|  | 340 | // I1==DBG at begin; I2==non-DBG, or first of DBGs not at begin | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 341 | return TailLen; | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 342 | } | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 343 | --I1; | 
|  | 344 | } | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 345 | // I1==first (untested) non-DBG preceding known match | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 346 | while (I2->isDebugValue()) { | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 347 | if (I2==MBB2->begin()) { | 
|  | 348 | ++I1; | 
|  | 349 | // I1==non-DBG, or first of DBGs not at begin; I2==DBG at begin | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 350 | return TailLen; | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 351 | } | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 352 | --I2; | 
|  | 353 | } | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 354 | // I1, I2==first (untested) non-DBGs preceding known match | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 355 | if (!I1->isIdenticalTo(I2) || | 
| Bill Wendling | f73340e | 2007-10-25 19:49:32 +0000 | [diff] [blame] | 356 | // FIXME: This check is dubious. It's used to get around a problem where | 
| Bill Wendling | 5f7ed00 | 2007-10-25 18:23:45 +0000 | [diff] [blame] | 357 | // people incorrectly expect inline asm directives to remain in the same | 
|  | 358 | // relative order. This is untenable because normal compiler | 
|  | 359 | // optimizations (like this one) may reorder and/or merge these | 
|  | 360 | // directives. | 
| Chris Lattner | b06015a | 2010-02-09 19:54:29 +0000 | [diff] [blame] | 361 | I1->isInlineAsm()) { | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 362 | ++I1; ++I2; | 
|  | 363 | break; | 
|  | 364 | } | 
|  | 365 | ++TailLen; | 
|  | 366 | } | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 367 | // Back past possible debugging pseudos at beginning of block.  This matters | 
|  | 368 | // when one block differs from the other only by whether debugging pseudos | 
|  | 369 | // are present at the beginning.  (This way, the various checks later for | 
|  | 370 | // I1==MBB1->begin() work as expected.) | 
|  | 371 | if (I1 == MBB1->begin() && I2 != MBB2->begin()) { | 
|  | 372 | --I2; | 
|  | 373 | while (I2->isDebugValue()) { | 
| Craig Topper | 2f6031c | 2012-10-07 20:31:05 +0000 | [diff] [blame] | 374 | if (I2 == MBB2->begin()) | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 375 | return TailLen; | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 376 | --I2; | 
|  | 377 | } | 
|  | 378 | ++I2; | 
|  | 379 | } | 
|  | 380 | if (I2 == MBB2->begin() && I1 != MBB1->begin()) { | 
|  | 381 | --I1; | 
|  | 382 | while (I1->isDebugValue()) { | 
|  | 383 | if (I1 == MBB1->begin()) | 
|  | 384 | return TailLen; | 
|  | 385 | --I1; | 
|  | 386 | } | 
|  | 387 | ++I1; | 
|  | 388 | } | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 389 | return TailLen; | 
|  | 390 | } | 
|  | 391 |  | 
| Eli Friedman | bf00736 | 2011-07-06 23:41:48 +0000 | [diff] [blame] | 392 | void BranchFolder::MaintainLiveIns(MachineBasicBlock *CurMBB, | 
|  | 393 | MachineBasicBlock *NewMBB) { | 
| Evan Cheng | 6cc8d49 | 2012-01-07 03:35:48 +0000 | [diff] [blame] | 394 | if (RS) { | 
|  | 395 | RS->enterBasicBlock(CurMBB); | 
|  | 396 | if (!CurMBB->empty()) | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 397 | RS->forward(std::prev(CurMBB->end())); | 
| Pedro Artigas | ec7cbd7 | 2014-08-04 23:07:49 +0000 | [diff] [blame] | 398 | for (unsigned int i = 1, e = TRI->getNumRegs(); i != e; i++) | 
|  | 399 | if (RS->isRegUsed(i, false)) | 
| Evan Cheng | 6cc8d49 | 2012-01-07 03:35:48 +0000 | [diff] [blame] | 400 | NewMBB->addLiveIn(i); | 
|  | 401 | } | 
| Eli Friedman | bf00736 | 2011-07-06 23:41:48 +0000 | [diff] [blame] | 402 | } | 
|  | 403 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 404 | /// ReplaceTailWithBranchTo - Delete the instruction OldInst and everything | 
| Evan Cheng | 2d51c7c | 2010-06-18 23:09:54 +0000 | [diff] [blame] | 405 | /// after it, replacing it with an unconditional branch to NewDest. | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 406 | void BranchFolder::ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst, | 
|  | 407 | MachineBasicBlock *NewDest) { | 
| Eli Friedman | bf00736 | 2011-07-06 23:41:48 +0000 | [diff] [blame] | 408 | MachineBasicBlock *CurMBB = OldInst->getParent(); | 
|  | 409 |  | 
| Evan Cheng | 2d51c7c | 2010-06-18 23:09:54 +0000 | [diff] [blame] | 410 | TII->ReplaceTailWithBranchTo(OldInst, NewDest); | 
| Eli Friedman | bf00736 | 2011-07-06 23:41:48 +0000 | [diff] [blame] | 411 |  | 
|  | 412 | // For targets that use the register scavenger, we must maintain LiveIns. | 
|  | 413 | MaintainLiveIns(CurMBB, NewDest); | 
|  | 414 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 415 | ++NumTailMerge; | 
|  | 416 | } | 
|  | 417 |  | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 418 | /// SplitMBBAt - Given a machine basic block and an iterator into it, split the | 
|  | 419 | /// MBB so that the part before the iterator falls into the part starting at the | 
|  | 420 | /// iterator.  This returns the new MBB. | 
|  | 421 | MachineBasicBlock *BranchFolder::SplitMBBAt(MachineBasicBlock &CurMBB, | 
| Andrew Trick | 97a1d7c | 2013-06-24 01:55:01 +0000 | [diff] [blame] | 422 | MachineBasicBlock::iterator BBI1, | 
|  | 423 | const BasicBlock *BB) { | 
| Evan Cheng | 37bb617 | 2010-06-22 01:18:16 +0000 | [diff] [blame] | 424 | if (!TII->isLegalToSplitMBBAt(CurMBB, BBI1)) | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 425 | return nullptr; | 
| Evan Cheng | 37bb617 | 2010-06-22 01:18:16 +0000 | [diff] [blame] | 426 |  | 
| Dan Gohman | 3b46030 | 2008-07-07 23:14:23 +0000 | [diff] [blame] | 427 | MachineFunction &MF = *CurMBB.getParent(); | 
|  | 428 |  | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 429 | // Create the fall-through block. | 
|  | 430 | MachineFunction::iterator MBBI = &CurMBB; | 
| Andrew Trick | 97a1d7c | 2013-06-24 01:55:01 +0000 | [diff] [blame] | 431 | MachineBasicBlock *NewMBB =MF.CreateMachineBasicBlock(BB); | 
| Dan Gohman | 3b46030 | 2008-07-07 23:14:23 +0000 | [diff] [blame] | 432 | CurMBB.getParent()->insert(++MBBI, NewMBB); | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 433 |  | 
|  | 434 | // Move all the successors of this block to the specified block. | 
| Dan Gohman | 6f88069 | 2008-06-19 17:22:29 +0000 | [diff] [blame] | 435 | NewMBB->transferSuccessors(&CurMBB); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 436 |  | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 437 | // Add an edge from CurMBB to NewMBB for the fall-through. | 
|  | 438 | CurMBB.addSuccessor(NewMBB); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 439 |  | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 440 | // Splice the code over. | 
|  | 441 | NewMBB->splice(NewMBB->end(), &CurMBB, BBI1, CurMBB.end()); | 
| Dale Johannesen | d05a1a2 | 2007-03-20 21:35:06 +0000 | [diff] [blame] | 442 |  | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 443 | // NewMBB inherits CurMBB's block frequency. | 
|  | 444 | MBBFreqInfo.setBlockFreq(NewMBB, MBBFreqInfo.getBlockFreq(&CurMBB)); | 
|  | 445 |  | 
| Dale Johannesen | d05a1a2 | 2007-03-20 21:35:06 +0000 | [diff] [blame] | 446 | // For targets that use the register scavenger, we must maintain LiveIns. | 
| Eli Friedman | bf00736 | 2011-07-06 23:41:48 +0000 | [diff] [blame] | 447 | MaintainLiveIns(&CurMBB, NewMBB); | 
| Dale Johannesen | d05a1a2 | 2007-03-20 21:35:06 +0000 | [diff] [blame] | 448 |  | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 449 | return NewMBB; | 
|  | 450 | } | 
|  | 451 |  | 
| Chris Lattner | 7cee6dd | 2006-11-01 19:36:29 +0000 | [diff] [blame] | 452 | /// EstimateRuntime - Make a rough estimate for how long it will take to run | 
|  | 453 | /// the specified code. | 
|  | 454 | static unsigned EstimateRuntime(MachineBasicBlock::iterator I, | 
| Chris Lattner | a98c679 | 2008-01-07 01:56:04 +0000 | [diff] [blame] | 455 | MachineBasicBlock::iterator E) { | 
| Chris Lattner | 7cee6dd | 2006-11-01 19:36:29 +0000 | [diff] [blame] | 456 | unsigned Time = 0; | 
|  | 457 | for (; I != E; ++I) { | 
| Dale Johannesen | 2061c84 | 2010-03-05 00:02:59 +0000 | [diff] [blame] | 458 | if (I->isDebugValue()) | 
|  | 459 | continue; | 
| Evan Cheng | 7f8e563 | 2011-12-07 07:15:52 +0000 | [diff] [blame] | 460 | if (I->isCall()) | 
| Chris Lattner | 7cee6dd | 2006-11-01 19:36:29 +0000 | [diff] [blame] | 461 | Time += 10; | 
| Evan Cheng | 7f8e563 | 2011-12-07 07:15:52 +0000 | [diff] [blame] | 462 | else if (I->mayLoad() || I->mayStore()) | 
| Chris Lattner | 7cee6dd | 2006-11-01 19:36:29 +0000 | [diff] [blame] | 463 | Time += 2; | 
|  | 464 | else | 
|  | 465 | ++Time; | 
|  | 466 | } | 
|  | 467 | return Time; | 
|  | 468 | } | 
|  | 469 |  | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 470 | // CurMBB needs to add an unconditional branch to SuccMBB (we removed these | 
|  | 471 | // branches temporarily for tail merging).  In the case where CurMBB ends | 
|  | 472 | // with a conditional branch to the next block, optimize by reversing the | 
|  | 473 | // test and conditionally branching to SuccMBB instead. | 
| Bob Wilson | 3794ec2 | 2009-11-16 18:08:46 +0000 | [diff] [blame] | 474 | static void FixTail(MachineBasicBlock *CurMBB, MachineBasicBlock *SuccBB, | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 475 | const TargetInstrInfo *TII) { | 
|  | 476 | MachineFunction *MF = CurMBB->getParent(); | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 477 | MachineFunction::iterator I = std::next(MachineFunction::iterator(CurMBB)); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 478 | MachineBasicBlock *TBB = nullptr, *FBB = nullptr; | 
| Owen Anderson | 4f6bf04 | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 479 | SmallVector<MachineOperand, 4> Cond; | 
| Stuart Hastings | 0125b64 | 2010-06-17 22:43:56 +0000 | [diff] [blame] | 480 | DebugLoc dl;  // FIXME: this is nowhere | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 481 | if (I != MF->end() && | 
| Evan Cheng | 64dfcac | 2009-02-09 07:14:22 +0000 | [diff] [blame] | 482 | !TII->AnalyzeBranch(*CurMBB, TBB, FBB, Cond, true)) { | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 483 | MachineBasicBlock *NextBB = I; | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 484 | if (TBB == NextBB && !Cond.empty() && !FBB) { | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 485 | if (!TII->ReverseBranchCondition(Cond)) { | 
|  | 486 | TII->RemoveBranch(*CurMBB); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 487 | TII->InsertBranch(*CurMBB, SuccBB, nullptr, Cond, dl); | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 488 | return; | 
|  | 489 | } | 
|  | 490 | } | 
|  | 491 | } | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 492 | TII->InsertBranch(*CurMBB, SuccBB, nullptr, | 
| Stuart Hastings | 0125b64 | 2010-06-17 22:43:56 +0000 | [diff] [blame] | 493 | SmallVector<MachineOperand, 0>(), dl); | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 494 | } | 
|  | 495 |  | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 496 | bool | 
|  | 497 | BranchFolder::MergePotentialsElt::operator<(const MergePotentialsElt &o) const { | 
|  | 498 | if (getHash() < o.getHash()) | 
|  | 499 | return true; | 
| Craig Topper | 2f6031c | 2012-10-07 20:31:05 +0000 | [diff] [blame] | 500 | if (getHash() > o.getHash()) | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 501 | return false; | 
| Craig Topper | 2f6031c | 2012-10-07 20:31:05 +0000 | [diff] [blame] | 502 | if (getBlock()->getNumber() < o.getBlock()->getNumber()) | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 503 | return true; | 
| Craig Topper | 2f6031c | 2012-10-07 20:31:05 +0000 | [diff] [blame] | 504 | if (getBlock()->getNumber() > o.getBlock()->getNumber()) | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 505 | return false; | 
| Craig Topper | 2f6031c | 2012-10-07 20:31:05 +0000 | [diff] [blame] | 506 | // _GLIBCXX_DEBUG checks strict weak ordering, which involves comparing | 
|  | 507 | // an object with itself. | 
| Duncan Sands | d5ea194 | 2007-07-11 08:47:55 +0000 | [diff] [blame] | 508 | #ifndef _GLIBCXX_DEBUG | 
| Craig Topper | 2f6031c | 2012-10-07 20:31:05 +0000 | [diff] [blame] | 509 | llvm_unreachable("Predecessor appears twice"); | 
| David Blaikie | 46a9f01 | 2012-01-20 21:51:11 +0000 | [diff] [blame] | 510 | #else | 
| Craig Topper | 2f6031c | 2012-10-07 20:31:05 +0000 | [diff] [blame] | 511 | return false; | 
| David Blaikie | 46a9f01 | 2012-01-20 21:51:11 +0000 | [diff] [blame] | 512 | #endif | 
| Dale Johannesen | a69ebdb | 2007-05-29 23:47:50 +0000 | [diff] [blame] | 513 | } | 
|  | 514 |  | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 515 | BlockFrequency | 
|  | 516 | BranchFolder::MBFIWrapper::getBlockFreq(const MachineBasicBlock *MBB) const { | 
|  | 517 | auto I = MergedBBFreq.find(MBB); | 
|  | 518 |  | 
|  | 519 | if (I != MergedBBFreq.end()) | 
|  | 520 | return I->second; | 
|  | 521 |  | 
|  | 522 | return MBFI.getBlockFreq(MBB); | 
|  | 523 | } | 
|  | 524 |  | 
|  | 525 | void BranchFolder::MBFIWrapper::setBlockFreq(const MachineBasicBlock *MBB, | 
|  | 526 | BlockFrequency F) { | 
|  | 527 | MergedBBFreq[MBB] = F; | 
|  | 528 | } | 
|  | 529 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 530 | /// CountTerminators - Count the number of terminators in the given | 
|  | 531 | /// block and set I to the position of the first non-terminator, if there | 
|  | 532 | /// is one, or MBB->end() otherwise. | 
|  | 533 | static unsigned CountTerminators(MachineBasicBlock *MBB, | 
|  | 534 | MachineBasicBlock::iterator &I) { | 
|  | 535 | I = MBB->end(); | 
|  | 536 | unsigned NumTerms = 0; | 
|  | 537 | for (;;) { | 
|  | 538 | if (I == MBB->begin()) { | 
|  | 539 | I = MBB->end(); | 
|  | 540 | break; | 
|  | 541 | } | 
|  | 542 | --I; | 
| Evan Cheng | 7f8e563 | 2011-12-07 07:15:52 +0000 | [diff] [blame] | 543 | if (!I->isTerminator()) break; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 544 | ++NumTerms; | 
|  | 545 | } | 
|  | 546 | return NumTerms; | 
|  | 547 | } | 
|  | 548 |  | 
| Bob Wilson | 94f8f87 | 2009-10-29 18:40:06 +0000 | [diff] [blame] | 549 | /// ProfitableToMerge - Check if two machine basic blocks have a common tail | 
|  | 550 | /// and decide if it would be profitable to merge those tails.  Return the | 
|  | 551 | /// length of the common tail and iterators to the first common instruction | 
|  | 552 | /// in each block. | 
|  | 553 | static bool ProfitableToMerge(MachineBasicBlock *MBB1, | 
|  | 554 | MachineBasicBlock *MBB2, | 
|  | 555 | unsigned minCommonTailLength, | 
|  | 556 | unsigned &CommonTailLen, | 
|  | 557 | MachineBasicBlock::iterator &I1, | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 558 | MachineBasicBlock::iterator &I2, | 
|  | 559 | MachineBasicBlock *SuccBB, | 
|  | 560 | MachineBasicBlock *PredBB) { | 
| Bob Wilson | 94f8f87 | 2009-10-29 18:40:06 +0000 | [diff] [blame] | 561 | CommonTailLen = ComputeCommonTailLength(MBB1, MBB2, I1, I2); | 
| Bob Wilson | 94f8f87 | 2009-10-29 18:40:06 +0000 | [diff] [blame] | 562 | if (CommonTailLen == 0) | 
|  | 563 | return false; | 
| Evan Cheng | b8ed462 | 2011-02-21 23:39:48 +0000 | [diff] [blame] | 564 | DEBUG(dbgs() << "Common tail length of BB#" << MBB1->getNumber() | 
|  | 565 | << " and BB#" << MBB2->getNumber() << " is " << CommonTailLen | 
|  | 566 | << '\n'); | 
| Bob Wilson | 94f8f87 | 2009-10-29 18:40:06 +0000 | [diff] [blame] | 567 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 568 | // It's almost always profitable to merge any number of non-terminator | 
|  | 569 | // instructions with the block that falls through into the common successor. | 
|  | 570 | if (MBB1 == PredBB || MBB2 == PredBB) { | 
|  | 571 | MachineBasicBlock::iterator I; | 
|  | 572 | unsigned NumTerms = CountTerminators(MBB1 == PredBB ? MBB2 : MBB1, I); | 
|  | 573 | if (CommonTailLen > NumTerms) | 
|  | 574 | return true; | 
|  | 575 | } | 
|  | 576 |  | 
| Dan Gohman | 09478e9 | 2009-11-12 00:39:10 +0000 | [diff] [blame] | 577 | // If one of the blocks can be completely merged and happens to be in | 
|  | 578 | // a position where the other could fall through into it, merge any number | 
|  | 579 | // of instructions, because it can be done without a branch. | 
|  | 580 | // TODO: If the blocks are not adjacent, move one of them so that they are? | 
|  | 581 | if (MBB1->isLayoutSuccessor(MBB2) && I2 == MBB2->begin()) | 
|  | 582 | return true; | 
|  | 583 | if (MBB2->isLayoutSuccessor(MBB1) && I1 == MBB1->begin()) | 
|  | 584 | return true; | 
|  | 585 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 586 | // If both blocks have an unconditional branch temporarily stripped out, | 
| Dan Gohman | 225fa59c | 2009-11-13 21:02:15 +0000 | [diff] [blame] | 587 | // count that as an additional common instruction for the following | 
|  | 588 | // heuristics. | 
|  | 589 | unsigned EffectiveTailLen = CommonTailLen; | 
| Bob Wilson | 699f5b9 | 2009-11-16 17:56:13 +0000 | [diff] [blame] | 590 | if (SuccBB && MBB1 != PredBB && MBB2 != PredBB && | 
| Evan Cheng | 7f8e563 | 2011-12-07 07:15:52 +0000 | [diff] [blame] | 591 | !MBB1->back().isBarrier() && | 
|  | 592 | !MBB2->back().isBarrier()) | 
| Dan Gohman | 225fa59c | 2009-11-13 21:02:15 +0000 | [diff] [blame] | 593 | ++EffectiveTailLen; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 594 |  | 
|  | 595 | // Check if the common tail is long enough to be worthwhile. | 
| Dan Gohman | 225fa59c | 2009-11-13 21:02:15 +0000 | [diff] [blame] | 596 | if (EffectiveTailLen >= minCommonTailLength) | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 597 | return true; | 
|  | 598 |  | 
| Dan Gohman | 225fa59c | 2009-11-13 21:02:15 +0000 | [diff] [blame] | 599 | // If we are optimizing for code size, 2 instructions in common is enough if | 
|  | 600 | // we don't have to split a block.  At worst we will be introducing 1 new | 
|  | 601 | // branch instruction, which is likely to be smaller than the 2 | 
|  | 602 | // instructions that would be deleted in the merge. | 
| Evan Cheng | b8ed462 | 2011-02-21 23:39:48 +0000 | [diff] [blame] | 603 | MachineFunction *MF = MBB1->getParent(); | 
| Sanjay Patel | d967a87 | 2015-08-10 23:07:26 +0000 | [diff] [blame] | 604 | if (EffectiveTailLen >= 2 && MF->getFunction()->optForSize() && | 
| Bob Wilson | 94f8f87 | 2009-10-29 18:40:06 +0000 | [diff] [blame] | 605 | (I1 == MBB1->begin() || I2 == MBB2->begin())) | 
|  | 606 | return true; | 
|  | 607 |  | 
|  | 608 | return false; | 
|  | 609 | } | 
|  | 610 |  | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 611 | /// ComputeSameTails - Look through all the blocks in MergePotentials that have | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 612 | /// hash CurHash (guaranteed to match the last element).  Build the vector | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 613 | /// SameTails of all those that have the (same) largest number of instructions | 
|  | 614 | /// in common of any pair of these blocks.  SameTails entries contain an | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 615 | /// iterator into MergePotentials (from which the MachineBasicBlock can be | 
|  | 616 | /// found) and a MachineBasicBlock::iterator into that MBB indicating the | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 617 | /// instruction where the matching code sequence begins. | 
|  | 618 | /// Order of elements in SameTails is the reverse of the order in which | 
|  | 619 | /// those blocks appear in MergePotentials (where they are not necessarily | 
|  | 620 | /// consecutive). | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 621 | unsigned BranchFolder::ComputeSameTails(unsigned CurHash, | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 622 | unsigned minCommonTailLength, | 
|  | 623 | MachineBasicBlock *SuccBB, | 
|  | 624 | MachineBasicBlock *PredBB) { | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 625 | unsigned maxCommonTailLength = 0U; | 
|  | 626 | SameTails.clear(); | 
|  | 627 | MachineBasicBlock::iterator TrialBBI1, TrialBBI2; | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 628 | MPIterator HighestMPIter = std::prev(MergePotentials.end()); | 
|  | 629 | for (MPIterator CurMPIter = std::prev(MergePotentials.end()), | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 630 | B = MergePotentials.begin(); | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 631 | CurMPIter != B && CurMPIter->getHash() == CurHash; --CurMPIter) { | 
|  | 632 | for (MPIterator I = std::prev(CurMPIter); I->getHash() == CurHash; --I) { | 
| Bob Wilson | 94f8f87 | 2009-10-29 18:40:06 +0000 | [diff] [blame] | 633 | unsigned CommonTailLen; | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 634 | if (ProfitableToMerge(CurMPIter->getBlock(), I->getBlock(), | 
|  | 635 | minCommonTailLength, | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 636 | CommonTailLen, TrialBBI1, TrialBBI2, | 
|  | 637 | SuccBB, PredBB)) { | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 638 | if (CommonTailLen > maxCommonTailLength) { | 
|  | 639 | SameTails.clear(); | 
|  | 640 | maxCommonTailLength = CommonTailLen; | 
|  | 641 | HighestMPIter = CurMPIter; | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 642 | SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1)); | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 643 | } | 
|  | 644 | if (HighestMPIter == CurMPIter && | 
|  | 645 | CommonTailLen == maxCommonTailLength) | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 646 | SameTails.push_back(SameTailElt(I, TrialBBI2)); | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 647 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 648 | if (I == B) | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 649 | break; | 
|  | 650 | } | 
|  | 651 | } | 
|  | 652 | return maxCommonTailLength; | 
|  | 653 | } | 
|  | 654 |  | 
|  | 655 | /// RemoveBlocksWithHash - Remove all blocks with hash CurHash from | 
|  | 656 | /// MergePotentials, restoring branches at ends of blocks as appropriate. | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 657 | void BranchFolder::RemoveBlocksWithHash(unsigned CurHash, | 
| Bob Wilson | 3794ec2 | 2009-11-16 18:08:46 +0000 | [diff] [blame] | 658 | MachineBasicBlock *SuccBB, | 
|  | 659 | MachineBasicBlock *PredBB) { | 
| Dale Johannesen | b28a17c | 2008-05-23 17:19:02 +0000 | [diff] [blame] | 660 | MPIterator CurMPIter, B; | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 661 | for (CurMPIter = std::prev(MergePotentials.end()), | 
|  | 662 | B = MergePotentials.begin(); | 
|  | 663 | CurMPIter->getHash() == CurHash; --CurMPIter) { | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 664 | // Put the unconditional branch back, if we need one. | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 665 | MachineBasicBlock *CurMBB = CurMPIter->getBlock(); | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 666 | if (SuccBB && CurMBB != PredBB) | 
|  | 667 | FixTail(CurMBB, SuccBB, TII); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 668 | if (CurMPIter == B) | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 669 | break; | 
|  | 670 | } | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 671 | if (CurMPIter->getHash() != CurHash) | 
| Dale Johannesen | b28a17c | 2008-05-23 17:19:02 +0000 | [diff] [blame] | 672 | CurMPIter++; | 
|  | 673 | MergePotentials.erase(CurMPIter, MergePotentials.end()); | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 674 | } | 
|  | 675 |  | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 676 | /// CreateCommonTailOnlyBlock - None of the blocks to be tail-merged consist | 
|  | 677 | /// only of the common tail.  Create a block that does by splitting one. | 
| Evan Cheng | 37bb617 | 2010-06-22 01:18:16 +0000 | [diff] [blame] | 678 | bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB, | 
| Andrew Trick | 97a1d7c | 2013-06-24 01:55:01 +0000 | [diff] [blame] | 679 | MachineBasicBlock *SuccBB, | 
| Evan Cheng | 37bb617 | 2010-06-22 01:18:16 +0000 | [diff] [blame] | 680 | unsigned maxCommonTailLength, | 
|  | 681 | unsigned &commonTailIndex) { | 
|  | 682 | commonTailIndex = 0; | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 683 | unsigned TimeEstimate = ~0U; | 
| Dan Gohman | b3bf49f | 2009-11-12 01:51:28 +0000 | [diff] [blame] | 684 | for (unsigned i = 0, e = SameTails.size(); i != e; ++i) { | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 685 | // Use PredBB if possible; that doesn't require a new branch. | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 686 | if (SameTails[i].getBlock() == PredBB) { | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 687 | commonTailIndex = i; | 
|  | 688 | break; | 
|  | 689 | } | 
|  | 690 | // Otherwise, make a (fairly bogus) choice based on estimate of | 
|  | 691 | // how long it will take the various blocks to execute. | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 692 | unsigned t = EstimateRuntime(SameTails[i].getBlock()->begin(), | 
|  | 693 | SameTails[i].getTailStartPos()); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 694 | if (t <= TimeEstimate) { | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 695 | TimeEstimate = t; | 
|  | 696 | commonTailIndex = i; | 
|  | 697 | } | 
|  | 698 | } | 
|  | 699 |  | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 700 | MachineBasicBlock::iterator BBI = | 
|  | 701 | SameTails[commonTailIndex].getTailStartPos(); | 
|  | 702 | MachineBasicBlock *MBB = SameTails[commonTailIndex].getBlock(); | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 703 |  | 
| Dale Johannesen | 0eebdbb | 2010-03-08 05:38:13 +0000 | [diff] [blame] | 704 | // If the common tail includes any debug info we will take it pretty | 
|  | 705 | // randomly from one of the inputs.  Might be better to remove it? | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 706 | DEBUG(dbgs() << "\nSplitting BB#" << MBB->getNumber() << ", size " | 
| Bill Wendling | c3f05e8 | 2009-08-22 20:03:00 +0000 | [diff] [blame] | 707 | << maxCommonTailLength); | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 708 |  | 
| Andrew Trick | 97a1d7c | 2013-06-24 01:55:01 +0000 | [diff] [blame] | 709 | // If the split block unconditionally falls-thru to SuccBB, it will be | 
|  | 710 | // merged. In control flow terms it should then take SuccBB's name. e.g. If | 
|  | 711 | // SuccBB is an inner loop, the common tail is still part of the inner loop. | 
|  | 712 | const BasicBlock *BB = (SuccBB && MBB->succ_size() == 1) ? | 
|  | 713 | SuccBB->getBasicBlock() : MBB->getBasicBlock(); | 
|  | 714 | MachineBasicBlock *newMBB = SplitMBBAt(*MBB, BBI, BB); | 
| Evan Cheng | 37bb617 | 2010-06-22 01:18:16 +0000 | [diff] [blame] | 715 | if (!newMBB) { | 
|  | 716 | DEBUG(dbgs() << "... failed!"); | 
|  | 717 | return false; | 
|  | 718 | } | 
|  | 719 |  | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 720 | SameTails[commonTailIndex].setBlock(newMBB); | 
|  | 721 | SameTails[commonTailIndex].setTailStartPos(newMBB->begin()); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 722 |  | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 723 | // If we split PredBB, newMBB is the new predecessor. | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 724 | if (PredBB == MBB) | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 725 | PredBB = newMBB; | 
|  | 726 |  | 
| Evan Cheng | 37bb617 | 2010-06-22 01:18:16 +0000 | [diff] [blame] | 727 | return true; | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 728 | } | 
|  | 729 |  | 
| Chad Rosier | 3b67c8d | 2015-03-10 16:22:52 +0000 | [diff] [blame] | 730 | static bool hasIdenticalMMOs(const MachineInstr *MI1, const MachineInstr *MI2) { | 
|  | 731 | auto I1 = MI1->memoperands_begin(), E1 = MI1->memoperands_end(); | 
|  | 732 | auto I2 = MI2->memoperands_begin(), E2 = MI2->memoperands_end(); | 
|  | 733 | if ((E1 - I1) != (E2 - I2)) | 
|  | 734 | return false; | 
|  | 735 | for (; I1 != E1; ++I1, ++I2) { | 
|  | 736 | if (**I1 != **I2) | 
|  | 737 | return false; | 
|  | 738 | } | 
|  | 739 | return true; | 
|  | 740 | } | 
|  | 741 |  | 
|  | 742 | static void | 
|  | 743 | removeMMOsFromMemoryOperations(MachineBasicBlock::iterator MBBIStartPos, | 
|  | 744 | MachineBasicBlock &MBBCommon) { | 
|  | 745 | // Remove MMOs from memory operations in the common block | 
|  | 746 | // when they do not match the ones from the block being tail-merged. | 
|  | 747 | // This ensures later passes conservatively compute dependencies. | 
|  | 748 | MachineBasicBlock *MBB = MBBIStartPos->getParent(); | 
|  | 749 | // Note CommonTailLen does not necessarily matches the size of | 
|  | 750 | // the common BB nor all its instructions because of debug | 
|  | 751 | // instructions differences. | 
|  | 752 | unsigned CommonTailLen = 0; | 
|  | 753 | for (auto E = MBB->end(); MBBIStartPos != E; ++MBBIStartPos) | 
|  | 754 | ++CommonTailLen; | 
|  | 755 |  | 
|  | 756 | MachineBasicBlock::reverse_iterator MBBI = MBB->rbegin(); | 
| Chad Rosier | 99fb8d1 | 2015-03-10 20:29:59 +0000 | [diff] [blame] | 757 | MachineBasicBlock::reverse_iterator MBBIE = MBB->rend(); | 
| Chad Rosier | 3b67c8d | 2015-03-10 16:22:52 +0000 | [diff] [blame] | 758 | MachineBasicBlock::reverse_iterator MBBICommon = MBBCommon.rbegin(); | 
|  | 759 | MachineBasicBlock::reverse_iterator MBBIECommon = MBBCommon.rend(); | 
|  | 760 |  | 
|  | 761 | while (CommonTailLen--) { | 
| Chad Rosier | 99fb8d1 | 2015-03-10 20:29:59 +0000 | [diff] [blame] | 762 | assert(MBBI != MBBIE && "Reached BB end within common tail length!"); | 
|  | 763 | (void)MBBIE; | 
| Chad Rosier | 3b67c8d | 2015-03-10 16:22:52 +0000 | [diff] [blame] | 764 |  | 
|  | 765 | if (MBBI->isDebugValue()) { | 
|  | 766 | ++MBBI; | 
|  | 767 | continue; | 
|  | 768 | } | 
|  | 769 |  | 
|  | 770 | while ((MBBICommon != MBBIECommon) && MBBICommon->isDebugValue()) | 
|  | 771 | ++MBBICommon; | 
|  | 772 |  | 
|  | 773 | assert(MBBICommon != MBBIECommon && | 
|  | 774 | "Reached BB end within common tail length!"); | 
|  | 775 | assert(MBBICommon->isIdenticalTo(&*MBBI) && "Expected matching MIIs!"); | 
|  | 776 |  | 
|  | 777 | if (MBBICommon->mayLoad() || MBBICommon->mayStore()) | 
|  | 778 | if (!hasIdenticalMMOs(&*MBBI, &*MBBICommon)) | 
|  | 779 | MBBICommon->clearMemRefs(); | 
|  | 780 |  | 
|  | 781 | ++MBBI; | 
|  | 782 | ++MBBICommon; | 
|  | 783 | } | 
|  | 784 | } | 
|  | 785 |  | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 786 | // See if any of the blocks in MergePotentials (which all have a common single | 
|  | 787 | // successor, or all have no successor) can be tail-merged.  If there is a | 
|  | 788 | // successor, any blocks in MergePotentials that are not tail-merged and | 
|  | 789 | // are not immediately before Succ must have an unconditional branch to | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 790 | // Succ added (but the predecessor/successor lists need no adjustment). | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 791 | // The lone predecessor of Succ that falls through into Succ, | 
|  | 792 | // if any, is given in PredBB. | 
|  | 793 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 794 | bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB, | 
| Bob Wilson | 3794ec2 | 2009-11-16 18:08:46 +0000 | [diff] [blame] | 795 | MachineBasicBlock *PredBB) { | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 796 | bool MadeChange = false; | 
|  | 797 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 798 | // Except for the special cases below, tail-merge if there are at least | 
|  | 799 | // this many instructions in common. | 
|  | 800 | unsigned minCommonTailLength = TailMergeSize; | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 801 |  | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 802 | DEBUG(dbgs() << "\nTryTailMergeBlocks: "; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 803 | for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i) | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 804 | dbgs() << "BB#" << MergePotentials[i].getBlock()->getNumber() | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 805 | << (i == e-1 ? "" : ", "); | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 806 | dbgs() << "\n"; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 807 | if (SuccBB) { | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 808 | dbgs() << "  with successor BB#" << SuccBB->getNumber() << '\n'; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 809 | if (PredBB) | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 810 | dbgs() << "  which has fall-through from BB#" | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 811 | << PredBB->getNumber() << "\n"; | 
|  | 812 | } | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 813 | dbgs() << "Looking for common tails of at least " | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 814 | << minCommonTailLength << " instruction" | 
|  | 815 | << (minCommonTailLength == 1 ? "" : "s") << '\n'; | 
|  | 816 | ); | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 817 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 818 | // Sort by hash value so that blocks with identical end sequences sort | 
|  | 819 | // together. | 
| Benjamin Kramer | 848c9fa | 2015-03-13 21:17:02 +0000 | [diff] [blame] | 820 | array_pod_sort(MergePotentials.begin(), MergePotentials.end()); | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 821 |  | 
|  | 822 | // Walk through equivalence sets looking for actual exact matches. | 
|  | 823 | while (MergePotentials.size() > 1) { | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 824 | unsigned CurHash = MergePotentials.back().getHash(); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 825 |  | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 826 | // Build SameTails, identifying the set of blocks with this hash code | 
|  | 827 | // and with the maximum number of instructions in common. | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 828 | unsigned maxCommonTailLength = ComputeSameTails(CurHash, | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 829 | minCommonTailLength, | 
|  | 830 | SuccBB, PredBB); | 
| Dale Johannesen | f4a77d2 | 2007-05-23 21:07:20 +0000 | [diff] [blame] | 831 |  | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 832 | // If we didn't find any pair that has at least minCommonTailLength | 
| Dale Johannesen | cff7df2 | 2008-05-09 21:24:35 +0000 | [diff] [blame] | 833 | // instructions in common, remove all blocks with this hash code and retry. | 
|  | 834 | if (SameTails.empty()) { | 
| Dale Johannesen | 66da8b5 | 2008-05-09 23:28:24 +0000 | [diff] [blame] | 835 | RemoveBlocksWithHash(CurHash, SuccBB, PredBB); | 
| Dale Johannesen | f4a77d2 | 2007-05-23 21:07:20 +0000 | [diff] [blame] | 836 | continue; | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 837 | } | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 838 |  | 
| Dale Johannesen | cff7df2 | 2008-05-09 21:24:35 +0000 | [diff] [blame] | 839 | // If one of the blocks is the entire common tail (and not the entry | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 840 | // block, which we can't jump to), we can treat all blocks with this same | 
|  | 841 | // tail at once.  Use PredBB if that is one of the possibilities, as that | 
|  | 842 | // will not introduce any extra branches. | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 843 | MachineBasicBlock *EntryBB = MergePotentials.begin()->getBlock()-> | 
|  | 844 | getParent()->begin(); | 
|  | 845 | unsigned commonTailIndex = SameTails.size(); | 
| Dan Gohman | 09478e9 | 2009-11-12 00:39:10 +0000 | [diff] [blame] | 846 | // If there are two blocks, check to see if one can be made to fall through | 
|  | 847 | // into the other. | 
|  | 848 | if (SameTails.size() == 2 && | 
|  | 849 | SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) && | 
|  | 850 | SameTails[1].tailIsWholeBlock()) | 
|  | 851 | commonTailIndex = 1; | 
|  | 852 | else if (SameTails.size() == 2 && | 
|  | 853 | SameTails[1].getBlock()->isLayoutSuccessor( | 
|  | 854 | SameTails[0].getBlock()) && | 
|  | 855 | SameTails[0].tailIsWholeBlock()) | 
|  | 856 | commonTailIndex = 0; | 
|  | 857 | else { | 
|  | 858 | // Otherwise just pick one, favoring the fall-through predecessor if | 
|  | 859 | // there is one. | 
|  | 860 | for (unsigned i = 0, e = SameTails.size(); i != e; ++i) { | 
|  | 861 | MachineBasicBlock *MBB = SameTails[i].getBlock(); | 
|  | 862 | if (MBB == EntryBB && SameTails[i].tailIsWholeBlock()) | 
|  | 863 | continue; | 
|  | 864 | if (MBB == PredBB) { | 
|  | 865 | commonTailIndex = i; | 
|  | 866 | break; | 
|  | 867 | } | 
|  | 868 | if (SameTails[i].tailIsWholeBlock()) | 
|  | 869 | commonTailIndex = i; | 
| Dale Johannesen | cff7df2 | 2008-05-09 21:24:35 +0000 | [diff] [blame] | 870 | } | 
| Dale Johannesen | cff7df2 | 2008-05-09 21:24:35 +0000 | [diff] [blame] | 871 | } | 
| Dale Johannesen | 3c0a137 | 2007-06-01 23:02:45 +0000 | [diff] [blame] | 872 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 873 | if (commonTailIndex == SameTails.size() || | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 874 | (SameTails[commonTailIndex].getBlock() == PredBB && | 
|  | 875 | !SameTails[commonTailIndex].tailIsWholeBlock())) { | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 876 | // None of the blocks consist entirely of the common tail. | 
|  | 877 | // Split a block so that one does. | 
| Andrew Trick | 97a1d7c | 2013-06-24 01:55:01 +0000 | [diff] [blame] | 878 | if (!CreateCommonTailOnlyBlock(PredBB, SuccBB, | 
| Evan Cheng | 37bb617 | 2010-06-22 01:18:16 +0000 | [diff] [blame] | 879 | maxCommonTailLength, commonTailIndex)) { | 
|  | 880 | RemoveBlocksWithHash(CurHash, SuccBB, PredBB); | 
|  | 881 | continue; | 
|  | 882 | } | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 883 | } | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 884 |  | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 885 | MachineBasicBlock *MBB = SameTails[commonTailIndex].getBlock(); | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 886 |  | 
|  | 887 | // Recompute commont tail MBB's edge weights and block frequency. | 
|  | 888 | setCommonTailEdgeWeights(*MBB); | 
|  | 889 |  | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 890 | // MBB is common tail.  Adjust all other BB's to jump to this one. | 
|  | 891 | // Traversal must be forwards so erases work. | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 892 | DEBUG(dbgs() << "\nUsing common tail in BB#" << MBB->getNumber() | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 893 | << " for "); | 
|  | 894 | for (unsigned int i=0, e = SameTails.size(); i != e; ++i) { | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 895 | if (commonTailIndex == i) | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 896 | continue; | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 897 | DEBUG(dbgs() << "BB#" << SameTails[i].getBlock()->getNumber() | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 898 | << (i == e-1 ? "" : ", ")); | 
| Chad Rosier | 3b67c8d | 2015-03-10 16:22:52 +0000 | [diff] [blame] | 899 | // Remove MMOs from memory operations as needed. | 
|  | 900 | removeMMOsFromMemoryOperations(SameTails[i].getTailStartPos(), *MBB); | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 901 | // Hack the end off BB i, making it jump to BB commonTailIndex instead. | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 902 | ReplaceTailWithBranchTo(SameTails[i].getTailStartPos(), MBB); | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 903 | // BB i is no longer a predecessor of SuccBB; remove it from the worklist. | 
| Dan Gohman | 02b1554 | 2009-11-11 21:57:02 +0000 | [diff] [blame] | 904 | MergePotentials.erase(SameTails[i].getMPIter()); | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 905 | } | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 906 | DEBUG(dbgs() << "\n"); | 
| Dale Johannesen | c4c4d8e | 2008-05-12 20:33:57 +0000 | [diff] [blame] | 907 | // We leave commonTailIndex in the worklist in case there are other blocks | 
|  | 908 | // that match it with a smaller number of instructions. | 
| Chris Lattner | f505a5a | 2006-11-01 01:16:12 +0000 | [diff] [blame] | 909 | MadeChange = true; | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 910 | } | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 911 | return MadeChange; | 
|  | 912 | } | 
|  | 913 |  | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 914 | bool BranchFolder::TailMergeBlocks(MachineFunction &MF) { | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 915 | bool MadeChange = false; | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 916 | if (!EnableTailMerge) return MadeChange; | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 917 |  | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 918 | // First find blocks with no successors. | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 919 | MergePotentials.clear(); | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 920 | for (MachineBasicBlock &MBB : MF) { | 
|  | 921 | if (MergePotentials.size() == TailMergeThreshold) | 
|  | 922 | break; | 
|  | 923 | if (!TriedMerging.count(&MBB) && MBB.succ_empty()) | 
|  | 924 | MergePotentials.push_back(MergePotentialsElt(HashEndOfMBB(&MBB), &MBB)); | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 925 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 926 |  | 
| Rafael Espindola | 3aeaf9e | 2011-06-14 15:31:54 +0000 | [diff] [blame] | 927 | // If this is a large problem, avoid visiting the same basic blocks | 
|  | 928 | // multiple times. | 
|  | 929 | if (MergePotentials.size() == TailMergeThreshold) | 
|  | 930 | for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i) | 
|  | 931 | TriedMerging.insert(MergePotentials[i].getBlock()); | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 932 |  | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 933 | // See if we can do any tail merging on those. | 
| Rafael Espindola | 3aeaf9e | 2011-06-14 15:31:54 +0000 | [diff] [blame] | 934 | if (MergePotentials.size() >= 2) | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 935 | MadeChange |= TryTailMergeBlocks(nullptr, nullptr); | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 936 |  | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 937 | // Look at blocks (IBB) with multiple predecessors (PBB). | 
|  | 938 | // We change each predecessor to a canonical form, by | 
|  | 939 | // (1) temporarily removing any unconditional branch from the predecessor | 
|  | 940 | // to IBB, and | 
|  | 941 | // (2) alter conditional branches so they branch to the other block | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 942 | // not IBB; this may require adding back an unconditional branch to IBB | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 943 | // later, where there wasn't one coming in.  E.g. | 
|  | 944 | //   Bcc IBB | 
|  | 945 | //   fallthrough to QBB | 
|  | 946 | // here becomes | 
|  | 947 | //   Bncc QBB | 
|  | 948 | // with a conceptual B to IBB after that, which never actually exists. | 
|  | 949 | // With those changes, we see whether the predecessors' tails match, | 
|  | 950 | // and merge them if so.  We change things out of canonical form and | 
|  | 951 | // back to the way they were later in the process.  (OptimizeBranches | 
|  | 952 | // would undo some of this, but we can't use it, because we'd get into | 
|  | 953 | // a compile-time infinite loop repeatedly doing and undoing the same | 
|  | 954 | // transformations.) | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 955 |  | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 956 | for (MachineFunction::iterator I = std::next(MF.begin()), E = MF.end(); | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 957 | I != E; ++I) { | 
| Bill Wendling | e351e8c | 2012-05-23 22:12:50 +0000 | [diff] [blame] | 958 | if (I->pred_size() < 2) continue; | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 959 | SmallPtrSet<MachineBasicBlock *, 8> UniquePreds; | 
|  | 960 | MachineBasicBlock *IBB = I; | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 961 | MachineBasicBlock *PredBB = std::prev(I); | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 962 | MergePotentials.clear(); | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 963 | for (MachineBasicBlock *PBB : I->predecessors()) { | 
|  | 964 | if (MergePotentials.size() == TailMergeThreshold) | 
|  | 965 | break; | 
|  | 966 |  | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 967 | if (TriedMerging.count(PBB)) | 
|  | 968 | continue; | 
|  | 969 |  | 
|  | 970 | // Skip blocks that loop to themselves, can't tail merge these. | 
|  | 971 | if (PBB == IBB) | 
|  | 972 | continue; | 
|  | 973 |  | 
|  | 974 | // Visit each predecessor only once. | 
| David Blaikie | 70573dc | 2014-11-19 07:49:26 +0000 | [diff] [blame] | 975 | if (!UniquePreds.insert(PBB).second) | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 976 | continue; | 
|  | 977 |  | 
|  | 978 | // Skip blocks which may jump to a landing pad. Can't tail merge these. | 
| Reid Kleckner | ed17079 | 2015-09-17 17:19:40 +0000 | [diff] [blame] | 979 | if (PBB->hasEHPadSuccessor()) | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 980 | continue; | 
|  | 981 |  | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 982 | MachineBasicBlock *TBB = nullptr, *FBB = nullptr; | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 983 | SmallVector<MachineOperand, 4> Cond; | 
|  | 984 | if (!TII->AnalyzeBranch(*PBB, TBB, FBB, Cond, true)) { | 
|  | 985 | // Failing case: IBB is the target of a cbr, and we cannot reverse the | 
|  | 986 | // branch. | 
|  | 987 | SmallVector<MachineOperand, 4> NewCond(Cond); | 
|  | 988 | if (!Cond.empty() && TBB == IBB) { | 
|  | 989 | if (TII->ReverseBranchCondition(NewCond)) | 
|  | 990 | continue; | 
|  | 991 | // This is the QBB case described above | 
|  | 992 | if (!FBB) | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 993 | FBB = std::next(MachineFunction::iterator(PBB)); | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 994 | } | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 995 |  | 
|  | 996 | // Failing case: the only way IBB can be reached from PBB is via | 
|  | 997 | // exception handling.  Happens for landing pads.  Would be nice to have | 
|  | 998 | // a bit in the edge so we didn't have to do all this. | 
| Reid Kleckner | 0e28823 | 2015-08-27 23:27:47 +0000 | [diff] [blame] | 999 | if (IBB->isEHPad()) { | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 1000 | MachineFunction::iterator IP = PBB;  IP++; | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1001 | MachineBasicBlock *PredNextBB = nullptr; | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 1002 | if (IP != MF.end()) | 
|  | 1003 | PredNextBB = IP; | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1004 | if (!TBB) { | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 1005 | if (IBB != PredNextBB)      // fallthrough | 
|  | 1006 | continue; | 
|  | 1007 | } else if (FBB) { | 
|  | 1008 | if (TBB != IBB && FBB != IBB)   // cbr then ubr | 
|  | 1009 | continue; | 
|  | 1010 | } else if (Cond.empty()) { | 
|  | 1011 | if (TBB != IBB)               // ubr | 
|  | 1012 | continue; | 
|  | 1013 | } else { | 
|  | 1014 | if (TBB != IBB && IBB != PredNextBB)  // cbr | 
|  | 1015 | continue; | 
|  | 1016 | } | 
|  | 1017 | } | 
|  | 1018 |  | 
|  | 1019 | // Remove the unconditional branch at the end, if any. | 
|  | 1020 | if (TBB && (Cond.empty() || FBB)) { | 
|  | 1021 | DebugLoc dl;  // FIXME: this is nowhere | 
|  | 1022 | TII->RemoveBranch(*PBB); | 
|  | 1023 | if (!Cond.empty()) | 
|  | 1024 | // reinsert conditional branch only, for now | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1025 | TII->InsertBranch(*PBB, (TBB == IBB) ? FBB : TBB, nullptr, | 
|  | 1026 | NewCond, dl); | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 1027 | } | 
|  | 1028 |  | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1029 | MergePotentials.push_back(MergePotentialsElt(HashEndOfMBB(PBB), PBB)); | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 1030 | } | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 1031 | } | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 1032 |  | 
|  | 1033 | // If this is a large problem, avoid visiting the same basic blocks multiple | 
|  | 1034 | // times. | 
|  | 1035 | if (MergePotentials.size() == TailMergeThreshold) | 
|  | 1036 | for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i) | 
|  | 1037 | TriedMerging.insert(MergePotentials[i].getBlock()); | 
|  | 1038 |  | 
|  | 1039 | if (MergePotentials.size() >= 2) | 
|  | 1040 | MadeChange |= TryTailMergeBlocks(IBB, PredBB); | 
|  | 1041 |  | 
|  | 1042 | // Reinsert an unconditional branch if needed. The 1 below can occur as a | 
|  | 1043 | // result of removing blocks in TryTailMergeBlocks. | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 1044 | PredBB = std::prev(I);     // this may have been changed in TryTailMergeBlocks | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 1045 | if (MergePotentials.size() == 1 && | 
|  | 1046 | MergePotentials.begin()->getBlock() != PredBB) | 
|  | 1047 | FixTail(MergePotentials.begin()->getBlock(), IBB, TII); | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 1048 | } | 
| Bill Wendling | 041793c | 2012-05-23 22:09:50 +0000 | [diff] [blame] | 1049 |  | 
| Dale Johannesen | 9a25b3a | 2007-05-07 20:57:21 +0000 | [diff] [blame] | 1050 | return MadeChange; | 
|  | 1051 | } | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1052 |  | 
| Akira Hatanaka | bbd33f6 | 2014-08-07 19:30:13 +0000 | [diff] [blame] | 1053 | void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) { | 
|  | 1054 | SmallVector<BlockFrequency, 2> EdgeFreqLs(TailMBB.succ_size()); | 
|  | 1055 | BlockFrequency AccumulatedMBBFreq; | 
|  | 1056 |  | 
|  | 1057 | // Aggregate edge frequency of successor edge j: | 
|  | 1058 | //  edgeFreq(j) = sum (freq(bb) * edgeProb(bb, j)), | 
|  | 1059 | //  where bb is a basic block that is in SameTails. | 
|  | 1060 | for (const auto &Src : SameTails) { | 
|  | 1061 | const MachineBasicBlock *SrcMBB = Src.getBlock(); | 
|  | 1062 | BlockFrequency BlockFreq = MBBFreqInfo.getBlockFreq(SrcMBB); | 
|  | 1063 | AccumulatedMBBFreq += BlockFreq; | 
|  | 1064 |  | 
|  | 1065 | // It is not necessary to recompute edge weights if TailBB has less than two | 
|  | 1066 | // successors. | 
|  | 1067 | if (TailMBB.succ_size() <= 1) | 
|  | 1068 | continue; | 
|  | 1069 |  | 
|  | 1070 | auto EdgeFreq = EdgeFreqLs.begin(); | 
|  | 1071 |  | 
|  | 1072 | for (auto SuccI = TailMBB.succ_begin(), SuccE = TailMBB.succ_end(); | 
|  | 1073 | SuccI != SuccE; ++SuccI, ++EdgeFreq) | 
|  | 1074 | *EdgeFreq += BlockFreq * MBPI.getEdgeProbability(SrcMBB, *SuccI); | 
|  | 1075 | } | 
|  | 1076 |  | 
|  | 1077 | MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq); | 
|  | 1078 |  | 
|  | 1079 | if (TailMBB.succ_size() <= 1) | 
|  | 1080 | return; | 
|  | 1081 |  | 
|  | 1082 | auto MaxEdgeFreq = *std::max_element(EdgeFreqLs.begin(), EdgeFreqLs.end()); | 
|  | 1083 | uint64_t Scale = MaxEdgeFreq.getFrequency() / UINT32_MAX + 1; | 
|  | 1084 | auto EdgeFreq = EdgeFreqLs.begin(); | 
|  | 1085 |  | 
|  | 1086 | for (auto SuccI = TailMBB.succ_begin(), SuccE = TailMBB.succ_end(); | 
|  | 1087 | SuccI != SuccE; ++SuccI, ++EdgeFreq) | 
|  | 1088 | TailMBB.setSuccWeight(SuccI, EdgeFreq->getFrequency() / Scale); | 
|  | 1089 | } | 
|  | 1090 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1091 | //===----------------------------------------------------------------------===// | 
|  | 1092 | //  Branch Optimization | 
|  | 1093 | //===----------------------------------------------------------------------===// | 
|  | 1094 |  | 
|  | 1095 | bool BranchFolder::OptimizeBranches(MachineFunction &MF) { | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1096 | bool MadeChange = false; | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1097 |  | 
| Dale Johannesen | 12920dd | 2007-02-17 00:44:34 +0000 | [diff] [blame] | 1098 | // Make sure blocks are numbered in order | 
|  | 1099 | MF.RenumberBlocks(); | 
|  | 1100 |  | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 1101 | for (MachineFunction::iterator I = std::next(MF.begin()), E = MF.end(); | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1102 | I != E; ) { | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1103 | MachineBasicBlock *MBB = I++; | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1104 | MadeChange |= OptimizeBlock(MBB); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1105 |  | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1106 | // If it is dead, remove it. | 
| Jim Laskey | 9df1a1d | 2007-02-22 16:39:03 +0000 | [diff] [blame] | 1107 | if (MBB->pred_empty()) { | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1108 | RemoveDeadBlock(MBB); | 
|  | 1109 | MadeChange = true; | 
|  | 1110 | ++NumDeadBlocks; | 
|  | 1111 | } | 
|  | 1112 | } | 
|  | 1113 | return MadeChange; | 
|  | 1114 | } | 
|  | 1115 |  | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 1116 | // Blocks should be considered empty if they contain only debug info; | 
|  | 1117 | // else the debug info would affect codegen. | 
|  | 1118 | static bool IsEmptyBlock(MachineBasicBlock *MBB) { | 
| Benjamin Kramer | 6b56896 | 2015-06-23 14:47:29 +0000 | [diff] [blame] | 1119 | return MBB->getFirstNonDebugInstr() == MBB->end(); | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 1120 | } | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1121 |  | 
| Dale Johannesen | e9b361b | 2010-03-10 19:57:56 +0000 | [diff] [blame] | 1122 | // Blocks with only debug info and branches should be considered the same | 
|  | 1123 | // as blocks with only branches. | 
|  | 1124 | static bool IsBranchOnlyBlock(MachineBasicBlock *MBB) { | 
| Benjamin Kramer | 6b56896 | 2015-06-23 14:47:29 +0000 | [diff] [blame] | 1125 | MachineBasicBlock::iterator I = MBB->getFirstNonDebugInstr(); | 
|  | 1126 | assert(I != MBB->end() && "empty block!"); | 
|  | 1127 | return I->isBranch(); | 
| Dale Johannesen | e9b361b | 2010-03-10 19:57:56 +0000 | [diff] [blame] | 1128 | } | 
|  | 1129 |  | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1130 | /// IsBetterFallthrough - Return true if it would be clearly better to | 
|  | 1131 | /// fall-through to MBB1 than to fall through into MBB2.  This has to return | 
|  | 1132 | /// a strict ordering, returning true for both (MBB1,MBB2) and (MBB2,MBB1) will | 
|  | 1133 | /// result in infinite loops. | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1134 | static bool IsBetterFallthrough(MachineBasicBlock *MBB1, | 
| Chris Lattner | a98c679 | 2008-01-07 01:56:04 +0000 | [diff] [blame] | 1135 | MachineBasicBlock *MBB2) { | 
| Chris Lattner | 7acdc17f | 2006-11-18 21:30:35 +0000 | [diff] [blame] | 1136 | // Right now, we use a simple heuristic.  If MBB2 ends with a call, and | 
|  | 1137 | // MBB1 doesn't, we prefer to fall through into MBB1.  This allows us to | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1138 | // optimize branches that branch to either a return block or an assert block | 
|  | 1139 | // into a fallthrough to the return. | 
| Benjamin Kramer | 6b56896 | 2015-06-23 14:47:29 +0000 | [diff] [blame] | 1140 | MachineBasicBlock::iterator MBB1I = MBB1->getLastNonDebugInstr(); | 
|  | 1141 | MachineBasicBlock::iterator MBB2I = MBB2->getLastNonDebugInstr(); | 
|  | 1142 | if (MBB1I == MBB1->end() || MBB2I == MBB2->end()) | 
|  | 1143 | return false; | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1144 |  | 
| Christopher Lamb | d202e03 | 2007-12-10 07:24:06 +0000 | [diff] [blame] | 1145 | // If there is a clear successor ordering we make sure that one block | 
|  | 1146 | // will fall through to the next | 
|  | 1147 | if (MBB1->isSuccessor(MBB2)) return true; | 
|  | 1148 | if (MBB2->isSuccessor(MBB1)) return false; | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1149 |  | 
| Evan Cheng | 7f8e563 | 2011-12-07 07:15:52 +0000 | [diff] [blame] | 1150 | return MBB2I->isCall() && !MBB1I->isCall(); | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1151 | } | 
|  | 1152 |  | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1153 | /// getBranchDebugLoc - Find and return, if any, the DebugLoc of the branch | 
| Benjamin Kramer | 6b56896 | 2015-06-23 14:47:29 +0000 | [diff] [blame] | 1154 | /// instructions on the block. | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1155 | static DebugLoc getBranchDebugLoc(MachineBasicBlock &MBB) { | 
| Benjamin Kramer | 6b56896 | 2015-06-23 14:47:29 +0000 | [diff] [blame] | 1156 | MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr(); | 
|  | 1157 | if (I != MBB.end() && I->isBranch()) | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1158 | return I->getDebugLoc(); | 
|  | 1159 | return DebugLoc(); | 
|  | 1160 | } | 
|  | 1161 |  | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1162 | /// OptimizeBlock - Analyze and optimize control flow related to the specified | 
|  | 1163 | /// block.  This is never called on the entry block. | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1164 | bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) { | 
|  | 1165 | bool MadeChange = false; | 
| Dan Gohman | f4141f1 | 2009-11-11 18:18:34 +0000 | [diff] [blame] | 1166 | MachineFunction &MF = *MBB->getParent(); | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1167 | ReoptimizeBlock: | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1168 |  | 
| Chris Lattner | ceb51d8 | 2006-10-24 01:12:32 +0000 | [diff] [blame] | 1169 | MachineFunction::iterator FallThrough = MBB; | 
|  | 1170 | ++FallThrough; | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1171 |  | 
| Chris Lattner | 3e8e57c | 2006-10-13 20:43:10 +0000 | [diff] [blame] | 1172 | // If this block is empty, make everyone use its fall-through, not the block | 
| Dale Johannesen | 1a401e6 | 2007-05-31 21:54:00 +0000 | [diff] [blame] | 1173 | // explicitly.  Landing pads should not do this since the landing-pad table | 
| Dan Gohman | 6499790 | 2009-10-30 02:13:27 +0000 | [diff] [blame] | 1174 | // points to this block.  Blocks with their addresses taken shouldn't be | 
|  | 1175 | // optimized away. | 
| Reid Kleckner | 0e28823 | 2015-08-27 23:27:47 +0000 | [diff] [blame] | 1176 | if (IsEmptyBlock(MBB) && !MBB->isEHPad() && !MBB->hasAddressTaken()) { | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1177 | // Dead block?  Leave for cleanup later. | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1178 | if (MBB->pred_empty()) return MadeChange; | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1179 |  | 
| Dan Gohman | f4141f1 | 2009-11-11 18:18:34 +0000 | [diff] [blame] | 1180 | if (FallThrough == MF.end()) { | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 1181 | // TODO: Simplify preds to not branch here if possible! | 
| Reid Kleckner | 0e28823 | 2015-08-27 23:27:47 +0000 | [diff] [blame] | 1182 | } else if (FallThrough->isEHPad()) { | 
| Pete Cooper | 4d8d2ec | 2015-04-30 18:58:23 +0000 | [diff] [blame] | 1183 | // Don't rewrite to a landing pad fallthough.  That could lead to the case | 
|  | 1184 | // where a BB jumps to more than one landing pad. | 
|  | 1185 | // TODO: Is it ever worth rewriting predecessors which don't already | 
|  | 1186 | // jump to a landing pad, and so can safely jump to the fallthrough? | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 1187 | } else { | 
|  | 1188 | // Rewrite all predecessors of the old block to go to the fallthrough | 
|  | 1189 | // instead. | 
| Jim Laskey | 9df1a1d | 2007-02-22 16:39:03 +0000 | [diff] [blame] | 1190 | while (!MBB->pred_empty()) { | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1191 | MachineBasicBlock *Pred = *(MBB->pred_end()-1); | 
| Evan Cheng | df75785 | 2007-06-04 06:44:01 +0000 | [diff] [blame] | 1192 | Pred->ReplaceUsesOfBlockWith(MBB, FallThrough); | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1193 | } | 
| Chris Lattner | 56c9d25 | 2006-10-17 17:13:52 +0000 | [diff] [blame] | 1194 | // If MBB was the target of a jump table, update jump tables to go to the | 
|  | 1195 | // fallthrough instead. | 
| Chris Lattner | b6db2c6 | 2010-01-25 23:26:13 +0000 | [diff] [blame] | 1196 | if (MachineJumpTableInfo *MJTI = MF.getJumpTableInfo()) | 
|  | 1197 | MJTI->ReplaceMBBInJumpTables(MBB, FallThrough); | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1198 | MadeChange = true; | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 1199 | } | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1200 | return MadeChange; | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 1201 | } | 
|  | 1202 |  | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1203 | // Check to see if we can simplify the terminator of the block before this | 
|  | 1204 | // one. | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 1205 | MachineBasicBlock &PrevBB = *std::prev(MachineFunction::iterator(MBB)); | 
| Chris Lattner | bca3e29 | 2006-10-17 18:16:40 +0000 | [diff] [blame] | 1206 |  | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1207 | MachineBasicBlock *PriorTBB = nullptr, *PriorFBB = nullptr; | 
| Owen Anderson | 4f6bf04 | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 1208 | SmallVector<MachineOperand, 4> PriorCond; | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1209 | bool PriorUnAnalyzable = | 
| Evan Cheng | 64dfcac | 2009-02-09 07:14:22 +0000 | [diff] [blame] | 1210 | TII->AnalyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, true); | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1211 | if (!PriorUnAnalyzable) { | 
|  | 1212 | // If the CFG for the prior block has extra edges, remove them. | 
| Evan Cheng | 2afd702 | 2007-06-18 22:43:58 +0000 | [diff] [blame] | 1213 | MadeChange |= PrevBB.CorrectExtraCFGEdges(PriorTBB, PriorFBB, | 
|  | 1214 | !PriorCond.empty()); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1215 |  | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1216 | // If the previous branch is conditional and both conditions go to the same | 
| Chris Lattner | 3ca5218 | 2006-10-21 05:43:30 +0000 | [diff] [blame] | 1217 | // destination, remove the branch, replacing it with an unconditional one or | 
|  | 1218 | // a fall-through. | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1219 | if (PriorTBB && PriorTBB == PriorFBB) { | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1220 | DebugLoc dl = getBranchDebugLoc(PrevBB); | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1221 | TII->RemoveBranch(PrevBB); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1222 | PriorCond.clear(); | 
| Chris Lattner | ceb51d8 | 2006-10-24 01:12:32 +0000 | [diff] [blame] | 1223 | if (PriorTBB != MBB) | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1224 | TII->InsertBranch(PrevBB, PriorTBB, nullptr, PriorCond, dl); | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1225 | MadeChange = true; | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1226 | ++NumBranchOpts; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1227 | goto ReoptimizeBlock; | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1228 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1229 |  | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1230 | // If the previous block unconditionally falls through to this block and | 
|  | 1231 | // this block has no other predecessors, move the contents of this block | 
|  | 1232 | // into the prior block. This doesn't usually happen when SimplifyCFG | 
| Bob Wilson | 724d8a4 | 2009-11-17 17:40:31 +0000 | [diff] [blame] | 1233 | // has been used, but it can happen if tail merging splits a fall-through | 
|  | 1234 | // predecessor of a block. | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1235 | // This has to check PrevBB->succ_size() because EH edges are ignored by | 
|  | 1236 | // AnalyzeBranch. | 
|  | 1237 | if (PriorCond.empty() && !PriorTBB && MBB->pred_size() == 1 && | 
|  | 1238 | PrevBB.succ_size() == 1 && | 
| Reid Kleckner | 0e28823 | 2015-08-27 23:27:47 +0000 | [diff] [blame] | 1239 | !MBB->hasAddressTaken() && !MBB->isEHPad()) { | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 1240 | DEBUG(dbgs() << "\nMerging into block: " << PrevBB | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1241 | << "From MBB: " << *MBB); | 
| Devang Patel | cdec114 | 2011-05-26 21:49:28 +0000 | [diff] [blame] | 1242 | // Remove redundant DBG_VALUEs first. | 
| Devang Patel | 42ddaa1 | 2011-05-26 21:47:59 +0000 | [diff] [blame] | 1243 | if (PrevBB.begin() != PrevBB.end()) { | 
|  | 1244 | MachineBasicBlock::iterator PrevBBIter = PrevBB.end(); | 
|  | 1245 | --PrevBBIter; | 
|  | 1246 | MachineBasicBlock::iterator MBBIter = MBB->begin(); | 
| Andrew Trick | 9e76199 | 2012-02-08 21:22:43 +0000 | [diff] [blame] | 1247 | // Check if DBG_VALUE at the end of PrevBB is identical to the | 
| Devang Patel | cdec114 | 2011-05-26 21:49:28 +0000 | [diff] [blame] | 1248 | // DBG_VALUE at the beginning of MBB. | 
| Devang Patel | 42ddaa1 | 2011-05-26 21:47:59 +0000 | [diff] [blame] | 1249 | while (PrevBBIter != PrevBB.begin() && MBBIter != MBB->end() | 
|  | 1250 | && PrevBBIter->isDebugValue() && MBBIter->isDebugValue()) { | 
|  | 1251 | if (!MBBIter->isIdenticalTo(PrevBBIter)) | 
|  | 1252 | break; | 
|  | 1253 | MachineInstr *DuplicateDbg = MBBIter; | 
|  | 1254 | ++MBBIter; -- PrevBBIter; | 
|  | 1255 | DuplicateDbg->eraseFromParent(); | 
|  | 1256 | } | 
|  | 1257 | } | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1258 | PrevBB.splice(PrevBB.end(), MBB, MBB->begin(), MBB->end()); | 
| Chad Rosier | 5dfe6da | 2012-02-22 17:25:00 +0000 | [diff] [blame] | 1259 | PrevBB.removeSuccessor(PrevBB.succ_begin()); | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1260 | assert(PrevBB.succ_empty()); | 
|  | 1261 | PrevBB.transferSuccessors(MBB); | 
|  | 1262 | MadeChange = true; | 
|  | 1263 | return MadeChange; | 
|  | 1264 | } | 
| Bob Wilson | 699f5b9 | 2009-11-16 17:56:13 +0000 | [diff] [blame] | 1265 |  | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1266 | // If the previous branch *only* branches to *this* block (conditional or | 
|  | 1267 | // not) remove the branch. | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1268 | if (PriorTBB == MBB && !PriorFBB) { | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1269 | TII->RemoveBranch(PrevBB); | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1270 | MadeChange = true; | 
| Chris Lattner | 60c9d4d | 2006-10-21 00:47:49 +0000 | [diff] [blame] | 1271 | ++NumBranchOpts; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1272 | goto ReoptimizeBlock; | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1273 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1274 |  | 
| Chris Lattner | 3ca5218 | 2006-10-21 05:43:30 +0000 | [diff] [blame] | 1275 | // If the prior block branches somewhere else on the condition and here if | 
|  | 1276 | // the condition is false, remove the uncond second branch. | 
| Chris Lattner | ceb51d8 | 2006-10-24 01:12:32 +0000 | [diff] [blame] | 1277 | if (PriorFBB == MBB) { | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1278 | DebugLoc dl = getBranchDebugLoc(PrevBB); | 
| Chris Lattner | 3ca5218 | 2006-10-21 05:43:30 +0000 | [diff] [blame] | 1279 | TII->RemoveBranch(PrevBB); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1280 | TII->InsertBranch(PrevBB, PriorTBB, nullptr, PriorCond, dl); | 
| Chris Lattner | 3ca5218 | 2006-10-21 05:43:30 +0000 | [diff] [blame] | 1281 | MadeChange = true; | 
|  | 1282 | ++NumBranchOpts; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1283 | goto ReoptimizeBlock; | 
| Chris Lattner | 3ca5218 | 2006-10-21 05:43:30 +0000 | [diff] [blame] | 1284 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1285 |  | 
| Chris Lattner | 28f17f4 | 2006-10-21 05:54:00 +0000 | [diff] [blame] | 1286 | // If the prior block branches here on true and somewhere else on false, and | 
|  | 1287 | // if the branch condition is reversible, reverse the branch to create a | 
|  | 1288 | // fall-through. | 
| Chris Lattner | ceb51d8 | 2006-10-24 01:12:32 +0000 | [diff] [blame] | 1289 | if (PriorTBB == MBB) { | 
| Owen Anderson | 4f6bf04 | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 1290 | SmallVector<MachineOperand, 4> NewPriorCond(PriorCond); | 
| Chris Lattner | 28f17f4 | 2006-10-21 05:54:00 +0000 | [diff] [blame] | 1291 | if (!TII->ReverseBranchCondition(NewPriorCond)) { | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1292 | DebugLoc dl = getBranchDebugLoc(PrevBB); | 
| Chris Lattner | 28f17f4 | 2006-10-21 05:54:00 +0000 | [diff] [blame] | 1293 | TII->RemoveBranch(PrevBB); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1294 | TII->InsertBranch(PrevBB, PriorFBB, nullptr, NewPriorCond, dl); | 
| Chris Lattner | 28f17f4 | 2006-10-21 05:54:00 +0000 | [diff] [blame] | 1295 | MadeChange = true; | 
|  | 1296 | ++NumBranchOpts; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1297 | goto ReoptimizeBlock; | 
| Chris Lattner | 28f17f4 | 2006-10-21 05:54:00 +0000 | [diff] [blame] | 1298 | } | 
|  | 1299 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1300 |  | 
| Dan Gohman | ff97acd | 2009-10-22 00:03:58 +0000 | [diff] [blame] | 1301 | // If this block has no successors (e.g. it is a return block or ends with | 
|  | 1302 | // a call to a no-return function like abort or __cxa_throw) and if the pred | 
|  | 1303 | // falls through into this block, and if it would otherwise fall through | 
|  | 1304 | // into the block after this, move this block to the end of the function. | 
| Chris Lattner | 7acdc17f | 2006-11-18 21:30:35 +0000 | [diff] [blame] | 1305 | // | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1306 | // We consider it more likely that execution will stay in the function (e.g. | 
|  | 1307 | // due to loops) than it is to exit it.  This asserts in loops etc, moving | 
|  | 1308 | // the assert condition out of the loop body. | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1309 | if (MBB->succ_empty() && !PriorCond.empty() && !PriorFBB && | 
| Chris Lattner | 7acdc17f | 2006-11-18 21:30:35 +0000 | [diff] [blame] | 1310 | MachineFunction::iterator(PriorTBB) == FallThrough && | 
| Bob Wilson | 2d4ff12 | 2009-11-26 00:32:21 +0000 | [diff] [blame] | 1311 | !MBB->canFallThrough()) { | 
| Chris Lattner | 56ec81f | 2006-11-18 21:56:39 +0000 | [diff] [blame] | 1312 | bool DoTransform = true; | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1313 |  | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1314 | // We have to be careful that the succs of PredBB aren't both no-successor | 
|  | 1315 | // blocks.  If neither have successors and if PredBB is the second from | 
|  | 1316 | // last block in the function, we'd just keep swapping the two blocks for | 
|  | 1317 | // last.  Only do the swap if one is clearly better to fall through than | 
|  | 1318 | // the other. | 
| Dan Gohman | f4141f1 | 2009-11-11 18:18:34 +0000 | [diff] [blame] | 1319 | if (FallThrough == --MF.end() && | 
| Chris Lattner | a98c679 | 2008-01-07 01:56:04 +0000 | [diff] [blame] | 1320 | !IsBetterFallthrough(PriorTBB, MBB)) | 
| Chris Lattner | 56ec81f | 2006-11-18 21:56:39 +0000 | [diff] [blame] | 1321 | DoTransform = false; | 
|  | 1322 |  | 
| Chris Lattner | 56ec81f | 2006-11-18 21:56:39 +0000 | [diff] [blame] | 1323 | if (DoTransform) { | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1324 | // Reverse the branch so we will fall through on the previous true cond. | 
| Owen Anderson | 4f6bf04 | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 1325 | SmallVector<MachineOperand, 4> NewPriorCond(PriorCond); | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1326 | if (!TII->ReverseBranchCondition(NewPriorCond)) { | 
| David Greene | d60abbf | 2009-12-24 00:34:21 +0000 | [diff] [blame] | 1327 | DEBUG(dbgs() << "\nMoving MBB: " << *MBB | 
| Bill Wendling | c3f05e8 | 2009-08-22 20:03:00 +0000 | [diff] [blame] | 1328 | << "To make fallthrough to: " << *PriorTBB << "\n"); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1329 |  | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1330 | DebugLoc dl = getBranchDebugLoc(PrevBB); | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1331 | TII->RemoveBranch(PrevBB); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1332 | TII->InsertBranch(PrevBB, MBB, nullptr, NewPriorCond, dl); | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1333 |  | 
|  | 1334 | // Move this block to the end of the function. | 
| Dan Gohman | f4141f1 | 2009-11-11 18:18:34 +0000 | [diff] [blame] | 1335 | MBB->moveAfter(--MF.end()); | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1336 | MadeChange = true; | 
|  | 1337 | ++NumBranchOpts; | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1338 | return MadeChange; | 
| Chris Lattner | 47ce261 | 2006-11-18 20:47:54 +0000 | [diff] [blame] | 1339 | } | 
|  | 1340 | } | 
|  | 1341 | } | 
| Chris Lattner | 3218e0e | 2006-10-14 00:21:48 +0000 | [diff] [blame] | 1342 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1343 |  | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1344 | // Analyze the branch in the current block. | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1345 | MachineBasicBlock *CurTBB = nullptr, *CurFBB = nullptr; | 
| Owen Anderson | 4f6bf04 | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 1346 | SmallVector<MachineOperand, 4> CurCond; | 
| Evan Cheng | 64dfcac | 2009-02-09 07:14:22 +0000 | [diff] [blame] | 1347 | bool CurUnAnalyzable= TII->AnalyzeBranch(*MBB, CurTBB, CurFBB, CurCond, true); | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1348 | if (!CurUnAnalyzable) { | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1349 | // If the CFG for the prior block has extra edges, remove them. | 
| Evan Cheng | 2afd702 | 2007-06-18 22:43:58 +0000 | [diff] [blame] | 1350 | MadeChange |= MBB->CorrectExtraCFGEdges(CurTBB, CurFBB, !CurCond.empty()); | 
| Chris Lattner | 3e8e57c | 2006-10-13 20:43:10 +0000 | [diff] [blame] | 1351 |  | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1352 | // If this is a two-way branch, and the FBB branches to this block, reverse | 
| Chris Lattner | bf3b57f | 2006-11-08 01:03:21 +0000 | [diff] [blame] | 1353 | // the condition so the single-basic-block loop is faster.  Instead of: | 
|  | 1354 | //    Loop: xxx; jcc Out; jmp Loop | 
|  | 1355 | // we want: | 
|  | 1356 | //    Loop: xxx; jncc Loop; jmp Out | 
|  | 1357 | if (CurTBB && CurFBB && CurFBB == MBB && CurTBB != MBB) { | 
| Owen Anderson | 4f6bf04 | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 1358 | SmallVector<MachineOperand, 4> NewCond(CurCond); | 
| Chris Lattner | bf3b57f | 2006-11-08 01:03:21 +0000 | [diff] [blame] | 1359 | if (!TII->ReverseBranchCondition(NewCond)) { | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1360 | DebugLoc dl = getBranchDebugLoc(*MBB); | 
| Chris Lattner | bf3b57f | 2006-11-08 01:03:21 +0000 | [diff] [blame] | 1361 | TII->RemoveBranch(*MBB); | 
| Stuart Hastings | 0125b64 | 2010-06-17 22:43:56 +0000 | [diff] [blame] | 1362 | TII->InsertBranch(*MBB, CurFBB, CurTBB, NewCond, dl); | 
| Chris Lattner | bf3b57f | 2006-11-08 01:03:21 +0000 | [diff] [blame] | 1363 | MadeChange = true; | 
|  | 1364 | ++NumBranchOpts; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1365 | goto ReoptimizeBlock; | 
| Chris Lattner | bf3b57f | 2006-11-08 01:03:21 +0000 | [diff] [blame] | 1366 | } | 
|  | 1367 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1368 |  | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1369 | // If this branch is the only thing in its block, see if we can forward | 
|  | 1370 | // other blocks across it. | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1371 | if (CurTBB && CurCond.empty() && !CurFBB && | 
| Dale Johannesen | e9b361b | 2010-03-10 19:57:56 +0000 | [diff] [blame] | 1372 | IsBranchOnlyBlock(MBB) && CurTBB != MBB && | 
| Bob Wilson | 53a31ad | 2009-11-03 23:44:31 +0000 | [diff] [blame] | 1373 | !MBB->hasAddressTaken()) { | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1374 | DebugLoc dl = getBranchDebugLoc(*MBB); | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1375 | // This block may contain just an unconditional branch.  Because there can | 
|  | 1376 | // be 'non-branch terminators' in the block, try removing the branch and | 
|  | 1377 | // then seeing if the block is empty. | 
|  | 1378 | TII->RemoveBranch(*MBB); | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 1379 | // If the only things remaining in the block are debug info, remove these | 
|  | 1380 | // as well, so this will behave the same as an empty block in non-debug | 
|  | 1381 | // mode. | 
| Benjamin Kramer | 6b56896 | 2015-06-23 14:47:29 +0000 | [diff] [blame] | 1382 | if (IsEmptyBlock(MBB)) { | 
|  | 1383 | // Make the block empty, losing the debug info (we could probably | 
|  | 1384 | // improve this in some cases.) | 
|  | 1385 | MBB->erase(MBB->begin(), MBB->end()); | 
| Dale Johannesen | 5ebe0c1 | 2010-03-10 05:45:47 +0000 | [diff] [blame] | 1386 | } | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1387 | // If this block is just an unconditional branch to CurTBB, we can | 
|  | 1388 | // usually completely eliminate the block.  The only case we cannot | 
|  | 1389 | // completely eliminate the block is when the block before this one | 
|  | 1390 | // falls through into MBB and we can't understand the prior block's branch | 
|  | 1391 | // condition. | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1392 | if (MBB->empty()) { | 
| Dan Gohman | 047a767 | 2009-12-05 00:44:40 +0000 | [diff] [blame] | 1393 | bool PredHasNoFallThrough = !PrevBB.canFallThrough(); | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1394 | if (PredHasNoFallThrough || !PriorUnAnalyzable || | 
|  | 1395 | !PrevBB.isSuccessor(MBB)) { | 
|  | 1396 | // If the prior block falls through into us, turn it into an | 
|  | 1397 | // explicit branch to us to make updates simpler. | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1398 | if (!PredHasNoFallThrough && PrevBB.isSuccessor(MBB) && | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1399 | PriorTBB != MBB && PriorFBB != MBB) { | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1400 | if (!PriorTBB) { | 
|  | 1401 | assert(PriorCond.empty() && !PriorFBB && | 
| Chris Lattner | c07657f | 2006-10-28 18:34:47 +0000 | [diff] [blame] | 1402 | "Bad branch analysis"); | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1403 | PriorTBB = MBB; | 
|  | 1404 | } else { | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1405 | assert(!PriorFBB && "Machine CFG out of date!"); | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1406 | PriorFBB = MBB; | 
|  | 1407 | } | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1408 | DebugLoc pdl = getBranchDebugLoc(PrevBB); | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1409 | TII->RemoveBranch(PrevBB); | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1410 | TII->InsertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, pdl); | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1411 | } | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1412 |  | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1413 | // Iterate through all the predecessors, revectoring each in-turn. | 
| David Greene | 451d1a6 | 2007-06-29 02:45:24 +0000 | [diff] [blame] | 1414 | size_t PI = 0; | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1415 | bool DidChange = false; | 
|  | 1416 | bool HasBranchToSelf = false; | 
| David Greene | 451d1a6 | 2007-06-29 02:45:24 +0000 | [diff] [blame] | 1417 | while(PI != MBB->pred_size()) { | 
|  | 1418 | MachineBasicBlock *PMBB = *(MBB->pred_begin() + PI); | 
|  | 1419 | if (PMBB == MBB) { | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1420 | // If this block has an uncond branch to itself, leave it. | 
|  | 1421 | ++PI; | 
|  | 1422 | HasBranchToSelf = true; | 
|  | 1423 | } else { | 
|  | 1424 | DidChange = true; | 
| David Greene | 451d1a6 | 2007-06-29 02:45:24 +0000 | [diff] [blame] | 1425 | PMBB->ReplaceUsesOfBlockWith(MBB, CurTBB); | 
| Dale Johannesen | b571463 | 2009-05-11 21:54:13 +0000 | [diff] [blame] | 1426 | // If this change resulted in PMBB ending in a conditional | 
|  | 1427 | // branch where both conditions go to the same destination, | 
|  | 1428 | // change this to an unconditional branch (and fix the CFG). | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1429 | MachineBasicBlock *NewCurTBB = nullptr, *NewCurFBB = nullptr; | 
| Dale Johannesen | b571463 | 2009-05-11 21:54:13 +0000 | [diff] [blame] | 1430 | SmallVector<MachineOperand, 4> NewCurCond; | 
|  | 1431 | bool NewCurUnAnalyzable = TII->AnalyzeBranch(*PMBB, NewCurTBB, | 
|  | 1432 | NewCurFBB, NewCurCond, true); | 
|  | 1433 | if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) { | 
| Bill Wendling | 7c5dcb6 | 2012-03-07 08:49:42 +0000 | [diff] [blame] | 1434 | DebugLoc pdl = getBranchDebugLoc(*PMBB); | 
| Dale Johannesen | b571463 | 2009-05-11 21:54:13 +0000 | [diff] [blame] | 1435 | TII->RemoveBranch(*PMBB); | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1436 | NewCurCond.clear(); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1437 | TII->InsertBranch(*PMBB, NewCurTBB, nullptr, NewCurCond, pdl); | 
| Dale Johannesen | b571463 | 2009-05-11 21:54:13 +0000 | [diff] [blame] | 1438 | MadeChange = true; | 
|  | 1439 | ++NumBranchOpts; | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1440 | PMBB->CorrectExtraCFGEdges(NewCurTBB, nullptr, false); | 
| Dale Johannesen | b571463 | 2009-05-11 21:54:13 +0000 | [diff] [blame] | 1441 | } | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1442 | } | 
| Chris Lattner | 9f5a129 | 2006-10-21 06:11:43 +0000 | [diff] [blame] | 1443 | } | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1444 |  | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1445 | // Change any jumptables to go to the new MBB. | 
| Chris Lattner | b6db2c6 | 2010-01-25 23:26:13 +0000 | [diff] [blame] | 1446 | if (MachineJumpTableInfo *MJTI = MF.getJumpTableInfo()) | 
|  | 1447 | MJTI->ReplaceMBBInJumpTables(MBB, CurTBB); | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1448 | if (DidChange) { | 
|  | 1449 | ++NumBranchOpts; | 
|  | 1450 | MadeChange = true; | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1451 | if (!HasBranchToSelf) return MadeChange; | 
| Chris Lattner | af83838 | 2006-10-28 17:32:47 +0000 | [diff] [blame] | 1452 | } | 
| Chris Lattner | 9f5a129 | 2006-10-21 06:11:43 +0000 | [diff] [blame] | 1453 | } | 
| Chris Lattner | 3e8e57c | 2006-10-13 20:43:10 +0000 | [diff] [blame] | 1454 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1455 |  | 
| Chris Lattner | 4fe01c4 | 2006-10-21 05:08:28 +0000 | [diff] [blame] | 1456 | // Add the branch back if the block is more than just an uncond branch. | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1457 | TII->InsertBranch(*MBB, CurTBB, nullptr, CurCond, dl); | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 1458 | } | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1459 | } | 
|  | 1460 |  | 
| Bill Wendling | e8a525a | 2009-12-15 00:39:24 +0000 | [diff] [blame] | 1461 | // If the prior block doesn't fall through into this block, and if this | 
|  | 1462 | // block doesn't fall through into some other block, see if we can find a | 
|  | 1463 | // place to move this block where a fall-through will happen. | 
|  | 1464 | if (!PrevBB.canFallThrough()) { | 
|  | 1465 |  | 
| Bob Wilson | bd22f19 | 2009-11-17 17:06:18 +0000 | [diff] [blame] | 1466 | // Now we know that there was no fall-through into this block, check to | 
|  | 1467 | // see if it has a fall-through into its successor. | 
| Bob Wilson | 2d4ff12 | 2009-11-26 00:32:21 +0000 | [diff] [blame] | 1468 | bool CurFallsThru = MBB->canFallThrough(); | 
| Bob Wilson | bd22f19 | 2009-11-17 17:06:18 +0000 | [diff] [blame] | 1469 |  | 
| Reid Kleckner | 0e28823 | 2015-08-27 23:27:47 +0000 | [diff] [blame] | 1470 | if (!MBB->isEHPad()) { | 
| Jim Laskey | 2dc5245 | 2007-02-21 22:42:20 +0000 | [diff] [blame] | 1471 | // Check all the predecessors of this block.  If one of them has no fall | 
|  | 1472 | // throughs, move this block right after it. | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1473 | for (MachineBasicBlock *PredBB : MBB->predecessors()) { | 
| Jim Laskey | 2dc5245 | 2007-02-21 22:42:20 +0000 | [diff] [blame] | 1474 | // Analyze the branch at the end of the pred. | 
| Bill Wendling | e8a525a | 2009-12-15 00:39:24 +0000 | [diff] [blame] | 1475 | MachineFunction::iterator PredFallthrough = PredBB; ++PredFallthrough; | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1476 | MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1477 | SmallVector<MachineOperand, 4> PredCond; | 
| Bill Wendling | e8a525a | 2009-12-15 00:39:24 +0000 | [diff] [blame] | 1478 | if (PredBB != MBB && !PredBB->canFallThrough() && | 
|  | 1479 | !TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true) | 
| Dale Johannesen | 6e16d09 | 2007-05-10 01:01:49 +0000 | [diff] [blame] | 1480 | && (!CurFallsThru || !CurTBB || !CurFBB) | 
| Jim Laskey | 2dc5245 | 2007-02-21 22:42:20 +0000 | [diff] [blame] | 1481 | && (!CurFallsThru || MBB->getNumber() >= PredBB->getNumber())) { | 
| Bill Wendling | e8a525a | 2009-12-15 00:39:24 +0000 | [diff] [blame] | 1482 | // If the current block doesn't fall through, just move it. | 
|  | 1483 | // If the current block can fall through and does not end with a | 
|  | 1484 | // conditional branch, we need to append an unconditional jump to | 
|  | 1485 | // the (current) next block.  To avoid a possible compile-time | 
|  | 1486 | // infinite loop, move blocks only backward in this case. | 
|  | 1487 | // Also, if there are already 2 branches here, we cannot add a third; | 
|  | 1488 | // this means we have the case | 
|  | 1489 | // Bcc next | 
|  | 1490 | // B elsewhere | 
|  | 1491 | // next: | 
| Jim Laskey | 2dc5245 | 2007-02-21 22:42:20 +0000 | [diff] [blame] | 1492 | if (CurFallsThru) { | 
| Benjamin Kramer | b6d0bd4 | 2014-03-02 12:27:27 +0000 | [diff] [blame] | 1493 | MachineBasicBlock *NextBB = | 
|  | 1494 | std::next(MachineFunction::iterator(MBB)); | 
| Jim Laskey | 2dc5245 | 2007-02-21 22:42:20 +0000 | [diff] [blame] | 1495 | CurCond.clear(); | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1496 | TII->InsertBranch(*MBB, NextBB, nullptr, CurCond, DebugLoc()); | 
| Jim Laskey | 2dc5245 | 2007-02-21 22:42:20 +0000 | [diff] [blame] | 1497 | } | 
|  | 1498 | MBB->moveAfter(PredBB); | 
|  | 1499 | MadeChange = true; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1500 | goto ReoptimizeBlock; | 
| Chris Lattner | ceb51d8 | 2006-10-24 01:12:32 +0000 | [diff] [blame] | 1501 | } | 
|  | 1502 | } | 
| Dale Johannesen | 12920dd | 2007-02-17 00:44:34 +0000 | [diff] [blame] | 1503 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1504 |  | 
| Dale Johannesen | 12920dd | 2007-02-17 00:44:34 +0000 | [diff] [blame] | 1505 | if (!CurFallsThru) { | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1506 | // Check all successors to see if we can move this block before it. | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1507 | for (MachineBasicBlock *SuccBB : MBB->successors()) { | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1508 | // Analyze the branch at the end of the block before the succ. | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1509 | MachineFunction::iterator SuccPrev = SuccBB; --SuccPrev; | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1510 |  | 
| Chris Lattner | 4dbbace | 2007-04-30 23:35:00 +0000 | [diff] [blame] | 1511 | // If this block doesn't already fall-through to that successor, and if | 
|  | 1512 | // the succ doesn't already have a block that can fall through into it, | 
|  | 1513 | // and if the successor isn't an EH destination, we can arrange for the | 
|  | 1514 | // fallthrough to happen. | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1515 | if (SuccBB != MBB && &*SuccPrev != MBB && | 
| Bob Wilson | 2d4ff12 | 2009-11-26 00:32:21 +0000 | [diff] [blame] | 1516 | !SuccPrev->canFallThrough() && !CurUnAnalyzable && | 
| Reid Kleckner | 0e28823 | 2015-08-27 23:27:47 +0000 | [diff] [blame] | 1517 | !SuccBB->isEHPad()) { | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1518 | MBB->moveBefore(SuccBB); | 
|  | 1519 | MadeChange = true; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1520 | goto ReoptimizeBlock; | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1521 | } | 
|  | 1522 | } | 
| Dan Gohman | c86b5a1 | 2009-11-11 18:38:14 +0000 | [diff] [blame] | 1523 |  | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1524 | // Okay, there is no really great place to put this block.  If, however, | 
|  | 1525 | // the block before this one would be a fall-through if this block were | 
|  | 1526 | // removed, move this block to the end of the function. | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1527 | MachineBasicBlock *PrevTBB = nullptr, *PrevFBB = nullptr; | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1528 | SmallVector<MachineOperand, 4> PrevCond; | 
| Dan Gohman | f4141f1 | 2009-11-11 18:18:34 +0000 | [diff] [blame] | 1529 | if (FallThrough != MF.end() && | 
| Dan Gohman | 64b5d0f | 2009-11-11 19:48:59 +0000 | [diff] [blame] | 1530 | !TII->AnalyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond, true) && | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1531 | PrevBB.isSuccessor(FallThrough)) { | 
| Dan Gohman | f4141f1 | 2009-11-11 18:18:34 +0000 | [diff] [blame] | 1532 | MBB->moveAfter(--MF.end()); | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1533 | MadeChange = true; | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1534 | return MadeChange; | 
| Chris Lattner | 504eeda | 2006-10-29 21:05:41 +0000 | [diff] [blame] | 1535 | } | 
| Chris Lattner | ceb51d8 | 2006-10-24 01:12:32 +0000 | [diff] [blame] | 1536 | } | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 1537 | } | 
| Evan Cheng | 3d2fce0 | 2009-09-04 07:47:40 +0000 | [diff] [blame] | 1538 |  | 
|  | 1539 | return MadeChange; | 
| Chris Lattner | 25e48dd | 2004-07-31 10:01:27 +0000 | [diff] [blame] | 1540 | } | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1541 |  | 
|  | 1542 | //===----------------------------------------------------------------------===// | 
|  | 1543 | //  Hoist Common Code | 
|  | 1544 | //===----------------------------------------------------------------------===// | 
|  | 1545 |  | 
|  | 1546 | /// HoistCommonCode - Hoist common instruction sequences at the start of basic | 
|  | 1547 | /// blocks to their common predecessor. | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1548 | bool BranchFolder::HoistCommonCode(MachineFunction &MF) { | 
|  | 1549 | bool MadeChange = false; | 
|  | 1550 | for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ) { | 
|  | 1551 | MachineBasicBlock *MBB = I++; | 
|  | 1552 | MadeChange |= HoistCommonCodeInSuccs(MBB); | 
|  | 1553 | } | 
|  | 1554 |  | 
|  | 1555 | return MadeChange; | 
|  | 1556 | } | 
|  | 1557 |  | 
|  | 1558 | /// findFalseBlock - BB has a fallthrough. Find its 'false' successor given | 
|  | 1559 | /// its 'true' successor. | 
|  | 1560 | static MachineBasicBlock *findFalseBlock(MachineBasicBlock *BB, | 
|  | 1561 | MachineBasicBlock *TrueBB) { | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1562 | for (MachineBasicBlock *SuccBB : BB->successors()) | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1563 | if (SuccBB != TrueBB) | 
|  | 1564 | return SuccBB; | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1565 | return nullptr; | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1566 | } | 
|  | 1567 |  | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1568 | template <class Container> | 
|  | 1569 | static void addRegAndItsAliases(unsigned Reg, const TargetRegisterInfo *TRI, | 
|  | 1570 | Container &Set) { | 
|  | 1571 | if (TargetRegisterInfo::isPhysicalRegister(Reg)) { | 
|  | 1572 | for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) | 
|  | 1573 | Set.insert(*AI); | 
|  | 1574 | } else { | 
|  | 1575 | Set.insert(Reg); | 
|  | 1576 | } | 
|  | 1577 | } | 
|  | 1578 |  | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1579 | /// findHoistingInsertPosAndDeps - Find the location to move common instructions | 
| Benjamin Kramer | bde9176 | 2012-06-02 10:20:22 +0000 | [diff] [blame] | 1580 | /// in successors to. The location is usually just before the terminator, | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1581 | /// however if the terminator is a conditional branch and its previous | 
|  | 1582 | /// instruction is the flag setting instruction, the previous instruction is | 
|  | 1583 | /// the preferred location. This function also gathers uses and defs of the | 
|  | 1584 | /// instructions from the insertion point to the end of the block. The data is | 
|  | 1585 | /// used by HoistCommonCodeInSuccs to ensure safety. | 
|  | 1586 | static | 
|  | 1587 | MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB, | 
|  | 1588 | const TargetInstrInfo *TII, | 
|  | 1589 | const TargetRegisterInfo *TRI, | 
|  | 1590 | SmallSet<unsigned,4> &Uses, | 
|  | 1591 | SmallSet<unsigned,4> &Defs) { | 
|  | 1592 | MachineBasicBlock::iterator Loc = MBB->getFirstTerminator(); | 
|  | 1593 | if (!TII->isUnpredicatedTerminator(Loc)) | 
|  | 1594 | return MBB->end(); | 
|  | 1595 |  | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1596 | for (const MachineOperand &MO : Loc->operands()) { | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1597 | if (!MO.isReg()) | 
|  | 1598 | continue; | 
|  | 1599 | unsigned Reg = MO.getReg(); | 
|  | 1600 | if (!Reg) | 
|  | 1601 | continue; | 
|  | 1602 | if (MO.isUse()) { | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1603 | addRegAndItsAliases(Reg, TRI, Uses); | 
| Sasa Stankovic | 56c12e6 | 2014-06-05 13:42:48 +0000 | [diff] [blame] | 1604 | } else { | 
|  | 1605 | if (!MO.isDead()) | 
|  | 1606 | // Don't try to hoist code in the rare case the terminator defines a | 
|  | 1607 | // register that is later used. | 
|  | 1608 | return MBB->end(); | 
|  | 1609 |  | 
|  | 1610 | // If the terminator defines a register, make sure we don't hoist | 
|  | 1611 | // the instruction whose def might be clobbered by the terminator. | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1612 | addRegAndItsAliases(Reg, TRI, Defs); | 
| Sasa Stankovic | 56c12e6 | 2014-06-05 13:42:48 +0000 | [diff] [blame] | 1613 | } | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1614 | } | 
|  | 1615 |  | 
|  | 1616 | if (Uses.empty()) | 
|  | 1617 | return Loc; | 
|  | 1618 | if (Loc == MBB->begin()) | 
|  | 1619 | return MBB->end(); | 
|  | 1620 |  | 
|  | 1621 | // The terminator is probably a conditional branch, try not to separate the | 
|  | 1622 | // branch from condition setting instruction. | 
|  | 1623 | MachineBasicBlock::iterator PI = Loc; | 
|  | 1624 | --PI; | 
| Ekaterina Romanova | b9aea93 | 2014-03-26 22:15:28 +0000 | [diff] [blame] | 1625 | while (PI != MBB->begin() && PI->isDebugValue()) | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1626 | --PI; | 
|  | 1627 |  | 
|  | 1628 | bool IsDef = false; | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1629 | for (const MachineOperand &MO : PI->operands()) { | 
| Jakob Stoklund Olesen | e9e30d0 | 2012-02-15 23:42:54 +0000 | [diff] [blame] | 1630 | // If PI has a regmask operand, it is probably a call. Separate away. | 
|  | 1631 | if (MO.isRegMask()) | 
|  | 1632 | return Loc; | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1633 | if (!MO.isReg() || MO.isUse()) | 
|  | 1634 | continue; | 
|  | 1635 | unsigned Reg = MO.getReg(); | 
|  | 1636 | if (!Reg) | 
|  | 1637 | continue; | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1638 | if (Uses.count(Reg)) { | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1639 | IsDef = true; | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1640 | break; | 
|  | 1641 | } | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1642 | } | 
|  | 1643 | if (!IsDef) | 
|  | 1644 | // The condition setting instruction is not just before the conditional | 
|  | 1645 | // branch. | 
|  | 1646 | return Loc; | 
|  | 1647 |  | 
|  | 1648 | // Be conservative, don't insert instruction above something that may have | 
|  | 1649 | // side-effects. And since it's potentially bad to separate flag setting | 
|  | 1650 | // instruction from the conditional branch, just abort the optimization | 
|  | 1651 | // completely. | 
|  | 1652 | // Also avoid moving code above predicated instruction since it's hard to | 
|  | 1653 | // reason about register liveness with predicated instruction. | 
|  | 1654 | bool DontMoveAcrossStore = true; | 
| Matthias Braun | 07066cc | 2015-05-19 21:22:20 +0000 | [diff] [blame] | 1655 | if (!PI->isSafeToMove(nullptr, DontMoveAcrossStore) || TII->isPredicated(PI)) | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1656 | return MBB->end(); | 
|  | 1657 |  | 
|  | 1658 |  | 
|  | 1659 | // Find out what registers are live. Note this routine is ignoring other live | 
|  | 1660 | // registers which are only used by instructions in successor blocks. | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1661 | for (const MachineOperand &MO : PI->operands()) { | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1662 | if (!MO.isReg()) | 
|  | 1663 | continue; | 
|  | 1664 | unsigned Reg = MO.getReg(); | 
|  | 1665 | if (!Reg) | 
|  | 1666 | continue; | 
|  | 1667 | if (MO.isUse()) { | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1668 | addRegAndItsAliases(Reg, TRI, Uses); | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1669 | } else { | 
| Benjamin Kramer | f29db27 | 2012-08-22 15:37:57 +0000 | [diff] [blame] | 1670 | if (Uses.erase(Reg)) { | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1671 | if (TargetRegisterInfo::isPhysicalRegister(Reg)) { | 
|  | 1672 | for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) | 
|  | 1673 | Uses.erase(*SubRegs); // Use sub-registers to be conservative | 
|  | 1674 | } | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1675 | } | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1676 | addRegAndItsAliases(Reg, TRI, Defs); | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1677 | } | 
|  | 1678 | } | 
|  | 1679 |  | 
|  | 1680 | return PI; | 
|  | 1681 | } | 
|  | 1682 |  | 
|  | 1683 | /// HoistCommonCodeInSuccs - If the successors of MBB has common instruction | 
|  | 1684 | /// sequence at the start of the function, move the instructions before MBB | 
|  | 1685 | /// terminator if it's legal. | 
|  | 1686 | bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) { | 
| Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 1687 | MachineBasicBlock *TBB = nullptr, *FBB = nullptr; | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1688 | SmallVector<MachineOperand, 4> Cond; | 
|  | 1689 | if (TII->AnalyzeBranch(*MBB, TBB, FBB, Cond, true) || !TBB || Cond.empty()) | 
|  | 1690 | return false; | 
|  | 1691 |  | 
|  | 1692 | if (!FBB) FBB = findFalseBlock(MBB, TBB); | 
|  | 1693 | if (!FBB) | 
|  | 1694 | // Malformed bcc? True and false blocks are the same? | 
|  | 1695 | return false; | 
|  | 1696 |  | 
|  | 1697 | // Restrict the optimization to cases where MBB is the only predecessor, | 
|  | 1698 | // it is an obvious win. | 
|  | 1699 | if (TBB->pred_size() > 1 || FBB->pred_size() > 1) | 
|  | 1700 | return false; | 
|  | 1701 |  | 
|  | 1702 | // Find a suitable position to hoist the common instructions to. Also figure | 
|  | 1703 | // out which registers are used or defined by instructions from the insertion | 
|  | 1704 | // point to the end of the block. | 
|  | 1705 | SmallSet<unsigned, 4> Uses, Defs; | 
|  | 1706 | MachineBasicBlock::iterator Loc = | 
|  | 1707 | findHoistingInsertPosAndDeps(MBB, TII, TRI, Uses, Defs); | 
|  | 1708 | if (Loc == MBB->end()) | 
|  | 1709 | return false; | 
|  | 1710 |  | 
|  | 1711 | bool HasDups = false; | 
| Evan Cheng | 43054e6 | 2011-05-12 20:30:01 +0000 | [diff] [blame] | 1712 | SmallVector<unsigned, 4> LocalDefs; | 
|  | 1713 | SmallSet<unsigned, 4> LocalDefsSet; | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1714 | MachineBasicBlock::iterator TIB = TBB->begin(); | 
|  | 1715 | MachineBasicBlock::iterator FIB = FBB->begin(); | 
|  | 1716 | MachineBasicBlock::iterator TIE = TBB->end(); | 
|  | 1717 | MachineBasicBlock::iterator FIE = FBB->end(); | 
|  | 1718 | while (TIB != TIE && FIB != FIE) { | 
|  | 1719 | // Skip dbg_value instructions. These do not count. | 
|  | 1720 | if (TIB->isDebugValue()) { | 
|  | 1721 | while (TIB != TIE && TIB->isDebugValue()) | 
|  | 1722 | ++TIB; | 
|  | 1723 | if (TIB == TIE) | 
|  | 1724 | break; | 
|  | 1725 | } | 
|  | 1726 | if (FIB->isDebugValue()) { | 
|  | 1727 | while (FIB != FIE && FIB->isDebugValue()) | 
|  | 1728 | ++FIB; | 
|  | 1729 | if (FIB == FIE) | 
|  | 1730 | break; | 
|  | 1731 | } | 
|  | 1732 | if (!TIB->isIdenticalTo(FIB, MachineInstr::CheckKillDead)) | 
|  | 1733 | break; | 
|  | 1734 |  | 
|  | 1735 | if (TII->isPredicated(TIB)) | 
|  | 1736 | // Hard to reason about register liveness with predicated instruction. | 
|  | 1737 | break; | 
|  | 1738 |  | 
|  | 1739 | bool IsSafe = true; | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1740 | for (MachineOperand &MO : TIB->operands()) { | 
| Jakob Stoklund Olesen | e9e30d0 | 2012-02-15 23:42:54 +0000 | [diff] [blame] | 1741 | // Don't attempt to hoist instructions with register masks. | 
|  | 1742 | if (MO.isRegMask()) { | 
|  | 1743 | IsSafe = false; | 
|  | 1744 | break; | 
|  | 1745 | } | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1746 | if (!MO.isReg()) | 
|  | 1747 | continue; | 
|  | 1748 | unsigned Reg = MO.getReg(); | 
|  | 1749 | if (!Reg) | 
|  | 1750 | continue; | 
|  | 1751 | if (MO.isDef()) { | 
|  | 1752 | if (Uses.count(Reg)) { | 
|  | 1753 | // Avoid clobbering a register that's used by the instruction at | 
|  | 1754 | // the point of insertion. | 
|  | 1755 | IsSafe = false; | 
|  | 1756 | break; | 
|  | 1757 | } | 
|  | 1758 |  | 
|  | 1759 | if (Defs.count(Reg) && !MO.isDead()) { | 
|  | 1760 | // Don't hoist the instruction if the def would be clobber by the | 
|  | 1761 | // instruction at the point insertion. FIXME: This is overly | 
|  | 1762 | // conservative. It should be possible to hoist the instructions | 
|  | 1763 | // in BB2 in the following example: | 
|  | 1764 | // BB1: | 
|  | 1765 | // r1, eflag = op1 r2, r3 | 
|  | 1766 | // brcc eflag | 
|  | 1767 | // | 
|  | 1768 | // BB2: | 
|  | 1769 | // r1 = op2, ... | 
|  | 1770 | //    = op3, r1<kill> | 
|  | 1771 | IsSafe = false; | 
|  | 1772 | break; | 
|  | 1773 | } | 
| Evan Cheng | 43054e6 | 2011-05-12 20:30:01 +0000 | [diff] [blame] | 1774 | } else if (!LocalDefsSet.count(Reg)) { | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1775 | if (Defs.count(Reg)) { | 
|  | 1776 | // Use is defined by the instruction at the point of insertion. | 
|  | 1777 | IsSafe = false; | 
|  | 1778 | break; | 
|  | 1779 | } | 
| Evan Cheng | 5c03a6b | 2012-01-12 20:31:24 +0000 | [diff] [blame] | 1780 |  | 
|  | 1781 | if (MO.isKill() && Uses.count(Reg)) | 
|  | 1782 | // Kills a register that's read by the instruction at the point of | 
|  | 1783 | // insertion. Remove the kill marker. | 
|  | 1784 | MO.setIsKill(false); | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1785 | } | 
|  | 1786 | } | 
|  | 1787 | if (!IsSafe) | 
|  | 1788 | break; | 
|  | 1789 |  | 
|  | 1790 | bool DontMoveAcrossStore = true; | 
| Matthias Braun | 07066cc | 2015-05-19 21:22:20 +0000 | [diff] [blame] | 1791 | if (!TIB->isSafeToMove(nullptr, DontMoveAcrossStore)) | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1792 | break; | 
|  | 1793 |  | 
| Jakob Stoklund Olesen | d633abe | 2011-08-05 18:47:07 +0000 | [diff] [blame] | 1794 | // Remove kills from LocalDefsSet, these registers had short live ranges. | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1795 | for (const MachineOperand &MO : TIB->operands()) { | 
| Jakob Stoklund Olesen | d633abe | 2011-08-05 18:47:07 +0000 | [diff] [blame] | 1796 | if (!MO.isReg() || !MO.isUse() || !MO.isKill()) | 
|  | 1797 | continue; | 
|  | 1798 | unsigned Reg = MO.getReg(); | 
|  | 1799 | if (!Reg || !LocalDefsSet.count(Reg)) | 
|  | 1800 | continue; | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1801 | if (TargetRegisterInfo::isPhysicalRegister(Reg)) { | 
|  | 1802 | for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) | 
|  | 1803 | LocalDefsSet.erase(*AI); | 
|  | 1804 | } else { | 
|  | 1805 | LocalDefsSet.erase(Reg); | 
|  | 1806 | } | 
| Jakob Stoklund Olesen | d633abe | 2011-08-05 18:47:07 +0000 | [diff] [blame] | 1807 | } | 
|  | 1808 |  | 
| Evan Cheng | 43054e6 | 2011-05-12 20:30:01 +0000 | [diff] [blame] | 1809 | // Track local defs so we can update liveins. | 
| Craig Topper | 5db36df | 2015-09-16 03:52:35 +0000 | [diff] [blame] | 1810 | for (const MachineOperand &MO : TIB->operands()) { | 
| Jakob Stoklund Olesen | d633abe | 2011-08-05 18:47:07 +0000 | [diff] [blame] | 1811 | if (!MO.isReg() || !MO.isDef() || MO.isDead()) | 
| Evan Cheng | 43054e6 | 2011-05-12 20:30:01 +0000 | [diff] [blame] | 1812 | continue; | 
|  | 1813 | unsigned Reg = MO.getReg(); | 
|  | 1814 | if (!Reg) | 
|  | 1815 | continue; | 
| Jakob Stoklund Olesen | d633abe | 2011-08-05 18:47:07 +0000 | [diff] [blame] | 1816 | LocalDefs.push_back(Reg); | 
| Jingyue Wu | 3a04dc6 | 2015-07-29 18:59:09 +0000 | [diff] [blame] | 1817 | addRegAndItsAliases(Reg, TRI, LocalDefsSet); | 
| Evan Cheng | 43054e6 | 2011-05-12 20:30:01 +0000 | [diff] [blame] | 1818 | } | 
|  | 1819 |  | 
| Chad Rosier | 5dfe6da | 2012-02-22 17:25:00 +0000 | [diff] [blame] | 1820 | HasDups = true; | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1821 | ++TIB; | 
|  | 1822 | ++FIB; | 
|  | 1823 | } | 
|  | 1824 |  | 
|  | 1825 | if (!HasDups) | 
|  | 1826 | return false; | 
|  | 1827 |  | 
|  | 1828 | MBB->splice(Loc, TBB, TBB->begin(), TIB); | 
|  | 1829 | FBB->erase(FBB->begin(), FIB); | 
| Evan Cheng | 43054e6 | 2011-05-12 20:30:01 +0000 | [diff] [blame] | 1830 |  | 
|  | 1831 | // Update livein's. | 
|  | 1832 | for (unsigned i = 0, e = LocalDefs.size(); i != e; ++i) { | 
|  | 1833 | unsigned Def = LocalDefs[i]; | 
|  | 1834 | if (LocalDefsSet.count(Def)) { | 
|  | 1835 | TBB->addLiveIn(Def); | 
|  | 1836 | FBB->addLiveIn(Def); | 
|  | 1837 | } | 
|  | 1838 | } | 
|  | 1839 |  | 
| Evan Cheng | cfdf339 | 2011-05-12 00:56:58 +0000 | [diff] [blame] | 1840 | ++NumHoist; | 
|  | 1841 | return true; | 
|  | 1842 | } |