xref: /llvm-project/llvm/test/CodeGen/RISCV/miss-sp-restore-eh.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
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