| ; 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@plt |
| ; 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@plt |
| ; CHECK-NEXT: lw s1, 0(a0) |
| ; CHECK-NEXT: call __cxa_end_catch@plt |
| ; 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@plt |
| 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"} |