https://github.com/HaohaiWen updated https://github.com/llvm/llvm-project/pull/77608
>From 80a650763278061630e6ff5635bbc3a2dacc093e Mon Sep 17 00:00:00 2001 From: Haohai Wen <haohai....@intel.com> Date: Wed, 10 Jan 2024 16:09:00 +0800 Subject: [PATCH 1/2] [BranchFolding][SEH] Add test to track SEH CFG optimization This test tracks BranchFolding pass which removes fall through jump and leaves landing-pad to be machine basic block of no predecessors. It would raise bug as introduced in #77441. --- .../X86/branchfolding-landingpad-cfg.mir | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir diff --git a/llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir b/llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir new file mode 100644 index 00000000000000..a494701c2a3997 --- /dev/null +++ b/llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir @@ -0,0 +1,49 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4 +# RUN: llc -mtriple=x86_64-pc-windows-msvc -run-pass=branch-folder -o - %s | FileCheck %s +--- +name: main +body: | + ; CHECK-LABEL: name: main + ; CHECK: bb.0: + ; CHECK-NEXT: successors: %bb.1(0x7ffff800), %bb.3(0x00000800) + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.1: + ; CHECK-NEXT: RET 0 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.2 (machine-block-address-taken, landing-pad, ehfunclet-entry): + ; CHECK-NEXT: successors: %bb.3(0x80000000) + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: CLEANUPRET + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.3 (landing-pad, ehfunclet-entry): + ; CHECK-NEXT: CLEANUPRET + bb.0: + successors: %bb.1(0x7ffff800), %bb.5(0x00000800) + JMP_1 %bb.1 + + bb.1: + successors: %bb.2(0x7ffff800), %bb.4(0x00000800) + + JMP_1 %bb.2 + + bb.2: + successors: %bb.3(0x7ffff800), %bb.4(0x00000800) + + JMP_1 %bb.3 + + bb.3: + successors: %bb.6(0x7ffff800) + + JMP_1 %bb.6 + + bb.4 (machine-block-address-taken, landing-pad, ehfunclet-entry): + successors: %bb.5(0x80000000) + CLEANUPRET + + bb.5 (landing-pad, ehfunclet-entry): + CLEANUPRET + + bb.6: + RET 0 +... >From 34cce741218ed6f719214556b8e260c94b20deee Mon Sep 17 00:00:00 2001 From: Haohai Wen <haohai....@intel.com> Date: Wed, 10 Jan 2024 20:50:24 +0800 Subject: [PATCH 2/2] [BranchFolding] Fix missing predecessors of landing-pad When removing an empty machine basic block, all of its successors should be inherited by its fall through MBB. This keeps CFG as only have one entry which is required by LiveDebugValues. --- llvm/lib/CodeGen/BranchFolding.cpp | 17 +++++++++++++++++ .../X86/branchfolding-landingpad-cfg.mir | 2 ++ 2 files changed, 19 insertions(+) diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index 0801296cab49f8..599b7c72b2f5c6 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -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); + } // If MBB was the target of a jump table, update jump tables to go to the // fallthrough instead. if (MachineJumpTableInfo *MJTI = MF.getJumpTableInfo()) @@ -1624,6 +1632,15 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) { } else { DidChange = true; PMBB->ReplaceUsesOfBlockWith(MBB, CurTBB); + // Add rest successors of MBB to successors of CurTBB. 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 != CurTBB && !CurTBB->isSuccessor(*SI)) { + assert((*SI)->isEHPad() && "Bad CFG"); + CurTBB->copySuccessor(MBB, SI); + } // If this change resulted in PMBB ending in a conditional // branch where both conditions go to the same destination, // change this to an unconditional branch. diff --git a/llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir b/llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir index a494701c2a3997..8eef5450e252a6 100644 --- a/llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir +++ b/llvm/test/CodeGen/X86/branchfolding-landingpad-cfg.mir @@ -9,6 +9,8 @@ body: | ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: + ; CHECK-NEXT: successors: %bb.2(0x00000800) + ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: RET 0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2 (machine-block-address-taken, landing-pad, ehfunclet-entry): _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits