xref: /llvm-project/llvm/test/CodeGen/LoongArch/exception-pointer-register.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1983a0ae5Swanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \
3983a0ae5Swanglei; RUN:    | FileCheck %s --check-prefix=LA32
4*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \
5983a0ae5Swanglei; RUN:    | FileCheck %s --check-prefix=LA64
6983a0ae5Swanglei
7983a0ae5Swangleideclare void @foo(ptr %p);
8983a0ae5Swangleideclare void @bar(ptr %p);
9983a0ae5Swangleideclare dso_local i32 @__gxx_personality_v0(...)
10983a0ae5Swanglei
11983a0ae5Swanglei;; Before getExceptionPointerRegister() and getExceptionSelectorRegister()
12983a0ae5Swanglei;; lowering hooks were defined this would trigger an assertion during live
13983a0ae5Swanglei;; variable analysis.
14983a0ae5Swanglei
15983a0ae5Swangleidefine void @caller(ptr %p) personality ptr @__gxx_personality_v0 {
16983a0ae5Swanglei; LA32-LABEL: caller:
17983a0ae5Swanglei; LA32:       # %bb.0: # %entry
18983a0ae5Swanglei; LA32-NEXT:    addi.w $sp, $sp, -16
19983a0ae5Swanglei; LA32-NEXT:    .cfi_def_cfa_offset 16
20983a0ae5Swanglei; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
21983a0ae5Swanglei; LA32-NEXT:    st.w $fp, $sp, 8 # 4-byte Folded Spill
22983a0ae5Swanglei; LA32-NEXT:    st.w $s0, $sp, 4 # 4-byte Folded Spill
23983a0ae5Swanglei; LA32-NEXT:    .cfi_offset 1, -4
24983a0ae5Swanglei; LA32-NEXT:    .cfi_offset 22, -8
25983a0ae5Swanglei; LA32-NEXT:    .cfi_offset 23, -12
26983a0ae5Swanglei; LA32-NEXT:    move $fp, $a0
2757ad3f1dSXiaodong Liu; LA32-NEXT:    beqz $a0, .LBB0_2
2857ad3f1dSXiaodong Liu; LA32-NEXT:  # %bb.1: # %bb2
29983a0ae5Swanglei; LA32-NEXT:  .Ltmp0:
30983a0ae5Swanglei; LA32-NEXT:    move $a0, $fp
31983a0ae5Swanglei; LA32-NEXT:    bl %plt(bar)
32983a0ae5Swanglei; LA32-NEXT:  .Ltmp1:
33983a0ae5Swanglei; LA32-NEXT:    b .LBB0_3
3457ad3f1dSXiaodong Liu; LA32-NEXT:  .LBB0_2: # %bb1
35983a0ae5Swanglei; LA32-NEXT:  .Ltmp2:
36983a0ae5Swanglei; LA32-NEXT:    move $a0, $fp
37983a0ae5Swanglei; LA32-NEXT:    bl %plt(foo)
38983a0ae5Swanglei; LA32-NEXT:  .Ltmp3:
39983a0ae5Swanglei; LA32-NEXT:  .LBB0_3: # %end2
40983a0ae5Swanglei; LA32-NEXT:    ld.w $s0, $sp, 4 # 4-byte Folded Reload
41983a0ae5Swanglei; LA32-NEXT:    ld.w $fp, $sp, 8 # 4-byte Folded Reload
42983a0ae5Swanglei; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
43983a0ae5Swanglei; LA32-NEXT:    addi.w $sp, $sp, 16
44983a0ae5Swanglei; LA32-NEXT:    ret
45983a0ae5Swanglei; LA32-NEXT:  .LBB0_4: # %lpad
46983a0ae5Swanglei; LA32-NEXT:  .Ltmp4:
47983a0ae5Swanglei; LA32-NEXT:    move $s0, $a0
48983a0ae5Swanglei; LA32-NEXT:    move $a0, $fp
49983a0ae5Swanglei; LA32-NEXT:    bl callee
50983a0ae5Swanglei; LA32-NEXT:    move $a0, $s0
51983a0ae5Swanglei; LA32-NEXT:    bl %plt(_Unwind_Resume)
52983a0ae5Swanglei;
53983a0ae5Swanglei; LA64-LABEL: caller:
54983a0ae5Swanglei; LA64:       # %bb.0: # %entry
55983a0ae5Swanglei; LA64-NEXT:    addi.d $sp, $sp, -32
56983a0ae5Swanglei; LA64-NEXT:    .cfi_def_cfa_offset 32
57983a0ae5Swanglei; LA64-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
58983a0ae5Swanglei; LA64-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
59983a0ae5Swanglei; LA64-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
60983a0ae5Swanglei; LA64-NEXT:    .cfi_offset 1, -8
61983a0ae5Swanglei; LA64-NEXT:    .cfi_offset 22, -16
62983a0ae5Swanglei; LA64-NEXT:    .cfi_offset 23, -24
63983a0ae5Swanglei; LA64-NEXT:    move $fp, $a0
6457ad3f1dSXiaodong Liu; LA64-NEXT:    beqz $a0, .LBB0_2
6557ad3f1dSXiaodong Liu; LA64-NEXT:  # %bb.1: # %bb2
66983a0ae5Swanglei; LA64-NEXT:  .Ltmp0:
67983a0ae5Swanglei; LA64-NEXT:    move $a0, $fp
68983a0ae5Swanglei; LA64-NEXT:    bl %plt(bar)
69983a0ae5Swanglei; LA64-NEXT:  .Ltmp1:
70983a0ae5Swanglei; LA64-NEXT:    b .LBB0_3
7157ad3f1dSXiaodong Liu; LA64-NEXT:  .LBB0_2: # %bb1
72983a0ae5Swanglei; LA64-NEXT:  .Ltmp2:
73983a0ae5Swanglei; LA64-NEXT:    move $a0, $fp
74983a0ae5Swanglei; LA64-NEXT:    bl %plt(foo)
75983a0ae5Swanglei; LA64-NEXT:  .Ltmp3:
76983a0ae5Swanglei; LA64-NEXT:  .LBB0_3: # %end2
77983a0ae5Swanglei; LA64-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
78983a0ae5Swanglei; LA64-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
79983a0ae5Swanglei; LA64-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
80983a0ae5Swanglei; LA64-NEXT:    addi.d $sp, $sp, 32
81983a0ae5Swanglei; LA64-NEXT:    ret
82983a0ae5Swanglei; LA64-NEXT:  .LBB0_4: # %lpad
83983a0ae5Swanglei; LA64-NEXT:  .Ltmp4:
84983a0ae5Swanglei; LA64-NEXT:    move $s0, $a0
85983a0ae5Swanglei; LA64-NEXT:    move $a0, $fp
86983a0ae5Swanglei; LA64-NEXT:    bl callee
87983a0ae5Swanglei; LA64-NEXT:    move $a0, $s0
88983a0ae5Swanglei; LA64-NEXT:    bl %plt(_Unwind_Resume)
89983a0ae5Swangleientry:
90983a0ae5Swanglei  %0 = icmp eq ptr %p, null
91983a0ae5Swanglei  br i1 %0, label %bb1, label %bb2
92983a0ae5Swanglei
93983a0ae5Swangleibb1:
94983a0ae5Swanglei  invoke void @foo(ptr %p) to label %end1 unwind label %lpad
95983a0ae5Swanglei
96983a0ae5Swangleibb2:
97983a0ae5Swanglei  invoke void @bar(ptr %p) to label %end2 unwind label %lpad
98983a0ae5Swanglei
99983a0ae5Swangleilpad:
100983a0ae5Swanglei  %1 = landingpad { ptr, i32 } cleanup
101983a0ae5Swanglei  call void @callee(ptr %p)
102983a0ae5Swanglei  resume { ptr, i32 } %1
103983a0ae5Swanglei
104983a0ae5Swangleiend1:
105983a0ae5Swanglei  ret void
106983a0ae5Swanglei
107983a0ae5Swangleiend2:
108983a0ae5Swanglei  ret void
109983a0ae5Swanglei}
110983a0ae5Swanglei
111983a0ae5Swangleidefine internal void @callee(ptr %p) {
112983a0ae5Swanglei; LA32-LABEL: callee:
113983a0ae5Swanglei; LA32:       # %bb.0:
114983a0ae5Swanglei; LA32-NEXT:    ret
115983a0ae5Swanglei;
116983a0ae5Swanglei; LA64-LABEL: callee:
117983a0ae5Swanglei; LA64:       # %bb.0:
118983a0ae5Swanglei; LA64-NEXT:    ret
119983a0ae5Swanglei  ret void
120983a0ae5Swanglei}
121