================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits