From 758cf890e03ef9ee0d3398bb1750b72df737a496 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 11 Nov 2015 23:09:31 +0000 Subject: [PATCH] [WinEH] Don't forward branches across empty EH pad BBs For really simple SEH catchpads, we tried to forward the invoke unwind edge across the empty block. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252822 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/BranchFolding.cpp | 2 +- lib/CodeGen/MachineBasicBlock.cpp | 1 + .../CodeGen/X86/catchret-empty-fallthrough.ll | 53 +++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/catchret-empty-fallthrough.ll diff --git a/lib/CodeGen/BranchFolding.cpp b/lib/CodeGen/BranchFolding.cpp index 6ee9a4b16fe..0b2495cc996 100644 --- a/lib/CodeGen/BranchFolding.cpp +++ b/lib/CodeGen/BranchFolding.cpp @@ -1404,7 +1404,7 @@ ReoptimizeBlock: // other blocks across it. if (CurTBB && CurCond.empty() && !CurFBB && IsBranchOnlyBlock(MBB) && CurTBB != MBB && - !MBB->hasAddressTaken()) { + !MBB->hasAddressTaken() && !MBB->isEHPad()) { DebugLoc dl = getBranchDebugLoc(*MBB); // This block may contain just an unconditional branch. Because there can // be 'non-branch terminators' in the block, try removing the branch and diff --git a/lib/CodeGen/MachineBasicBlock.cpp b/lib/CodeGen/MachineBasicBlock.cpp index 8e11979ef1c..44dbf9f01c2 100644 --- a/lib/CodeGen/MachineBasicBlock.cpp +++ b/lib/CodeGen/MachineBasicBlock.cpp @@ -52,6 +52,7 @@ MCSymbol *MachineBasicBlock::getSymbol() const { const MachineFunction *MF = getParent(); MCContext &Ctx = MF->getContext(); const char *Prefix = Ctx.getAsmInfo()->getPrivateLabelPrefix(); + assert(getNumber() >= 0 && "cannot get label for unreachable MBB"); CachedMCSymbol = Ctx.getOrCreateSymbol(Twine(Prefix) + "BB" + Twine(MF->getFunctionNumber()) + "_" + Twine(getNumber())); diff --git a/test/CodeGen/X86/catchret-empty-fallthrough.ll b/test/CodeGen/X86/catchret-empty-fallthrough.ll new file mode 100644 index 00000000000..3b3b3f5d091 --- /dev/null +++ b/test/CodeGen/X86/catchret-empty-fallthrough.ll @@ -0,0 +1,53 @@ +; RUN: llc -verify-machineinstrs < %s | FileCheck %s + +; BranchFolding used to remove our empty landingpad block, which is +; undesirable. + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc18.0.0" + +declare i32 @__C_specific_handler(...) + +declare void @bar() + +define void @foo(i1 %cond) personality i32 (...)* @__C_specific_handler { +entry: + br i1 %cond, label %return, label %try + +try: ; preds = %entry + invoke void @bar() + to label %fallthrough unwind label %dispatch + +dispatch: ; preds = %try + %0 = catchpad [i8* null] + to label %catch unwind label %catchendblock.i.i + +catch: ; preds = %dispatch + catchret %0 to label %return + +catchendblock.i.i: ; preds = %dispatch + catchendpad unwind to caller + +fallthrough: ; preds = %try + unreachable + +return: ; preds = %catch, %entry + ret void +} + +; CHECK-LABEL: foo: # @foo +; CHECK: testb $1, %cl +; CHECK: jne .LBB0_[[return:[0-9]+]] +; CHECK: .Ltmp0: +; CHECK: callq bar +; CHECK: .Ltmp1: +; CHECK: .LBB0_[[catch:[0-9]+]]: +; CHECK: .LBB0_[[return]]: + +; CHECK: .seh_handlerdata +; CHECK-NEXT: .long (.Llsda_end0-.Llsda_begin0)/16 +; CHECK-NEXT: .Llsda_begin0: +; CHECK-NEXT: .long .Ltmp0@IMGREL+1 +; CHECK-NEXT: .long .Ltmp1@IMGREL+1 +; CHECK-NEXT: .long 1 +; CHECK-NEXT: .long .LBB0_[[catch]]@IMGREL -- 2.34.1