llvm/llvm/test/CodeGen/RISCV/miss-sp-restore-eh.ll

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv64 -mattr=+v,+m < %s \
; RUN:     | FileCheck %s


@_ZTIi = external dso_local constant ptr

declare void @_Z3fooiiiiiiiiiiPi(i32 signext %0, i32 signext %1, i32 signext %2, i32 signext %3, i32 signext %4, i32 signext %5, i32 signext %6, i32 signext %7, i32 %8, i32 %9, i32 %10)

declare dso_local ptr @__cxa_allocate_exception(i64)

declare dso_local void @__cxa_throw(ptr, ptr, ptr)

define signext i32 @foo() #1 personality ptr @__gxx_personality_v0 {
; CHECK-LABEL: foo:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    addi sp, sp, -32
; CHECK-NEXT:    .cfi_def_cfa_offset 32
; CHECK-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
; CHECK-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
; CHECK-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
; CHECK-NEXT:    .cfi_offset ra, -8
; CHECK-NEXT:    .cfi_offset s0, -16
; CHECK-NEXT:    .cfi_offset s1, -24
; CHECK-NEXT:    addi s0, sp, 32
; CHECK-NEXT:    .cfi_def_cfa s0, 0
; CHECK-NEXT:  .Ltmp0:
; CHECK-NEXT:    addi sp, sp, -32
; CHECK-NEXT:    li a0, 0
; CHECK-NEXT:    li a1, 0
; CHECK-NEXT:    li a2, 0
; CHECK-NEXT:    li a3, 0
; CHECK-NEXT:    li a4, 0
; CHECK-NEXT:    li a5, 0
; CHECK-NEXT:    li a6, 0
; CHECK-NEXT:    li a7, 0
; CHECK-NEXT:    call _Z3fooiiiiiiiiiiPi
; CHECK-NEXT:    addi sp, sp, 32
; CHECK-NEXT:  .Ltmp1:
; CHECK-NEXT:  # %bb.1: # %try.cont.unreachable
; CHECK-NEXT:  .LBB0_2: # %lpad
; CHECK-NEXT:  .Ltmp2:
; CHECK-NEXT:    sext.w a1, a1
; CHECK-NEXT:    li a2, 1
; CHECK-NEXT:    bne a1, a2, .LBB0_4
; CHECK-NEXT:  # %bb.3: # %catch
; CHECK-NEXT:    call __cxa_begin_catch
; CHECK-NEXT:    lw s1, 0(a0)
; CHECK-NEXT:    call __cxa_end_catch
; CHECK-NEXT:    mv a0, s1
; CHECK-NEXT:    addi sp, s0, -32
; CHECK-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
; CHECK-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
; CHECK-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
; CHECK-NEXT:    addi sp, sp, 32
; CHECK-NEXT:    ret
; CHECK-NEXT:  .LBB0_4: # %ehcleanup
; CHECK-NEXT:    call _Unwind_Resume
entry:
  invoke void @_Z3fooiiiiiiiiiiPi(i32 signext poison, i32 signext poison, i32 signext poison, i32 signext poison, i32 signext poison, i32 signext poison, i32 signext poison, i32 signext poison, i32 poison, i32 poison, i32 poison)
          to label %try.cont.unreachable unwind label %lpad

lpad:
  %0 = landingpad { ptr, i32 }
          cleanup
          catch ptr @_ZTIi
  %1 = extractvalue { ptr, i32 } %0, 1
  %2 = call i32 @llvm.eh.typeid.for(ptr nonnull @_ZTIi)
  %matches = icmp eq i32 %1, %2
  br i1 %matches, label %catch, label %ehcleanup

catch:
  %3 = extractvalue { ptr, i32 } %0, 0
  %4 = call ptr @__cxa_begin_catch(ptr %3)
  %5 = load i32, ptr %4, align 4
  call void @__cxa_end_catch()
  ret i32 %5

try.cont.unreachable:
  unreachable

ehcleanup:
  resume { ptr, i32 } %0
}

declare i32 @__gxx_personality_v0(...)

declare i32 @llvm.eh.typeid.for(ptr)

declare ptr @__cxa_begin_catch(ptr)
declare void @__cxa_end_catch()

attributes #1 = { "frame-pointer"="all"}