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