[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / RISCV / miss-sp-restore-eh.ll
bloba5847365159a84f1d63162ea80f9c0853c49781c
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
6 @_ZTIi = external dso_local constant ptr
8 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)
10 declare dso_local ptr @__cxa_allocate_exception(i64)
12 declare dso_local void @__cxa_throw(ptr, ptr, ptr)
14 define 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
66 entry:
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
70 lpad:
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
79 catch:
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
86 try.cont.unreachable:
87   unreachable
89 ehcleanup:
90   resume { ptr, i32 } %0
93 declare i32 @__gxx_personality_v0(...)
95 declare i32 @llvm.eh.typeid.for(ptr)
97 declare ptr @__cxa_begin_catch(ptr)
98 declare void @__cxa_end_catch()
100 attributes #1 = { "frame-pointer"="all"}