diff options
Diffstat (limited to 'test/CodeGen/X86/catchret-empty-fallthrough.ll')
-rw-r--r-- | test/CodeGen/X86/catchret-empty-fallthrough.ll | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/test/CodeGen/X86/catchret-empty-fallthrough.ll b/test/CodeGen/X86/catchret-empty-fallthrough.ll new file mode 100644 index 000000000000..7ad103303171 --- /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 + %cs1 = catchswitch within none [label %catch] unwind to caller + +catch: ; preds = %dispatch + %0 = catchpad within %cs1 [i8* null] + catchret from %0 to label %return + +fallthrough: ; preds = %try + unreachable + +return: ; preds = %catch, %entry + ret void +} + +; CHECK-LABEL: foo: # @foo +; CHECK: testb $1, %cl +; CHECK: je .LBB0_[[try:[0-9]+]] +; CHECK: .LBB0_[[return:[0-9]+]]: +; CHECK: retq +; CHECK: .LBB0_[[try]]: +; CHECK: .Ltmp0: +; CHECK: callq bar +; CHECK: .Ltmp1: +; CHECK: .LBB0_[[catch:[0-9]+]]: + +; CHECK: .seh_handlerdata +; CHECK-NEXT: .Lfoo$parent_frame_offset = 32 +; 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 |