diff options
Diffstat (limited to 'llvm/test/CodeGen/X86/seh-safe-div.ll')
-rw-r--r-- | llvm/test/CodeGen/X86/seh-safe-div.ll | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/llvm/test/CodeGen/X86/seh-safe-div.ll b/llvm/test/CodeGen/X86/seh-safe-div.ll index 80b15b60102..ba54f1cca60 100644 --- a/llvm/test/CodeGen/X86/seh-safe-div.ll +++ b/llvm/test/CodeGen/X86/seh-safe-div.ll @@ -71,34 +71,46 @@ __try.cont: ; CHECK: leaq [[rloc:.*\(%rsp\)]], %rcx ; CHECK: callq try_body ; CHECK-NEXT: .Ltmp1 -; CHECK: [[cont_bb:\.LBB0_[0-9]+]]: +; CHECK: .LBB0_7: ; CHECK: movl [[rloc]], %eax ; CHECK: retq ; Landing pad code -; CHECK: [[handler0:\.Ltmp[0-9]+]]: # Block address taken +; CHECK: .Ltmp3: +; CHECK: movl $1, %[[sel:[a-z]+]] +; CHECK: .Ltmp4 +; CHECK: movl $2, %[[sel]] +; CHECK: .L{{.*}}: +; CHECK: cmpl $1, %[[sel]] + ; CHECK: # %handler0 ; CHECK: callq puts ; CHECK: movl $-1, [[rloc]] -; CHECK: jmp [[cont_bb]] +; CHECK: jmp .LBB0_7 + +; CHECK: cmpl $2, %[[sel]] -; CHECK: [[handler1:\.Ltmp[0-9]+]]: # Block address taken ; CHECK: # %handler1 ; CHECK: callq puts ; CHECK: movl $-2, [[rloc]] -; CHECK: jmp [[cont_bb]] +; CHECK: jmp .LBB0_7 + +; FIXME: EH preparation should eliminate the 'resume' instr and we should not do +; the previous 'cmp;jeq'. +; CHECK-NOT: _Unwind_Resume +; CHECK: ud2 ; CHECK: .seh_handlerdata -; CHECK-NEXT: .long 2 -; CHECK-NEXT: .long .Ltmp0@IMGREL -; CHECK-NEXT: .long .Ltmp1@IMGREL+1 -; CHECK-NEXT: .long safe_div_filt0@IMGREL -; CHECK-NEXT: .long [[handler0]]@IMGREL -; CHECK-NEXT: .long .Ltmp0@IMGREL -; CHECK-NEXT: .long .Ltmp1@IMGREL+1 -; CHECK-NEXT: .long safe_div_filt1@IMGREL -; CHECK-NEXT: .long [[handler1]]@IMGREL +; CHECK: .long 2 +; CHECK: .long .Ltmp0@IMGREL +; CHECK: .long .Ltmp1@IMGREL+1 +; CHECK: .long safe_div_filt0@IMGREL +; CHECK: .long .Ltmp3@IMGREL +; CHECK: .long .Ltmp0@IMGREL +; CHECK: .long .Ltmp1@IMGREL+1 +; CHECK: .long safe_div_filt1@IMGREL +; CHECK: .long .Ltmp4@IMGREL ; CHECK: .text ; CHECK: .seh_endproc @@ -173,6 +185,11 @@ define i32 @main() { ret i32 0 } +define void @_Unwind_Resume() { + call void @abort() + unreachable +} + declare i32 @__C_specific_handler(...) declare i32 @llvm.eh.typeid.for(i8*) readnone nounwind declare void @puts(i8*) |