diff --git a/llvm/test/CodeGen/RISCV/miss-sp-restore-eh.ll b/llvm/test/CodeGen/RISCV/miss-sp-restore-eh.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/miss-sp-restore-eh.ll @@ -0,0 +1,92 @@ +; 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: 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"}