| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple x86_64-unknown-unknown -exception-model sjlj -verify-machineinstrs=0 -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s --check-prefix=NUM |
| ; RUN: llc -mtriple x86_64-unknown-unknown -exception-model sjlj -verify-machineinstrs=0 -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s --check-prefix=SJLJ |
| |
| @_ZTIi = external dso_local constant ptr |
| @_ZTIc = external dso_local constant ptr |
| |
| ; Function Attrs: noinline norecurse optnone uwtable |
| define dso_local i32 @main() #0 personality ptr @__gxx_personality_sj0 { |
| ; NUM-LABEL: main: |
| ; NUM: # %bb.0: # %entry |
| ; NUM-NEXT: endbr64 |
| ; NUM-NEXT: pushq %rbp |
| ; NUM-NEXT: movq %rsp, %rbp |
| ; NUM-NEXT: pushq %r15 |
| ; NUM-NEXT: pushq %r14 |
| ; NUM-NEXT: pushq %r13 |
| ; NUM-NEXT: pushq %r12 |
| ; NUM-NEXT: pushq %rbx |
| ; NUM-NEXT: subq $120, %rsp |
| ; NUM-NEXT: movl $0, -44(%rbp) |
| ; NUM-NEXT: movq $__gxx_personality_sj0, -120(%rbp) |
| ; NUM-NEXT: movq $GCC_except_table0, -112(%rbp) |
| ; NUM-NEXT: movq %rbp, -104(%rbp) |
| ; NUM-NEXT: movq %rsp, -88(%rbp) |
| ; NUM-NEXT: movq $.LBB0_9, -96(%rbp) |
| ; NUM-NEXT: leaq -152(%rbp), %rdi |
| ; NUM-NEXT: callq _Unwind_SjLj_Register@PLT |
| ; NUM-NEXT: movl $1, -144(%rbp) |
| ; NUM-NEXT: .Ltmp0: |
| ; NUM-NEXT: callq _Z3foov |
| ; NUM-NEXT: .Ltmp1: |
| ; NUM-NEXT: # %bb.1: # %invoke.cont |
| ; NUM-NEXT: movl $1, -44(%rbp) |
| ; NUM-NEXT: .LBB0_7: # %return |
| ; NUM-NEXT: movl -44(%rbp), %ebx |
| ; NUM-NEXT: leaq -152(%rbp), %rdi |
| ; NUM-NEXT: callq _Unwind_SjLj_Unregister@PLT |
| ; NUM-NEXT: movl %ebx, %eax |
| ; NUM-NEXT: addq $120, %rsp |
| ; NUM-NEXT: popq %rbx |
| ; NUM-NEXT: popq %r12 |
| ; NUM-NEXT: popq %r13 |
| ; NUM-NEXT: popq %r14 |
| ; NUM-NEXT: popq %r15 |
| ; NUM-NEXT: popq %rbp |
| ; NUM-NEXT: retq |
| ; NUM-NEXT: .LBB0_9: |
| ; NUM-NEXT: endbr64 |
| ; NUM-NEXT: movl -144(%rbp), %eax |
| ; NUM-NEXT: cmpl $1, %eax |
| ; NUM-NEXT: jb .LBB0_10 |
| ; NUM-NEXT: # %bb.11: |
| ; NUM-NEXT: ud2 |
| ; NUM-NEXT: .LBB0_10: |
| ; NUM-NEXT: leaq .LJTI0_0(%rip), %rcx |
| ; NUM-NEXT: jmpq *(%rcx,%rax,8) |
| ; NUM-NEXT: .LBB0_2: # %lpad |
| ; NUM-NEXT: .Ltmp2: |
| ; NUM-NEXT: endbr64 |
| ; NUM-NEXT: movl -140(%rbp), %ecx |
| ; NUM-NEXT: movl -136(%rbp), %eax |
| ; NUM-NEXT: movq %rcx, -56(%rbp) |
| ; NUM-NEXT: movl %eax, -64(%rbp) |
| ; NUM-NEXT: cmpl $2, %eax |
| ; NUM-NEXT: jne .LBB0_4 |
| ; NUM-NEXT: # %bb.3: # %catch3 |
| ; NUM-NEXT: movq -56(%rbp), %rdi |
| ; NUM-NEXT: movl $-1, -144(%rbp) |
| ; NUM-NEXT: callq __cxa_begin_catch |
| ; NUM-NEXT: movl (%rax), %eax |
| ; NUM-NEXT: movl %eax, -60(%rbp) |
| ; NUM-NEXT: xorl %ecx, %ecx |
| ; NUM-NEXT: cmpl $5, %eax |
| ; NUM-NEXT: jmp .LBB0_6 |
| ; NUM-NEXT: .LBB0_4: # %catch.fallthrough |
| ; NUM-NEXT: cmpl $1, %eax |
| ; NUM-NEXT: jne .LBB0_8 |
| ; NUM-NEXT: # %bb.5: # %catch |
| ; NUM-NEXT: movq -56(%rbp), %rdi |
| ; NUM-NEXT: movl $-1, -144(%rbp) |
| ; NUM-NEXT: callq __cxa_begin_catch |
| ; NUM-NEXT: movzbl (%rax), %eax |
| ; NUM-NEXT: movb %al, -45(%rbp) |
| ; NUM-NEXT: xorl %ecx, %ecx |
| ; NUM-NEXT: cmpb $3, %al |
| ; NUM-NEXT: .LBB0_6: # %return |
| ; NUM-NEXT: setne %cl |
| ; NUM-NEXT: movl %ecx, -44(%rbp) |
| ; NUM-NEXT: movl $-1, -144(%rbp) |
| ; NUM-NEXT: callq __cxa_end_catch |
| ; NUM-NEXT: jmp .LBB0_7 |
| ; NUM-NEXT: .LBB0_8: # %eh.resume |
| ; NUM-NEXT: movl $-1, -144(%rbp) |
| ; |
| ; SJLJ-LABEL: main: |
| ; SJLJ: # %bb.0: # %entry |
| ; SJLJ-NEXT: endbr64 |
| ; SJLJ-NEXT: pushq %rbp |
| ; SJLJ-NEXT: movq %rsp, %rbp |
| ; SJLJ-NEXT: pushq %r15 |
| ; SJLJ-NEXT: pushq %r14 |
| ; SJLJ-NEXT: pushq %r13 |
| ; SJLJ-NEXT: pushq %r12 |
| ; SJLJ-NEXT: pushq %rbx |
| ; SJLJ-NEXT: subq $120, %rsp |
| ; SJLJ-NEXT: movl $0, -44(%rbp) |
| ; SJLJ-NEXT: movq $__gxx_personality_sj0, -120(%rbp) |
| ; SJLJ-NEXT: movq $GCC_except_table0, -112(%rbp) |
| ; SJLJ-NEXT: movq %rbp, -104(%rbp) |
| ; SJLJ-NEXT: movq %rsp, -88(%rbp) |
| ; SJLJ-NEXT: movq $.LBB0_9, -96(%rbp) |
| ; SJLJ-NEXT: leaq -152(%rbp), %rdi |
| ; SJLJ-NEXT: callq _Unwind_SjLj_Register@PLT |
| ; SJLJ-NEXT: movl $1, -144(%rbp) |
| ; SJLJ-NEXT: .Ltmp0: |
| ; SJLJ-NEXT: callq _Z3foov |
| ; SJLJ-NEXT: .Ltmp1: |
| ; SJLJ-NEXT: # %bb.1: # %invoke.cont |
| ; SJLJ-NEXT: movl $1, -44(%rbp) |
| ; SJLJ-NEXT: .LBB0_7: # %return |
| ; SJLJ-NEXT: movl -44(%rbp), %ebx |
| ; SJLJ-NEXT: leaq -152(%rbp), %rdi |
| ; SJLJ-NEXT: callq _Unwind_SjLj_Unregister@PLT |
| ; SJLJ-NEXT: movl %ebx, %eax |
| ; SJLJ-NEXT: addq $120, %rsp |
| ; SJLJ-NEXT: popq %rbx |
| ; SJLJ-NEXT: popq %r12 |
| ; SJLJ-NEXT: popq %r13 |
| ; SJLJ-NEXT: popq %r14 |
| ; SJLJ-NEXT: popq %r15 |
| ; SJLJ-NEXT: popq %rbp |
| ; SJLJ-NEXT: retq |
| ; SJLJ-NEXT: .LBB0_9: |
| ; SJLJ-NEXT: endbr64 |
| ; SJLJ-NEXT: movl -144(%rbp), %eax |
| ; SJLJ-NEXT: cmpl $1, %eax |
| ; SJLJ-NEXT: jb .LBB0_10 |
| ; SJLJ-NEXT: # %bb.11: |
| ; SJLJ-NEXT: ud2 |
| ; SJLJ-NEXT: .LBB0_10: |
| ; SJLJ-NEXT: leaq .LJTI0_0(%rip), %rcx |
| ; SJLJ-NEXT: jmpq *(%rcx,%rax,8) |
| ; SJLJ-NEXT: .LBB0_2: # %lpad |
| ; SJLJ-NEXT: .Ltmp2: |
| ; SJLJ-NEXT: endbr64 |
| ; SJLJ-NEXT: movl -140(%rbp), %ecx |
| ; SJLJ-NEXT: movl -136(%rbp), %eax |
| ; SJLJ-NEXT: movq %rcx, -56(%rbp) |
| ; SJLJ-NEXT: movl %eax, -64(%rbp) |
| ; SJLJ-NEXT: cmpl $2, %eax |
| ; SJLJ-NEXT: jne .LBB0_4 |
| ; SJLJ-NEXT: # %bb.3: # %catch3 |
| ; SJLJ-NEXT: movq -56(%rbp), %rdi |
| ; SJLJ-NEXT: movl $-1, -144(%rbp) |
| ; SJLJ-NEXT: callq __cxa_begin_catch |
| ; SJLJ-NEXT: movl (%rax), %eax |
| ; SJLJ-NEXT: movl %eax, -60(%rbp) |
| ; SJLJ-NEXT: xorl %ecx, %ecx |
| ; SJLJ-NEXT: cmpl $5, %eax |
| ; SJLJ-NEXT: jmp .LBB0_6 |
| ; SJLJ-NEXT: .LBB0_4: # %catch.fallthrough |
| ; SJLJ-NEXT: cmpl $1, %eax |
| ; SJLJ-NEXT: jne .LBB0_8 |
| ; SJLJ-NEXT: # %bb.5: # %catch |
| ; SJLJ-NEXT: movq -56(%rbp), %rdi |
| ; SJLJ-NEXT: movl $-1, -144(%rbp) |
| ; SJLJ-NEXT: callq __cxa_begin_catch |
| ; SJLJ-NEXT: movzbl (%rax), %eax |
| ; SJLJ-NEXT: movb %al, -45(%rbp) |
| ; SJLJ-NEXT: xorl %ecx, %ecx |
| ; SJLJ-NEXT: cmpb $3, %al |
| ; SJLJ-NEXT: .LBB0_6: # %return |
| ; SJLJ-NEXT: setne %cl |
| ; SJLJ-NEXT: movl %ecx, -44(%rbp) |
| ; SJLJ-NEXT: movl $-1, -144(%rbp) |
| ; SJLJ-NEXT: callq __cxa_end_catch |
| ; SJLJ-NEXT: jmp .LBB0_7 |
| ; SJLJ-NEXT: .LBB0_8: # %eh.resume |
| ; SJLJ-NEXT: movl $-1, -144(%rbp) |
| entry: |
| %retval = alloca i32, align 4 |
| %exn.slot = alloca ptr |
| %ehselector.slot = alloca i32 |
| %x = alloca i8, align 1 |
| %x4 = alloca i32, align 4 |
| store i32 0, ptr %retval, align 4 |
| invoke void @_Z3foov() |
| to label %invoke.cont unwind label %lpad |
| |
| invoke.cont: ; preds = %entry |
| br label %try.cont |
| |
| lpad: ; preds = %entry |
| %0 = landingpad { ptr, i32 } |
| catch ptr @_ZTIi |
| catch ptr @_ZTIc |
| %1 = extractvalue { ptr, i32 } %0, 0 |
| store ptr %1, ptr %exn.slot, align 8 |
| %2 = extractvalue { ptr, i32 } %0, 1 |
| store i32 %2, ptr %ehselector.slot, align 4 |
| br label %catch.dispatch |
| |
| catch.dispatch: ; preds = %lpad |
| %sel = load i32, ptr %ehselector.slot, align 4 |
| %3 = call i32 @llvm.eh.typeid.for(ptr @_ZTIi) #3 |
| %matches = icmp eq i32 %sel, %3 |
| br i1 %matches, label %catch3, label %catch.fallthrough |
| |
| catch3: ; preds = %catch.dispatch |
| %exn5 = load ptr, ptr %exn.slot, align 8 |
| %4 = call ptr @__cxa_begin_catch(ptr %exn5) #3 |
| %5 = load i32, ptr %4, align 4 |
| store i32 %5, ptr %x4, align 4 |
| %6 = load i32, ptr %x4, align 4 |
| %cmp6 = icmp ne i32 %6, 5 |
| %conv7 = zext i1 %cmp6 to i32 |
| store i32 %conv7, ptr %retval, align 4 |
| call void @__cxa_end_catch() #3 |
| br label %return |
| |
| catch.fallthrough: ; preds = %catch.dispatch |
| %7 = call i32 @llvm.eh.typeid.for(ptr @_ZTIc) #3 |
| %matches1 = icmp eq i32 %sel, %7 |
| br i1 %matches1, label %catch, label %eh.resume |
| |
| catch: ; preds = %catch.fallthrough |
| %exn = load ptr, ptr %exn.slot, align 8 |
| %8 = call ptr @__cxa_begin_catch(ptr %exn) #3 |
| %9 = load i8, ptr %8, align 1 |
| store i8 %9, ptr %x, align 1 |
| %10 = load i8, ptr %x, align 1 |
| %conv = sext i8 %10 to i32 |
| %cmp = icmp ne i32 %conv, 3 |
| %conv2 = zext i1 %cmp to i32 |
| store i32 %conv2, ptr %retval, align 4 |
| call void @__cxa_end_catch() #3 |
| br label %return |
| |
| try.cont: ; preds = %invoke.cont |
| store i32 1, ptr %retval, align 4 |
| br label %return |
| |
| return: ; preds = %try.cont, %catch3, %catch |
| %11 = load i32, ptr %retval, align 4 |
| ret i32 %11 |
| |
| eh.resume: ; preds = %catch.fallthrough |
| %exn8 = load ptr, ptr %exn.slot, align 8 |
| %sel9 = load i32, ptr %ehselector.slot, align 4 |
| %lpad.val = insertvalue { ptr, i32 } undef, ptr %exn8, 0 |
| %lpad.val10 = insertvalue { ptr, i32 } %lpad.val, i32 %sel9, 1 |
| resume { ptr, i32 } %lpad.val10 |
| } |
| |
| declare dso_local void @_Z3foov() #1 |
| |
| declare dso_local i32 @__gxx_personality_sj0(...) |
| |
| ; Function Attrs: nounwind readnone |
| declare i32 @llvm.eh.typeid.for(ptr) #2 |
| |
| declare dso_local ptr @__cxa_begin_catch(ptr) |
| |
| declare dso_local void @__cxa_end_catch() |
| |
| !llvm.module.flags = !{!0, !1, !2} |
| |
| !0 = !{i32 1, !"wchar_size", i32 4} |
| !1 = !{i32 8, !"cf-protection-return", i32 1} |
| !2 = !{i32 8, !"cf-protection-branch", i32 1} |