llvm/llvm/test/CodeGen/X86/indirect-branch-tracking-eh2.ll

; 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:    movl $1, -144(%rbp)
; NUM-NEXT:    leaq -152(%rbp), %rdi
; NUM-NEXT:    callq _Unwind_SjLj_Register@PLT
; 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:    movl $1, -144(%rbp)
; SJLJ-NEXT:    leaq -152(%rbp), %rdi
; SJLJ-NEXT:    callq _Unwind_SjLj_Register@PLT
; 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}