Skip to content

Commit fb2c6bb

Browse files
authored
[BranchFolding] Use isSuccessor to confirm fall through (#77923)
When merging blocks, if the previous block has no any branch instruction and has one successor, the successor may be SEH landing pad and the block will always raise exception and nerver fall through to next block. We can not merge them in such case. isSuccessor should be used to confirm it can fall through to next block.
1 parent 819bd9e commit fb2c6bb

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

llvm/lib/CodeGen/BranchFolding.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,7 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
14111411
// This has to check PrevBB->succ_size() because EH edges are ignored by
14121412
// analyzeBranch.
14131413
if (PriorCond.empty() && !PriorTBB && MBB->pred_size() == 1 &&
1414-
PrevBB.succ_size() == 1 &&
1414+
PrevBB.succ_size() == 1 && PrevBB.isSuccessor(MBB) &&
14151415
!MBB->hasAddressTaken() && !MBB->isEHPad()) {
14161416
LLVM_DEBUG(dbgs() << "\nMerging into block: " << PrevBB
14171417
<< "From MBB: " << *MBB);

llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,44 @@ body: |
4949
bb.6:
5050
RET 0
5151
...
52+
---
53+
name: foo
54+
body: |
55+
; CHECK-LABEL: name: foo
56+
; CHECK: bb.0:
57+
; CHECK-NEXT: successors: %bb.1(0x7ffff800), %bb.2(0x00000800)
58+
; CHECK-NEXT: liveins: $rcx
59+
; CHECK-NEXT: {{ $}}
60+
; CHECK-NEXT: renamable $eax = MOV32rm renamable $rcx, 1, $noreg, 0, $noreg
61+
; CHECK-NEXT: TEST32rr renamable $eax, renamable $eax, implicit-def $eflags
62+
; CHECK-NEXT: JCC_1 %bb.2, 14, implicit killed $eflags
63+
; CHECK-NEXT: {{ $}}
64+
; CHECK-NEXT: bb.1:
65+
; CHECK-NEXT: successors: %bb.3(0x80000000)
66+
; CHECK-NEXT: {{ $}}
67+
; CHECK-NEXT: INT 3
68+
; CHECK-NEXT: {{ $}}
69+
; CHECK-NEXT: bb.2:
70+
; CHECK-NEXT: RET 0
71+
; CHECK-NEXT: {{ $}}
72+
; CHECK-NEXT: bb.3 (machine-block-address-taken, landing-pad, ehfunclet-entry):
73+
; CHECK-NEXT: CLEANUPRET
74+
bb.0:
75+
successors: %bb.1(0x7ffff800), %bb.2(0x00000800)
76+
liveins: $rcx
77+
78+
renamable $eax = MOV32rm renamable $rcx, 1, $noreg, 0, $noreg
79+
TEST32rr renamable $eax, renamable $eax, implicit-def $eflags
80+
JCC_1 %bb.2, 14, implicit killed $eflags
81+
JMP_1 %bb.1
82+
83+
bb.1:
84+
successors: %bb.3(0x80000000)
85+
INT 3
86+
87+
bb.2:
88+
RET 0
89+
90+
bb.3 (machine-block-address-taken, landing-pad, ehfunclet-entry):
91+
CLEANUPRET
92+
...

0 commit comments

Comments
 (0)