xref: /llvm-project/llvm/test/CodeGen/LoongArch/frameaddr-returnaddr.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4
5declare ptr @llvm.frameaddress(i32)
6declare ptr @llvm.returnaddress(i32)
7
8define ptr @test_frameaddress_0() nounwind {
9; LA32-LABEL: test_frameaddress_0:
10; LA32:       # %bb.0:
11; LA32-NEXT:    addi.w $sp, $sp, -16
12; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
13; LA32-NEXT:    st.w $fp, $sp, 8 # 4-byte Folded Spill
14; LA32-NEXT:    addi.w $fp, $sp, 16
15; LA32-NEXT:    move $a0, $fp
16; LA32-NEXT:    ld.w $fp, $sp, 8 # 4-byte Folded Reload
17; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
18; LA32-NEXT:    addi.w $sp, $sp, 16
19; LA32-NEXT:    ret
20;
21; LA64-LABEL: test_frameaddress_0:
22; LA64:       # %bb.0:
23; LA64-NEXT:    addi.d $sp, $sp, -16
24; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
25; LA64-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
26; LA64-NEXT:    addi.d $fp, $sp, 16
27; LA64-NEXT:    move $a0, $fp
28; LA64-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
29; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
30; LA64-NEXT:    addi.d $sp, $sp, 16
31; LA64-NEXT:    ret
32  %1 = call ptr @llvm.frameaddress(i32 0)
33  ret ptr %1
34}
35
36define ptr @test_frameaddress_2() nounwind {
37; LA32-LABEL: test_frameaddress_2:
38; LA32:       # %bb.0:
39; LA32-NEXT:    addi.w $sp, $sp, -16
40; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
41; LA32-NEXT:    st.w $fp, $sp, 8 # 4-byte Folded Spill
42; LA32-NEXT:    addi.w $fp, $sp, 16
43; LA32-NEXT:    ld.w $a0, $fp, -8
44; LA32-NEXT:    ld.w $a0, $a0, -8
45; LA32-NEXT:    ld.w $fp, $sp, 8 # 4-byte Folded Reload
46; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
47; LA32-NEXT:    addi.w $sp, $sp, 16
48; LA32-NEXT:    ret
49;
50; LA64-LABEL: test_frameaddress_2:
51; LA64:       # %bb.0:
52; LA64-NEXT:    addi.d $sp, $sp, -16
53; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
54; LA64-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
55; LA64-NEXT:    addi.d $fp, $sp, 16
56; LA64-NEXT:    ld.d $a0, $fp, -16
57; LA64-NEXT:    ld.d $a0, $a0, -16
58; LA64-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
59; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
60; LA64-NEXT:    addi.d $sp, $sp, 16
61; LA64-NEXT:    ret
62  %1 = call ptr @llvm.frameaddress(i32 2)
63  ret ptr %1
64}
65
66define ptr @test_returnaddress_0() nounwind {
67; LA32-LABEL: test_returnaddress_0:
68; LA32:       # %bb.0:
69; LA32-NEXT:    move $a0, $ra
70; LA32-NEXT:    ret
71;
72; LA64-LABEL: test_returnaddress_0:
73; LA64:       # %bb.0:
74; LA64-NEXT:    move $a0, $ra
75; LA64-NEXT:    ret
76  %1 = call ptr @llvm.returnaddress(i32 0)
77  ret ptr %1
78}
79