diff options
author | James Y Knight <jyknight@google.com> | 2020-05-15 23:43:30 -0400 |
---|---|---|
committer | James Y Knight <jyknight@google.com> | 2020-07-01 12:51:50 -0400 |
commit | 4b0aa5724feaa89a9538dcab97e018110b0e4bc3 (patch) | |
tree | f6523c3c1909c3189112569059189e639d9ea720 /llvm/lib/CodeGen/BranchFolding.cpp | |
parent | 78c69a00a4cff786e0ef13c895d0db309d6b3f42 (diff) | |
download | llvm-4b0aa5724feaa89a9538dcab97e018110b0e4bc3.zip llvm-4b0aa5724feaa89a9538dcab97e018110b0e4bc3.tar.gz llvm-4b0aa5724feaa89a9538dcab97e018110b0e4bc3.tar.bz2 |
Change the INLINEASM_BR MachineInstr to be a non-terminating instruction.
Before this instruction supported output values, it fit fairly
naturally as a terminator. However, being a terminator while also
supporting outputs causes some trouble, as the physreg->vreg COPY
operations cannot be in the same block.
Modeling it as a non-terminator allows it to be handled the same way
as invoke is handled already.
Most of the changes here were created by auditing all the existing
users of MachineBasicBlock::isEHPad() and
MachineBasicBlock::hasEHPadSuccessor(), and adding calls to
isInlineAsmBrIndirectTarget or mayHaveInlineAsmBr, as appropriate.
Reviewed By: nickdesaulniers, void
Differential Revision: https://reviews.llvm.org/D79794
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; + } } } |