Skip to content

[BranchFolding][WinEH] Do not remove EH pads#176735

Merged
nikic merged 1 commit intollvm:mainfrom
nikic:branch-folder-eh-pad
Jan 20, 2026
Merged

[BranchFolding][WinEH] Do not remove EH pads#176735
nikic merged 1 commit intollvm:mainfrom
nikic:branch-folder-eh-pad

Conversation

@nikic
Copy link
Copy Markdown
Contributor

@nikic nikic commented Jan 19, 2026

If branch folding remoes an EH pad, we're left with a dangling reference to it from the CxxUnwindMap. We could try to fix this up, but given that this should be a rare situation, just leave the dead EH pad blocks around.

Fixes #176421.

If branch folding remoes an EH pad, we're left with a dangling
reference to it from the CxxUnwindMap. We could try to fix this
up, but given that this should be a rare situation, just leave
the dead EH pad blocks around.
@llvmbot
Copy link
Copy Markdown
Member

llvmbot commented Jan 19, 2026

@llvm/pr-subscribers-backend-aarch64

Author: Nikita Popov (nikic)

Changes

If branch folding remoes an EH pad, we're left with a dangling reference to it from the CxxUnwindMap. We could try to fix this up, but given that this should be a rare situation, just leave the dead EH pad blocks around.

Fixes #176421.


Full diff: https://github.com/llvm/llvm-project/pull/176735.diff

2 Files Affected:

  • (modified) llvm/lib/CodeGen/BranchFolding.cpp (+2-1)
  • (added) llvm/test/CodeGen/AArch64/wineh-dangling-eh-pad-reference.ll (+34)
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp
index 9a12039291989..5a43f4e1ec993 100644
--- a/llvm/lib/CodeGen/BranchFolding.cpp
+++ b/llvm/lib/CodeGen/BranchFolding.cpp
@@ -1259,7 +1259,8 @@ bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
     MadeChange |= OptimizeBlock(&MBB);
 
     // If it is dead, remove it.
-    if (MBB.pred_empty() && !MBB.isMachineBlockAddressTaken()) {
+    if (MBB.pred_empty() && !MBB.isMachineBlockAddressTaken() &&
+        !MBB.isEHPad()) {
       RemoveDeadBlock(&MBB);
       MadeChange = true;
       ++NumDeadBlocks;
diff --git a/llvm/test/CodeGen/AArch64/wineh-dangling-eh-pad-reference.ll b/llvm/test/CodeGen/AArch64/wineh-dangling-eh-pad-reference.ll
new file mode 100644
index 0000000000000..e20d4ce3633d7
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/wineh-dangling-eh-pad-reference.ll
@@ -0,0 +1,34 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=aarch64-pc-windows-msvc < %s | FileCheck %s
+
+declare void @func()
+
+; Make sure that we do not end up with a dangling EH pad reference.
+
+define void @test(ptr %p) personality ptr @__CxxFrameHandler3 {
+; CHECK-LABEL: test:
+; CHECK:       .seh_proc "?dtor$1@?0?test@4HA"
+; CHECK-LABEL: $stateUnwindMap$test:
+; CHECK:       .word -1                           // ToState
+; CHECK:       .word "?dtor$1@?0?test@4HA"@IMGREL // Action
+
+  %v0 = load i32, ptr %p
+  %v1 = load i32, ptr %p
+  %xor = xor i32 %v0, %v1
+  %cmp = icmp eq i32 %xor, 0
+  br i1 %cmp, label %exit, label %bb
+
+bb:
+  invoke void @func()
+          to label %exit unwind label %unwind
+
+unwind:
+  %cp = cleanuppad within none []
+  store volatile i32 0, ptr %p
+  cleanupret from %cp unwind to caller
+
+exit:
+  ret void
+}
+
+declare i32 @__CxxFrameHandler3(...)

@nikic nikic merged commit 528bb2b into llvm:main Jan 20, 2026
14 checks passed
@nikic nikic deleted the branch-folder-eh-pad branch January 20, 2026 10:05
c-rhodes pushed a commit to llvmbot/llvm-project that referenced this pull request Jan 26, 2026
If branch folding remoes an EH pad, we're left with a dangling reference
to it from the CxxUnwindMap. We could try to fix this up, but given that
this should be a rare situation, just leave the dead EH pad blocks
around.

Fixes llvm#176421.

(cherry picked from commit 528bb2b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[WinEH] Incorrect block label reference in unwind table

3 participants