diff options
Diffstat (limited to 'llvm/lib/CodeGen/BranchFolding.cpp')
-rw-r--r-- | llvm/lib/CodeGen/BranchFolding.cpp | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index 022689c..c6d5aa3 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -1083,8 +1083,9 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) { if (!UniquePreds.insert(PBB).second) continue; - // Skip blocks which may jump to a landing pad. Can't tail merge these. - if (PBB->hasEHPadSuccessor()) + // Skip blocks which may jump to a landing pad or jump from an asm blob. + // Can't tail merge these. + if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr()) continue; // After block placement, only consider predecessors that belong to the @@ -1665,13 +1666,15 @@ ReoptimizeBlock: if (!MBB->isEHPad()) { // Check all the predecessors of this block. If one of them has no fall - // throughs, move this block right after it. + // throughs, and analyzeBranch thinks it _could_ fallthrough to this + // block, move this block right after it. for (MachineBasicBlock *PredBB : MBB->predecessors()) { // Analyze the branch at the end of the pred. MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr; SmallVector<MachineOperand, 4> PredCond; if (PredBB != MBB && !PredBB->canFallThrough() && !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true) && + (PredTBB == MBB || PredFBB == MBB) && (!CurFallsThru || !CurTBB || !CurFBB) && (!CurFallsThru || MBB->getNumber() >= PredBB->getNumber())) { // If the current block doesn't fall through, just move it. @@ -1697,21 +1700,24 @@ ReoptimizeBlock: } if (!CurFallsThru) { - // Check all successors to see if we can move this block before it. - for (MachineBasicBlock *SuccBB : MBB->successors()) { - // Analyze the branch at the end of the block before the succ. - MachineFunction::iterator SuccPrev = --SuccBB->getIterator(); - - // If this block doesn't already fall-through to that successor, and if - // the succ doesn't already have a block that can fall through into it, - // and if the successor isn't an EH destination, we can arrange for the - // fallthrough to happen. - if (SuccBB != MBB && &*SuccPrev != MBB && - !SuccPrev->canFallThrough() && !CurUnAnalyzable && - !SuccBB->isEHPad()) { - MBB->moveBefore(SuccBB); - MadeChange = true; - goto ReoptimizeBlock; + // Check analyzable branch-successors to see if we can move this block + // before one. + if (!CurUnAnalyzable) { + for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) { + if (!SuccBB) + continue; + // Analyze the branch at the end of the block before the succ. + MachineFunction::iterator SuccPrev = --SuccBB->getIterator(); + + // If this block doesn't already fall-through to that successor, and + // if the succ doesn't already have a block that can fall through into + // it, we can arrange for the fallthrough to happen. + if (SuccBB != MBB && &*SuccPrev != MBB && + !SuccPrev->canFallThrough()) { + MBB->moveBefore(SuccBB); + MadeChange = true; + goto ReoptimizeBlock; + } } } |