[Openmp-commits] [clang-tools-extra] [lldb] [clang] [llvm] [flang] [compiler-rt] [libunwind] [openmp] [mlir] [lld] [BranchFolding] Fix missing predecessors of landing-pad (PR #77608)
via Openmp-commits
openmp-commits at lists.llvm.org
Thu Jan 11 02:28:08 PST 2024
================
@@ -1363,6 +1363,14 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
MachineBasicBlock *Pred = *(MBB->pred_end()-1);
Pred->ReplaceUsesOfBlockWith(MBB, &*FallThrough);
}
+ // Add rest successors of MBB to successors of FallThrough. Those
+ // successors are not directly reachable via MBB, so it should be
+ // landing-pad.
+ for (auto SI = MBB->succ_begin(), SE = MBB->succ_end(); SI != SE; ++SI)
+ if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
+ assert((*SI)->isEHPad() && "Bad CFG");
+ FallThrough->copySuccessor(MBB, SI);
+ }
----------------
HaohaiWen wrote:
> Why can't put the code in ReplaceUsesOfBlockWith? The isSuccessor can make sure the same BB won't add again;
It's possible MBB don't have any predecessor. e.g. The function entry BB is invoke llvm.seh.scope.begin. In such case, we still need to add bb.4 as successor of bb.3 before removing MBB.
```
bb.2:
successors: %bb.3(0x7ffff800), %bb.4(0x00000800); %bb.3(100.00%), %bb.4(0.00%)
bb.3:
; predecessors: %bb.2
successors: %bb.6(0x80000000); %bb.6(100.00%)
JMP_1 %bb.6
bb.4 (machine-block-address-taken, landing-pad, ehfunclet-entry):
; predecessors: %bb.2
successors: %bb.5(0x80000000); %bb.5(100.00%)
CLEANUPRET
bb.5 (landing-pad, ehfunclet-entry):
; predecessors: %bb.4
CLEANUPRET
bb.6:
; predecessors: %bb.3
RET 0
# End machine code for function main.
```
> Is it possible the added BB might be removed latter. We don't have a mechanism to remove the dead successors. Would it be a problem if we keep an edge to dead BBs?
No, addSuccessor(), removeSuccessor() will properly maintain predecessors. We don't need to care about that.
https://github.com/llvm/llvm-project/pull/77608
More information about the Openmp-commits
mailing list