| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc %s -mtriple=x86_64-unknown-linux-gnu -o - -verify-dom-info | FileCheck %s |
| ; RUN: llc %s -mtriple=x86_64-unknown-linux-gnu -disable-check-noreturn-call=true -o - -verify-dom-info | FileCheck --check-prefix=DISNOTET %s |
| |
| ; Function Attrs: sspreq |
| define void @_Z7catchesv() #0 personality ptr null { |
| ; CHECK-LABEL: _Z7catchesv: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: .cfi_def_cfa_offset 16 |
| ; CHECK-NEXT: movq %fs:40, %rax |
| ; CHECK-NEXT: movq %rax, (%rsp) |
| ; CHECK-NEXT: .Ltmp0: |
| ; CHECK-NEXT: xorl %eax, %eax |
| ; CHECK-NEXT: xorl %edi, %edi |
| ; CHECK-NEXT: xorl %esi, %esi |
| ; CHECK-NEXT: xorl %edx, %edx |
| ; CHECK-NEXT: callq *%rax |
| ; CHECK-NEXT: .Ltmp1: |
| ; CHECK-NEXT: # %bb.1: # %invoke.cont |
| ; CHECK-NEXT: movq %fs:40, %rax |
| ; CHECK-NEXT: cmpq (%rsp), %rax |
| ; CHECK-NEXT: jne .LBB0_6 |
| ; CHECK-NEXT: # %bb.2: # %SP_return |
| ; CHECK-NEXT: .Ltmp2: |
| ; CHECK-NEXT: xorl %eax, %eax |
| ; CHECK-NEXT: xorl %edi, %edi |
| ; CHECK-NEXT: callq *%rax |
| ; CHECK-NEXT: .Ltmp3: |
| ; CHECK-NEXT: # %bb.3: # %invoke.cont2 |
| ; CHECK-NEXT: .LBB0_4: # %lpad1 |
| ; CHECK-NEXT: .Ltmp4: |
| ; CHECK-NEXT: movq %fs:40, %rax |
| ; CHECK-NEXT: cmpq (%rsp), %rax |
| ; CHECK-NEXT: jne .LBB0_6 |
| ; CHECK-NEXT: # %bb.5: # %SP_return3 |
| ; CHECK-NEXT: popq %rax |
| ; CHECK-NEXT: .cfi_def_cfa_offset 8 |
| ; CHECK-NEXT: retq |
| ; CHECK-NEXT: .LBB0_6: # %CallStackCheckFailBlk |
| ; CHECK-NEXT: .cfi_def_cfa_offset 16 |
| ; CHECK-NEXT: callq __stack_chk_fail@PLT |
| ; |
| ; DISNOTET-LABEL: _Z7catchesv: |
| ; DISNOTET: # %bb.0: # %entry |
| ; DISNOTET-NEXT: pushq %rax |
| ; DISNOTET-NEXT: .cfi_def_cfa_offset 16 |
| ; DISNOTET-NEXT: movq %fs:40, %rax |
| ; DISNOTET-NEXT: movq %rax, (%rsp) |
| ; DISNOTET-NEXT: .Ltmp0: |
| ; DISNOTET-NEXT: xorl %eax, %eax |
| ; DISNOTET-NEXT: xorl %edi, %edi |
| ; DISNOTET-NEXT: xorl %esi, %esi |
| ; DISNOTET-NEXT: xorl %edx, %edx |
| ; DISNOTET-NEXT: callq *%rax |
| ; DISNOTET-NEXT: .Ltmp1: |
| ; DISNOTET-NEXT: # %bb.1: # %invoke.cont |
| ; DISNOTET-NEXT: .Ltmp2: |
| ; DISNOTET-NEXT: xorl %eax, %eax |
| ; DISNOTET-NEXT: xorl %edi, %edi |
| ; DISNOTET-NEXT: callq *%rax |
| ; DISNOTET-NEXT: .Ltmp3: |
| ; DISNOTET-NEXT: # %bb.2: # %invoke.cont2 |
| ; DISNOTET-NEXT: .LBB0_3: # %lpad1 |
| ; DISNOTET-NEXT: .Ltmp4: |
| ; DISNOTET-NEXT: movq %fs:40, %rax |
| ; DISNOTET-NEXT: cmpq (%rsp), %rax |
| ; DISNOTET-NEXT: jne .LBB0_5 |
| ; DISNOTET-NEXT: # %bb.4: # %SP_return |
| ; DISNOTET-NEXT: popq %rax |
| ; DISNOTET-NEXT: .cfi_def_cfa_offset 8 |
| ; DISNOTET-NEXT: retq |
| ; DISNOTET-NEXT: .LBB0_5: # %CallStackCheckFailBlk |
| ; DISNOTET-NEXT: .cfi_def_cfa_offset 16 |
| ; DISNOTET-NEXT: callq __stack_chk_fail@PLT |
| entry: |
| %call = invoke i64 null(i32 0, ptr null, i64 0) |
| to label %invoke.cont unwind label %lpad1 |
| |
| invoke.cont: ; preds = %entry |
| invoke void null(i32 0) #1 |
| to label %invoke.cont2 unwind label %lpad1 |
| |
| invoke.cont2: ; preds = %invoke.cont |
| unreachable |
| |
| lpad1: ; preds = %invoke.cont, %entry |
| %0 = landingpad { ptr, i32 } |
| cleanup |
| ret void |
| } |
| |
| ; uselistorder directives |
| uselistorder ptr null, { 5, 4, 3, 2, 1, 0 } |
| |
| attributes #0 = { sspreq } |
| attributes #1 = { noreturn } |