[llvm] 1d0cceb - [ARM] Don't allocate memory if free space in segmented stack is just enough

John Brawn via llvm-commits llvm-commits at lists.llvm.org
Tue May 2 05:10:21 PDT 2023


Author: Zhiyao Ma
Date: 2023-05-02T13:09:49+01:00
New Revision: 1d0ccebcd725309399262af346494242b064e2ed

URL: https://github.com/llvm/llvm-project/commit/1d0ccebcd725309399262af346494242b064e2ed
DIFF: https://github.com/llvm/llvm-project/commit/1d0ccebcd725309399262af346494242b064e2ed.diff

LOG: [ARM] Don't allocate memory if free space in segmented stack is just enough

Assuming that the stack grows downwards, it is fine if the stack
pointer is exactly at the stacklet boundary. We should use
less-or-equal condition when deciding whether to skip new memory
allocation.

Differential Revision: https://reviews.llvm.org/D149315

Added: 
    

Modified: 
    llvm/lib/Target/ARM/ARMFrameLowering.cpp
    llvm/test/CodeGen/ARM/debug-segmented-stacks.ll
    llvm/test/CodeGen/ARM/segmented-stacks-dynamic.ll
    llvm/test/CodeGen/ARM/segmented-stacks.ll
    llvm/test/CodeGen/Thumb/segmented-stacks-dynamic.ll
    llvm/test/CodeGen/Thumb/segmented-stacks.ll
    llvm/test/CodeGen/Thumb2/segmented-stacks.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp
