xref: /llvm-project/llvm/test/CodeGen/LoongArch/can-not-realign-stack.ll (revision 985d64b03accbed8500a85372d716367d89b61be)
198c6aa72Swanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
298c6aa72Swanglei; RUN: llc --mtriple=loongarch64 --frame-pointer=none --mattr=+lasx < %s | FileCheck %s
3f499472dSwanglei
498c6aa72Swanglei;; This test is checking that when a function allows stack realignment and
598c6aa72Swanglei;; realignment needs were not detected before register allocation (at this
698c6aa72Swanglei;; point, fp is not preserved), but realignment is required during register
798c6aa72Swanglei;; allocation, the stack should not undergo realignment.
8f499472dSwanglei
998c6aa72Swanglei;; Ensure that the `bstrins.d $sp, $zero, n, 0` instruction is not generated.
1098c6aa72Swanglei;; n = log2(realign_size) - 1
11f499472dSwanglei
12f499472dSwanglei%struct.S = type { [64 x i16] }
13f499472dSwanglei
14f499472dSwangleidefine dso_local noundef signext i32 @main() nounwind {
1598c6aa72Swanglei; CHECK-LABEL: main:
1698c6aa72Swanglei; CHECK:       # %bb.0: # %entry
1798c6aa72Swanglei; CHECK-NEXT:    addi.d $sp, $sp, -272
1898c6aa72Swanglei; CHECK-NEXT:    st.d $ra, $sp, 264 # 8-byte Folded Spill
1998c6aa72Swanglei; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_0)
20*985d64b0Shev; CHECK-NEXT:    xvld $xr0, $a0, %pc_lo12(.LCPI0_0)
2198c6aa72Swanglei; CHECK-NEXT:    xvst $xr0, $sp, 96 # 32-byte Folded Spill
2298c6aa72Swanglei; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_1)
23*985d64b0Shev; CHECK-NEXT:    xvld $xr1, $a0, %pc_lo12(.LCPI0_1)
2498c6aa72Swanglei; CHECK-NEXT:    xvst $xr1, $sp, 64 # 32-byte Folded Spill
2598c6aa72Swanglei; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_2)
26*985d64b0Shev; CHECK-NEXT:    xvld $xr2, $a0, %pc_lo12(.LCPI0_2)
27a5c90e48Swanglei; CHECK-NEXT:    xvst $xr2, $sp, 32 # 32-byte Folded Spill
2898c6aa72Swanglei; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_3)
29*985d64b0Shev; CHECK-NEXT:    xvld $xr3, $a0, %pc_lo12(.LCPI0_3)
30a5c90e48Swanglei; CHECK-NEXT:    xvst $xr3, $sp, 0 # 32-byte Folded Spill
312b6c2346Shev; CHECK-NEXT:    xvst $xr0, $sp, 136
322b6c2346Shev; CHECK-NEXT:    xvst $xr1, $sp, 168
332b6c2346Shev; CHECK-NEXT:    xvst $xr2, $sp, 200
342b6c2346Shev; CHECK-NEXT:    xvst $xr3, $sp, 232
352b6c2346Shev; CHECK-NEXT:    addi.d $a0, $sp, 136
3698c6aa72Swanglei; CHECK-NEXT:    bl %plt(foo)
3798c6aa72Swanglei; CHECK-NEXT:    xvld $xr0, $sp, 96 # 32-byte Folded Reload
382b6c2346Shev; CHECK-NEXT:    xvst $xr0, $sp, 136
39a5c90e48Swanglei; CHECK-NEXT:    xvld $xr0, $sp, 64 # 32-byte Folded Reload
402b6c2346Shev; CHECK-NEXT:    xvst $xr0, $sp, 168
41a5c90e48Swanglei; CHECK-NEXT:    xvld $xr0, $sp, 32 # 32-byte Folded Reload
422b6c2346Shev; CHECK-NEXT:    xvst $xr0, $sp, 200
43a5c90e48Swanglei; CHECK-NEXT:    xvld $xr0, $sp, 0 # 32-byte Folded Reload
442b6c2346Shev; CHECK-NEXT:    xvst $xr0, $sp, 232
452b6c2346Shev; CHECK-NEXT:    addi.d $a0, $sp, 136
4698c6aa72Swanglei; CHECK-NEXT:    bl %plt(bar)
4798c6aa72Swanglei; CHECK-NEXT:    move $a0, $zero
4898c6aa72Swanglei; CHECK-NEXT:    ld.d $ra, $sp, 264 # 8-byte Folded Reload
4998c6aa72Swanglei; CHECK-NEXT:    addi.d $sp, $sp, 272
5098c6aa72Swanglei; CHECK-NEXT:    ret
51f499472dSwangleientry:
52f499472dSwanglei  %s = alloca %struct.S, align 2
53f499472dSwanglei  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %s)
54f499472dSwanglei  store <16 x i16> <i16 16384, i16 16129, i16 15874, i16 15619, i16 15364, i16 15109, i16 14854, i16 14599, i16 14344, i16 14089, i16 13834, i16 13579, i16 13324, i16 13069, i16 12814, i16 12559>, ptr %s, align 2
55f499472dSwanglei  %0 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 16
56f499472dSwanglei  store <16 x i16> <i16 12304, i16 12049, i16 11794, i16 11539, i16 11284, i16 11029, i16 10774, i16 10519, i16 10264, i16 10009, i16 9754, i16 9499, i16 9244, i16 8989, i16 8734, i16 8479>, ptr %0, align 2
57f499472dSwanglei  %1 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 32
58f499472dSwanglei  store <16 x i16> <i16 8224, i16 7969, i16 7714, i16 7459, i16 7204, i16 6949, i16 6694, i16 6439, i16 6184, i16 5929, i16 5674, i16 5419, i16 5164, i16 4909, i16 4654, i16 4399>, ptr %1, align 2
59f499472dSwanglei  %2 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 48
60f499472dSwanglei  store <16 x i16> <i16 4144, i16 3889, i16 3634, i16 3379, i16 3124, i16 2869, i16 2614, i16 2359, i16 2104, i16 1849, i16 1594, i16 1339, i16 1084, i16 829, i16 574, i16 319>, ptr %2, align 2
61f499472dSwanglei  call void @foo(ptr noundef nonnull %s)
62f499472dSwanglei  store <16 x i16> <i16 16384, i16 16129, i16 15874, i16 15619, i16 15364, i16 15109, i16 14854, i16 14599, i16 14344, i16 14089, i16 13834, i16 13579, i16 13324, i16 13069, i16 12814, i16 12559>, ptr %s, align 2
63f499472dSwanglei  %3 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 16
64f499472dSwanglei  store <16 x i16> <i16 12304, i16 12049, i16 11794, i16 11539, i16 11284, i16 11029, i16 10774, i16 10519, i16 10264, i16 10009, i16 9754, i16 9499, i16 9244, i16 8989, i16 8734, i16 8479>, ptr %3, align 2
65f499472dSwanglei  %4 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 32
66f499472dSwanglei  store <16 x i16> <i16 8224, i16 7969, i16 7714, i16 7459, i16 7204, i16 6949, i16 6694, i16 6439, i16 6184, i16 5929, i16 5674, i16 5419, i16 5164, i16 4909, i16 4654, i16 4399>, ptr %4, align 2
67f499472dSwanglei  %5 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 48
68f499472dSwanglei  store <16 x i16> <i16 4144, i16 3889, i16 3634, i16 3379, i16 3124, i16 2869, i16 2614, i16 2359, i16 2104, i16 1849, i16 1594, i16 1339, i16 1084, i16 829, i16 574, i16 319>, ptr %5, align 2
69f499472dSwanglei  call void @bar(ptr noundef nonnull %s)
70f499472dSwanglei  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %s)
71f499472dSwanglei  ret i32 0
72f499472dSwanglei}
73f499472dSwanglei
74f499472dSwangleideclare void @foo(ptr nocapture noundef)
75f499472dSwangleideclare void @bar(ptr nocapture noundef)
76f499472dSwanglei
77f499472dSwangleideclare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
78f499472dSwangleideclare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
79