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(...)