xref: /llvm-project/llvm/test/CodeGen/LoongArch/frame.ll (revision 1897bf61f0bc85c8637997d0f2aa7d94d375d787)
156ab2f4cSwanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
29d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s
35b1ec705Swanglei
45b1ec705Swanglei%struct.key_t = type { i32, [16 x i8] }
55b1ec705Swanglei
6ff9af4c4SNikita Popovdeclare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
7c2a44b59SWANG Xueruideclare void @test1(ptr)
8c2a44b59SWANG Xuerui
95b1ec705Swangleidefine i32 @test() nounwind {
105b1ec705Swanglei; CHECK-LABEL: test:
115b1ec705Swanglei; CHECK:       # %bb.0:
12c2d1d9f9Swanglei; CHECK-NEXT:    addi.d $sp, $sp, -32
135b1ec705Swanglei; CHECK-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
145b1ec705Swanglei; CHECK-NEXT:    st.w $zero, $sp, 16
15*1897bf61SAmi-zhang; CHECK-NEXT:    vrepli.b $vr0, 0
16*1897bf61SAmi-zhang; CHECK-NEXT:    vst $vr0, $sp, 0
1756ab2f4cSwanglei; CHECK-NEXT:    addi.d $a0, $sp, 4
18c2ee21cfSwanglei; CHECK-NEXT:    bl %plt(test1)
195b1ec705Swanglei; CHECK-NEXT:    move $a0, $zero
205b1ec705Swanglei; CHECK-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
21c2d1d9f9Swanglei; CHECK-NEXT:    addi.d $sp, $sp, 32
22ed078c48SWANG Xuerui; CHECK-NEXT:    ret
235b1ec705Swanglei  %key = alloca %struct.key_t, align 4
24ff9af4c4SNikita Popov  call void @llvm.memset.p0.i64(ptr %key, i8 0, i64 20, i1 false)
255b1ec705Swanglei  %1 = getelementptr inbounds %struct.key_t, ptr %key, i64 0, i32 1, i64 0
265b1ec705Swanglei  call void @test1(ptr %1)
275b1ec705Swanglei  ret i32 0
285b1ec705Swanglei}
295b1ec705Swanglei
304e2364a2Swanglei;; Note: will create an emergency spill slot, if (!isInt<11>(StackSize)).
31c2a44b59SWANG Xuerui;; Should involve only one SP-adjusting addi per adjustment.
32c2a44b59SWANG Xueruidefine void @test_large_frame_size_2032() {
33c2a44b59SWANG Xuerui; CHECK-LABEL: test_large_frame_size_2032:
34c2a44b59SWANG Xuerui; CHECK:       # %bb.0:
35c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, -2032
36c2a44b59SWANG Xuerui; CHECK-NEXT:    .cfi_def_cfa_offset 2032
37c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, 2032
38c2a44b59SWANG Xuerui; CHECK-NEXT:    ret
394e2364a2Swanglei  %1 = alloca i8, i32 2016 ; + 16(emergency slot) = 2032
40c2a44b59SWANG Xuerui  ret void
41c2a44b59SWANG Xuerui}
425b1ec705Swanglei
43c2a44b59SWANG Xuerui;; Should involve two SP-adjusting addi's when adjusting SP up, but only one
44c2a44b59SWANG Xuerui;; when adjusting down.
45c2a44b59SWANG Xueruidefine void @test_large_frame_size_2048() {
46c2a44b59SWANG Xuerui; CHECK-LABEL: test_large_frame_size_2048:
47c2a44b59SWANG Xuerui; CHECK:       # %bb.0:
48c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, -2048
49c2a44b59SWANG Xuerui; CHECK-NEXT:    .cfi_def_cfa_offset 2048
50c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, 2032
51c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, 16
52c2a44b59SWANG Xuerui; CHECK-NEXT:    ret
534e2364a2Swanglei  %1 = alloca i8, i32 2032 ; + 16(emergency slot) = 2048
54c2a44b59SWANG Xuerui  ret void
55c2a44b59SWANG Xuerui}
56c2a44b59SWANG Xuerui
57c2a44b59SWANG Xuerui;; Should involve two SP-adjusting addi's per adjustment.
58c2a44b59SWANG Xueruidefine void @test_large_frame_size_2064() {
59c2a44b59SWANG Xuerui; CHECK-LABEL: test_large_frame_size_2064:
60c2a44b59SWANG Xuerui; CHECK:       # %bb.0:
61c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, -2048
62c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, -16
63c2a44b59SWANG Xuerui; CHECK-NEXT:    .cfi_def_cfa_offset 2064
64c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, 2032
65c2a44b59SWANG Xuerui; CHECK-NEXT:    addi.d $sp, $sp, 32
66c2a44b59SWANG Xuerui; CHECK-NEXT:    ret
674e2364a2Swanglei  %1 = alloca i8, i32 2048 ; + 16(emergency slot) = 2064
68c2a44b59SWANG Xuerui  ret void
69c2a44b59SWANG Xuerui}
70c2a44b59SWANG Xuerui
714e2364a2Swanglei;; NOTE: Due to the problem with the emegency spill slot, the scratch register
724e2364a2Swanglei;; will not be used when the fp is eliminated. To make this test valid, add the
734e2364a2Swanglei;; attribute "frame-pointer=all".
744e2364a2Swanglei
75c2a44b59SWANG Xuerui;; SP should be adjusted with help of a scratch register.
764e2364a2Swangleidefine void @test_large_frame_size_1234576() "frame-pointer"="all" {
77c2a44b59SWANG Xuerui; CHECK-LABEL: test_large_frame_size_1234576:
78c2a44b59SWANG Xuerui; CHECK:       # %bb.0:
794e2364a2Swanglei; CHECK-NEXT:    addi.d $sp, $sp, -2032
804e2364a2Swanglei; CHECK-NEXT:    .cfi_def_cfa_offset 2032
814e2364a2Swanglei; CHECK-NEXT:    st.d $ra, $sp, 2024 # 8-byte Folded Spill
824e2364a2Swanglei; CHECK-NEXT:    st.d $fp, $sp, 2016 # 8-byte Folded Spill
834e2364a2Swanglei; CHECK-NEXT:    .cfi_offset 1, -8
844e2364a2Swanglei; CHECK-NEXT:    .cfi_offset 22, -16
854e2364a2Swanglei; CHECK-NEXT:    addi.d $fp, $sp, 2032
864e2364a2Swanglei; CHECK-NEXT:    .cfi_def_cfa 22, 0
874e2364a2Swanglei; CHECK-NEXT:    lu12i.w $a0, 300
884e2364a2Swanglei; CHECK-NEXT:    ori $a0, $a0, 3760
89c2a44b59SWANG Xuerui; CHECK-NEXT:    sub.d $sp, $sp, $a0
904e2364a2Swanglei; CHECK-NEXT:    lu12i.w $a0, 300
914e2364a2Swanglei; CHECK-NEXT:    ori $a0, $a0, 3760
92c2a44b59SWANG Xuerui; CHECK-NEXT:    add.d $sp, $sp, $a0
934e2364a2Swanglei; CHECK-NEXT:    ld.d $fp, $sp, 2016 # 8-byte Folded Reload
944e2364a2Swanglei; CHECK-NEXT:    ld.d $ra, $sp, 2024 # 8-byte Folded Reload
954e2364a2Swanglei; CHECK-NEXT:    addi.d $sp, $sp, 2032
96c2a44b59SWANG Xuerui; CHECK-NEXT:    ret
97c2a44b59SWANG Xuerui  %1 = alloca i8, i32 1234567
98c2a44b59SWANG Xuerui  ret void
99c2a44b59SWANG Xuerui}
100