index 643313daf9288..4496d4928ebe9 100644
--- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp
@@ -3168,12 +3168,12 @@ void ARMFrameLowering::adjustForSegmentedStacks(
       .addReg(ScratchReg1)
       .add(predOps(ARMCC::AL));
 
-  // This jump is taken if StackLimit < SP - stack required.
+  // This jump is taken if StackLimit <= SP - stack required.
   Opcode = Thumb ? ARM::tBcc : ARM::Bcc;
-  BuildMI(GetMBB, DL, TII.get(Opcode)).addMBB(PostStackMBB)
-       .addImm(ARMCC::LO)
-       .addReg(ARM::CPSR);
-
+  BuildMI(GetMBB, DL, TII.get(Opcode))
+      .addMBB(PostStackMBB)
+      .addImm(ARMCC::LS)
+      .addReg(ARM::CPSR);
 
   // Calling __morestack(StackSize, Size of stack arguments).
   // __morestack knows that the stack size requested is in SR0(r4)

diff  --git a/llvm/test/CodeGen/ARM/debug-segmented-stacks.ll b/llvm/test/CodeGen/ARM/debug-segmented-stacks.ll
index 06050cbe8f841..e2f32fb45e206 100644
--- a/llvm/test/CodeGen/ARM/debug-segmented-stacks.ll
+++ b/llvm/test/CodeGen/ARM/debug-segmented-stacks.ll
@@ -20,7 +20,7 @@ define void @test_basic() #0 !dbg !4 {
 ; ARM-linux-NEXT: mov     r5, sp
 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
 ; ARM-linux-NEXT: cmp     r4, r5
-; ARM-linux-NEXT: blo     .LBB0_2
+; ARM-linux-NEXT: bls     .LBB0_2
 
 ; ARM-linux:      mov     r4, #48
 ; ARM-linux-NEXT: mov     r5, #0

diff  --git a/llvm/test/CodeGen/ARM/segmented-stacks-dynamic.ll b/llvm/test/CodeGen/ARM/segmented-stacks-dynamic.ll
index 6bfa7a3508b20..ca589afbb933a 100644
--- a/llvm/test/CodeGen/ARM/segmented-stacks-dynamic.ll
+++ b/llvm/test/CodeGen/ARM/segmented-stacks-dynamic.ll
@@ -27,7 +27,7 @@ false:
 ; ARM-linux-NEXT: mov     r5, sp
 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
 ; ARM-linux-NEXT: cmp     r4, r5
-; ARM-linux-NEXT: blo     .LBB0_2
+; ARM-linux-NEXT: bls     .LBB0_2
 
 ; ARM-linux:      mov     r4, #16
 ; ARM-linux-NEXT: mov     r5, #0
@@ -47,7 +47,7 @@ false:
 ; ARM-android-NEXT: mov     r5, sp
 ; ARM-android-NEXT: ldr     r4, [r4, #252]
 ; ARM-android-NEXT: cmp     r4, r5
-; ARM-android-NEXT: blo     .LBB0_2
+; ARM-android-NEXT: bls     .LBB0_2
 
 ; ARM-android:      mov     r4, #16
 ; ARM-android-NEXT: mov     r5, #0

diff  --git a/llvm/test/CodeGen/ARM/segmented-stacks.ll b/llvm/test/CodeGen/ARM/segmented-stacks.ll
index 3acae3ccf3236..a9c3be81562d2 100644
--- a/llvm/test/CodeGen/ARM/segmented-stacks.ll
+++ b/llvm/test/CodeGen/ARM/segmented-stacks.ll
@@ -21,7 +21,7 @@ define void @test_basic() #0 {
 ; ARM-linux-NEXT: mov     r5, sp
 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
 ; ARM-linux-NEXT: cmp     r4, r5
-; ARM-linux-NEXT: blo     .LBB0_2
+; ARM-linux-NEXT: bls     .LBB0_2
 
 ; ARM-linux:      mov     r4, #48
 ; ARM-linux-NEXT: mov     r5, #0
@@ -40,7 +40,7 @@ define void @test_basic() #0 {
 ; ARM-android-NEXT: mov     r5, sp
 ; ARM-android-NEXT: ldr     r4, [r4, #252]
 ; ARM-android-NEXT: cmp     r4, r5
-; ARM-android-NEXT: blo     .LBB0_2
+; ARM-android-NEXT: bls     .LBB0_2
 
 ; ARM-android:      mov     r4, #48
 ; ARM-android-NEXT: mov     r5, #0
@@ -68,7 +68,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
 ; ARM-linux-NEXT: mov     r5, sp
 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
 ; ARM-linux-NEXT: cmp     r4, r5
-; ARM-linux-NEXT: blo     .LBB1_2
+; ARM-linux-NEXT: bls     .LBB1_2
 
 ; ARM-linux:      mov     r4, #56
 ; ARM-linux-NEXT: mov     r5, #0
@@ -87,7 +87,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
 ; ARM-android-NEXT: mov     r5, sp
 ; ARM-android-NEXT: ldr     r4, [r4, #252]
 ; ARM-android-NEXT: cmp     r4, r5
-; ARM-android-NEXT: blo     .LBB1_2
+; ARM-android-NEXT: bls     .LBB1_2
 
 ; ARM-android:      mov     r4, #56
 ; ARM-android-NEXT: mov     r5, #0
@@ -114,7 +114,7 @@ define void @test_large() #0 {
 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
 ; ARM-linux-NEXT: cmp     r4, r5
-; ARM-linux-NEXT: blo     .LBB2_2
+; ARM-linux-NEXT: bls     .LBB2_2
 
 ; ARM-linux:      ldr     r4, .LCPI2_0
 ; ARM-linux-NEXT: mov     r5, #0
@@ -137,7 +137,7 @@ define void @test_large() #0 {
 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
 ; ARM-android-NEXT: ldr     r4, [r4, #252]
 ; ARM-android-NEXT: cmp     r4, r5
-; ARM-android-NEXT: blo     .LBB2_2
+; ARM-android-NEXT: bls     .LBB2_2
 
 ; ARM-android:      ldr     r4, .LCPI2_0
 ; ARM-android-NEXT: mov     r5, #0
@@ -166,7 +166,7 @@ define fastcc void @test_fastcc() #0 {
 ; ARM-linux-NEXT: mov     r5, sp
 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
 ; ARM-linux-NEXT: cmp     r4, r5
-; ARM-linux-NEXT: blo     .LBB3_2
+; ARM-linux-NEXT: bls     .LBB3_2
 
 ; ARM-linux:      mov     r4, #48
 ; ARM-linux-NEXT: mov     r5, #0
@@ -185,7 +185,7 @@ define fastcc void @test_fastcc() #0 {
 ; ARM-android-NEXT: mov     r5, sp
 ; ARM-android-NEXT: ldr     r4, [r4, #252]
 ; ARM-android-NEXT: cmp     r4, r5
-; ARM-android-NEXT: blo     .LBB3_2
+; ARM-android-NEXT: bls     .LBB3_2
 
 ; ARM-android:      mov     r4, #48
 ; ARM-android-NEXT: mov     r5, #0
@@ -212,7 +212,7 @@ define fastcc void @test_fastcc_large() #0 {
 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
 ; ARM-linux-NEXT: cmp     r4, r5
-; ARM-linux-NEXT: blo     .LBB4_2
+; ARM-linux-NEXT: bls     .LBB4_2
 
 ; ARM-linux:      ldr     r4, .LCPI4_0
 ; ARM-linux-NEXT: mov     r5, #0
@@ -235,7 +235,7 @@ define fastcc void @test_fastcc_large() #0 {
 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
 ; ARM-android-NEXT: ldr     r4, [r4, #252]
 ; ARM-android-NEXT: cmp     r4, r5
-; ARM-android-NEXT: blo     .LBB4_2
+; ARM-android-NEXT: bls     .LBB4_2
 
 ; ARM-android:      ldr     r4, .LCPI4_0
 ; ARM-android-NEXT: mov     r5, #0

diff  --git a/llvm/test/CodeGen/Thumb/segmented-stacks-dynamic.ll b/llvm/test/CodeGen/Thumb/segmented-stacks-dynamic.ll
index 4f8c39f6496b5..ed554ea84aff5 100644
--- a/llvm/test/CodeGen/Thumb/segmented-stacks-dynamic.ll
+++ b/llvm/test/CodeGen/Thumb/segmented-stacks-dynamic.ll
@@ -27,7 +27,7 @@ false:
 ; Thumb-linux-NEXT: ldr r4, .LCPI0_0
 ; Thumb-linux-NEXT: ldr r4, [r4]
 ; Thumb-linux-NEXT: cmp	r4, r5
-; Thumb-linux-NEXT: blo	.LBB0_2
+; Thumb-linux-NEXT: bls	.LBB0_2
 
 ; Thumb-linux:      mov r4, #16
 ; Thumb-linux-NEXT: mov r5, #0
@@ -47,7 +47,7 @@ false:
 ; Thumb-android-NEXT: ldr r4, .LCPI0_0
 ; Thumb-android-NEXT: ldr r4, [r4]
 ; Thumb-android-NEXT: cmp	r4, r5
-; Thumb-android-NEXT: blo	.LBB0_2
+; Thumb-android-NEXT: bls	.LBB0_2
 
 ; Thumb-android:      mov r4, #16
 ; Thumb-android-NEXT: mov r5, #0

diff  --git a/llvm/test/CodeGen/Thumb/segmented-stacks.ll b/llvm/test/CodeGen/Thumb/segmented-stacks.ll
index c3b66b3b91320..1118f4cc98e5b 100644
--- a/llvm/test/CodeGen/Thumb/segmented-stacks.ll
+++ b/llvm/test/CodeGen/Thumb/segmented-stacks.ll
@@ -19,7 +19,7 @@ define void @test_basic() #0 {
 ; Thumb-android-NEXT: ldr     r4, .LCPI0_0
 ; Thumb-android-NEXT: ldr     r4, [r4]
 ; Thumb-android-NEXT: cmp     r4, r5
-; Thumb-android-NEXT: blo     .LBB0_2
+; Thumb-android-NEXT: bls     .LBB0_2
 
 ; Thumb-android:      mov     r4, #48
 ; Thumb-android-NEXT: mov     r5, #0
@@ -43,7 +43,7 @@ define void @test_basic() #0 {
 ; Thumb-linux-NEXT: ldr     r4, .LCPI0_0
 ; Thumb-linux-NEXT: ldr     r4, [r4]
 ; Thumb-linux-NEXT: cmp     r4, r5
-; Thumb-linux-NEXT: blo     .LBB0_2
+; Thumb-linux-NEXT: bls     .LBB0_2
 
 ; Thumb-linux:      mov     r4, #48
 ; Thumb-linux-NEXT: mov     r5, #0
@@ -72,7 +72,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
 ; Thumb-android-NEXT: ldr     r4, .LCPI1_0
 ; Thumb-android-NEXT: ldr     r4, [r4]
 ; Thumb-android-NEXT: cmp     r4, r5
-; Thumb-android-NEXT: blo     .LBB1_2
+; Thumb-android-NEXT: bls     .LBB1_2
 
 ; Thumb-android:      mov     r4, #56
 ; Thumb-android-NEXT: mov     r5, #0
@@ -92,7 +92,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
 ; Thumb-linux-NEXT: ldr     r4, .LCPI1_0
 ; Thumb-linux-NEXT: ldr     r4, [r4]
 ; Thumb-linux-NEXT: cmp     r4, r5
-; Thumb-linux-NEXT: blo     .LBB1_2
+; Thumb-linux-NEXT: bls     .LBB1_2
 
 ; Thumb-linux:      mov     r4, #56
 ; Thumb-linux-NEXT: mov     r5, #0
@@ -121,7 +121,7 @@ define void @test_large() #0 {
 ; Thumb-android-NEXT: ldr     r4, .LCPI2_3
 ; Thumb-android-NEXT: ldr     r4, [r4]
 ; Thumb-android-NEXT: cmp     r4, r5
-; Thumb-android-NEXT: blo     .LBB2_2
+; Thumb-android-NEXT: bls     .LBB2_2
 
 ; Thumb-android:      ldr     r4, .LCPI2_2
 ; Thumb-android-NEXT: mov     r5, #0
@@ -146,7 +146,7 @@ define void @test_large() #0 {
 ; Thumb-linux-NEXT: ldr     r4, .LCPI2_3
 ; Thumb-linux-NEXT: ldr     r4, [r4]
 ; Thumb-linux-NEXT: cmp     r4, r5
-; Thumb-linux-NEXT: blo     .LBB2_2
+; Thumb-linux-NEXT: bls     .LBB2_2
 
 ; Thumb-linux:      ldr     r4, .LCPI2_2
 ; Thumb-linux-NEXT: mov     r5, #0
@@ -173,7 +173,7 @@ define fastcc void @test_fastcc() #0 {
 ; Thumb-android-NEXT: ldr     r4, .LCPI3_0
 ; Thumb-android-NEXT: ldr     r4, [r4]
 ; Thumb-android-NEXT: cmp     r4, r5
-; Thumb-android-NEXT: blo     .LBB3_2
+; Thumb-android-NEXT: bls     .LBB3_2
 
 ; Thumb-android:      mov     r4, #48
 ; Thumb-android-NEXT: mov     r5, #0
@@ -193,7 +193,7 @@ define fastcc void @test_fastcc() #0 {
 ; Thumb-linux-NEXT: ldr     r4, .LCPI3_0
 ; Thumb-linux-NEXT: ldr     r4, [r4]
 ; Thumb-linux-NEXT: cmp     r4, r5
-; Thumb-linux-NEXT: blo     .LBB3_2
+; Thumb-linux-NEXT: bls     .LBB3_2
 
 ; Thumb-linux:      mov     r4, #48
 ; Thumb-linux-NEXT: mov     r5, #0
@@ -222,7 +222,7 @@ define fastcc void @test_fastcc_large() #0 {
 ; Thumb-android-NEXT: ldr     r4, .LCPI4_3
 ; Thumb-android-NEXT: ldr     r4, [r4]
 ; Thumb-android-NEXT: cmp     r4, r5
-; Thumb-android-NEXT: blo     .LBB4_2
+; Thumb-android-NEXT: bls     .LBB4_2
 
 ; Thumb-android:      ldr     r4, .LCPI4_2
 ; Thumb-android-NEXT: mov     r5, #0
@@ -247,7 +247,7 @@ define fastcc void @test_fastcc_large() #0 {
 ; Thumb-linux-NEXT: ldr     r4, .LCPI4_3
 ; Thumb-linux-NEXT: ldr     r4, [r4]
 ; Thumb-linux-NEXT: cmp     r4, r5
-; Thumb-linux-NEXT: blo     .LBB4_2
+; Thumb-linux-NEXT: bls     .LBB4_2
 
 ; Thumb-linux:      ldr     r4, .LCPI4_2
 ; Thumb-linux-NEXT: mov     r5, #0

diff  --git a/llvm/test/CodeGen/Thumb2/segmented-stacks.ll b/llvm/test/CodeGen/Thumb2/segmented-stacks.ll
index 6d3dbf4eb38f6..60f029c13719e 100644
--- a/llvm/test/CodeGen/Thumb2/segmented-stacks.ll
+++ b/llvm/test/CodeGen/Thumb2/segmented-stacks.ll
@@ -14,7 +14,7 @@ define void @test_basic() #0 {
 ; THUMB-NEXT:    mov r5, sp
 ; THUMB-NEXT:    ldr.w r4, [r4, #252]
 ; THUMB-NEXT:    cmp r4, r5
-; THUMB-NEXT:    blo .LBB0_2
+; THUMB-NEXT:    bls .LBB0_2
 ; THUMB-NEXT:  @ %bb.1:
 ; THUMB-NEXT:    mov r4, #48
 ; THUMB-NEXT:    mov r5, #0
@@ -42,7 +42,7 @@ define void @test_basic() #0 {
 ; ARM-NEXT:    mov r5, sp
 ; ARM-NEXT:    ldr r4, [r4, #252]
 ; ARM-NEXT:    cmp r4, r5
-; ARM-NEXT:    blo .LBB0_2
+; ARM-NEXT:    bls .LBB0_2
 ; ARM-NEXT:  @ %bb.1:
 ; ARM-NEXT:    mov r4, #48
 ; ARM-NEXT:    mov r5, #0
@@ -82,7 +82,7 @@ define void @test_large() #0 {
 ; THUMB-NEXT:    mrc     p15, #0, r4, c13, c0, #3
 ; THUMB-NEXT:    ldr.w   r4, [r4, #252]
 ; THUMB-NEXT:    cmp     r4, r5
-; THUMB-NEXT:    blo     .LBB1_2
+; THUMB-NEXT:    bls     .LBB1_2
 
 ; THUMB:         movw    r4, #40192
 ; THUMB-NEXT:    movt    r4, #0
@@ -104,7 +104,7 @@ define void @test_large() #0 {
 ; ARM-NEXT:    mrc     p15, #0, r4, c13, c0, #3
 ; ARM-NEXT:    ldr     r4, [r4, #252]
 ; ARM-NEXT:    cmp     r4, r5
-; ARM-NEXT:    blo     .LBB1_2
+; ARM-NEXT:    bls     .LBB1_2
 
 ; ARM:         ldr     r4, .LCPI1_0
 ; ARM-NEXT:    mov     r5, #0
@@ -136,7 +136,7 @@ define fastcc void @test_fastcc_large() #0 {
 ; THUMB-NEXT:    mrc     p15, #0, r4, c13, c0, #3
 ; THUMB-NEXT:    ldr.w   r4, [r4, #252]
 ; THUMB-NEXT:    cmp     r4, r5
-; THUMB-NEXT:    blo     .LBB2_2
+; THUMB-NEXT:    bls     .LBB2_2
 
 ; THUMB:         movw    r4, #40192
 ; THUMB-NEXT:    movt    r4, #0
@@ -157,7 +157,7 @@ define fastcc void @test_fastcc_large() #0 {
 ; ARM-NEXT:    mrc     p15, #0, r4, c13, c0, #3
 ; ARM-NEXT:    ldr     r4, [r4, #252]
 ; ARM-NEXT:    cmp     r4, r5
-; ARM-NEXT:    blo     .LBB2_2
+; ARM-NEXT:    bls     .LBB2_2
 
 ; ARM:         ldr     r4, .LCPI2_0
 ; ARM-NEXT:    mov     r5, #0


        


More information about the llvm-commits mailing list