[libc++][NFC] Simplify the implementation of string and string_views operator== ...
[llvm-project.git] / llvm / test / CodeGen / LoongArch / can-not-realign-stack.ll
blob6d5cf5a9429312075d90db60d8cf31452f26c7fa
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc --mtriple=loongarch64 --frame-pointer=none --mattr=+lasx < %s | FileCheck %s
4 ;; This test is checking that when a function allows stack realignment and
5 ;; realignment needs were not detected before register allocation (at this
6 ;; point, fp is not preserved), but realignment is required during register
7 ;; allocation, the stack should not undergo realignment.
9 ;; Ensure that the `bstrins.d $sp, $zero, n, 0` instruction is not generated.
10 ;; n = log2(realign_size) - 1
12 %struct.S = type { [64 x i16] }
14 define dso_local noundef signext i32 @main() nounwind {
15 ; CHECK-LABEL: main:
16 ; CHECK:       # %bb.0: # %entry
17 ; CHECK-NEXT:    addi.d $sp, $sp, -272
18 ; CHECK-NEXT:    st.d $ra, $sp, 264 # 8-byte Folded Spill
19 ; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_0)
20 ; CHECK-NEXT:    xvld $xr0, $a0, %pc_lo12(.LCPI0_0)
21 ; CHECK-NEXT:    xvst $xr0, $sp, 96 # 32-byte Folded Spill
22 ; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_1)
23 ; CHECK-NEXT:    xvld $xr1, $a0, %pc_lo12(.LCPI0_1)
24 ; CHECK-NEXT:    xvst $xr1, $sp, 64 # 32-byte Folded Spill
25 ; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_2)
26 ; CHECK-NEXT:    xvld $xr2, $a0, %pc_lo12(.LCPI0_2)
27 ; CHECK-NEXT:    xvst $xr2, $sp, 32 # 32-byte Folded Spill
28 ; CHECK-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI0_3)
29 ; CHECK-NEXT:    xvld $xr3, $a0, %pc_lo12(.LCPI0_3)
30 ; CHECK-NEXT:    xvst $xr3, $sp, 0 # 32-byte Folded Spill
31 ; CHECK-NEXT:    xvst $xr0, $sp, 136
32 ; CHECK-NEXT:    xvst $xr1, $sp, 168
33 ; CHECK-NEXT:    xvst $xr2, $sp, 200
34 ; CHECK-NEXT:    xvst $xr3, $sp, 232
35 ; CHECK-NEXT:    addi.d $a0, $sp, 136
36 ; CHECK-NEXT:    bl %plt(foo)
37 ; CHECK-NEXT:    xvld $xr0, $sp, 96 # 32-byte Folded Reload
38 ; CHECK-NEXT:    xvst $xr0, $sp, 136
39 ; CHECK-NEXT:    xvld $xr0, $sp, 64 # 32-byte Folded Reload
40 ; CHECK-NEXT:    xvst $xr0, $sp, 168
41 ; CHECK-NEXT:    xvld $xr0, $sp, 32 # 32-byte Folded Reload
42 ; CHECK-NEXT:    xvst $xr0, $sp, 200
43 ; CHECK-NEXT:    xvld $xr0, $sp, 0 # 32-byte Folded Reload
44 ; CHECK-NEXT:    xvst $xr0, $sp, 232
45 ; CHECK-NEXT:    addi.d $a0, $sp, 136
46 ; CHECK-NEXT:    bl %plt(bar)
47 ; CHECK-NEXT:    move $a0, $zero
48 ; CHECK-NEXT:    ld.d $ra, $sp, 264 # 8-byte Folded Reload
49 ; CHECK-NEXT:    addi.d $sp, $sp, 272
50 ; CHECK-NEXT:    ret
51 entry:
52   %s = alloca %struct.S, align 2
53   call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %s)
54   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
55   %0 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 16
56   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
57   %1 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 32
58   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
59   %2 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 48
60   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
61   call void @foo(ptr noundef nonnull %s)
62   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
63   %3 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 16
64   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
65   %4 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 32
66   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
67   %5 = getelementptr inbounds [64 x i16], ptr %s, i64 0, i64 48
68   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
69   call void @bar(ptr noundef nonnull %s)
70   call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %s)
71   ret i32 0
74 declare void @foo(ptr nocapture noundef)
75 declare void @bar(ptr nocapture noundef)
77 declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
78 declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)