1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv64 -mattr=+v,+m < %s \ 3; RUN: | FileCheck %s 4 5 6@_ZTIi = external dso_local constant ptr 7 8declare 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) 9 10declare dso_local ptr @__cxa_allocate_exception(i64) 11 12declare dso_local void @__cxa_throw(ptr, ptr, ptr) 13 14define signext i32 @foo() #1 personality ptr @__gxx_personality_v0 { 15; CHECK-LABEL: foo: 16; CHECK: # %bb.0: # %entry 17; CHECK-NEXT: addi sp, sp, -32 18; CHECK-NEXT: .cfi_def_cfa_offset 32 19; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 20; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 21; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 22; CHECK-NEXT: .cfi_offset ra, -8 23; CHECK-NEXT: .cfi_offset s0, -16 24; CHECK-NEXT: .cfi_offset s1, -24 25; CHECK-NEXT: addi s0, sp, 32 26; CHECK-NEXT: .cfi_def_cfa s0, 0 27; CHECK-NEXT: .cfi_remember_state 28; CHECK-NEXT: .Ltmp0: 29; CHECK-NEXT: addi sp, sp, -32 30; CHECK-NEXT: li a0, 0 31; CHECK-NEXT: li a1, 0 32; CHECK-NEXT: li a2, 0 33; CHECK-NEXT: li a3, 0 34; CHECK-NEXT: li a4, 0 35; CHECK-NEXT: li a5, 0 36; CHECK-NEXT: li a6, 0 37; CHECK-NEXT: li a7, 0 38; CHECK-NEXT: call _Z3fooiiiiiiiiiiPi 39; CHECK-NEXT: addi sp, sp, 32 40; CHECK-NEXT: .Ltmp1: 41; CHECK-NEXT: # %bb.1: # %try.cont.unreachable 42; CHECK-NEXT: .LBB0_2: # %lpad 43; CHECK-NEXT: .Ltmp2: 44; CHECK-NEXT: sext.w a1, a1 45; CHECK-NEXT: li a2, 1 46; CHECK-NEXT: bne a1, a2, .LBB0_4 47; CHECK-NEXT: # %bb.3: # %catch 48; CHECK-NEXT: call __cxa_begin_catch 49; CHECK-NEXT: lw s1, 0(a0) 50; CHECK-NEXT: call __cxa_end_catch 51; CHECK-NEXT: mv a0, s1 52; CHECK-NEXT: addi sp, s0, -32 53; CHECK-NEXT: .cfi_def_cfa sp, 32 54; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 55; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 56; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 57; CHECK-NEXT: .cfi_restore ra 58; CHECK-NEXT: .cfi_restore s0 59; CHECK-NEXT: .cfi_restore s1 60; CHECK-NEXT: addi sp, sp, 32 61; CHECK-NEXT: .cfi_def_cfa_offset 0 62; CHECK-NEXT: ret 63; CHECK-NEXT: .LBB0_4: # %ehcleanup 64; CHECK-NEXT: .cfi_restore_state 65; CHECK-NEXT: call _Unwind_Resume 66entry: 67 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) 68 to label %try.cont.unreachable unwind label %lpad 69 70lpad: 71 %0 = landingpad { ptr, i32 } 72 cleanup 73 catch ptr @_ZTIi 74 %1 = extractvalue { ptr, i32 } %0, 1 75 %2 = call i32 @llvm.eh.typeid.for(ptr nonnull @_ZTIi) 76 %matches = icmp eq i32 %1, %2 77 br i1 %matches, label %catch, label %ehcleanup 78 79catch: 80 %3 = extractvalue { ptr, i32 } %0, 0 81 %4 = call ptr @__cxa_begin_catch(ptr %3) 82 %5 = load i32, ptr %4, align 4 83 call void @__cxa_end_catch() 84 ret i32 %5 85 86try.cont.unreachable: 87 unreachable 88 89ehcleanup: 90 resume { ptr, i32 } %0 91} 92 93declare i32 @__gxx_personality_v0(...) 94 95declare i32 @llvm.eh.typeid.for(ptr) 96 97declare ptr @__cxa_begin_catch(ptr) 98declare void @__cxa_end_catch() 99 100attributes #1 = { "frame-pointer"="all"} 101