Skip to content

Commit 1d0cceb

Browse files
zyma98john-brawn-arm
authored andcommitted
[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
1 parent 39e8e59 commit 1d0cceb

7 files changed

+36
-36
lines changed

llvm/lib/Target/ARM/ARMFrameLowering.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3168,12 +3168,12 @@ void ARMFrameLowering::adjustForSegmentedStacks(
31683168
.addReg(ScratchReg1)
31693169
.add(predOps(ARMCC::AL));
31703170

3171-
// This jump is taken if StackLimit < SP - stack required.
3171+
// This jump is taken if StackLimit <= SP - stack required.
31723172
Opcode = Thumb ? ARM::tBcc : ARM::Bcc;
3173-
BuildMI(GetMBB, DL, TII.get(Opcode)).addMBB(PostStackMBB)
3174-
.addImm(ARMCC::LO)
3175-
.addReg(ARM::CPSR);
3176-
3173+
BuildMI(GetMBB, DL, TII.get(Opcode))
3174+
.addMBB(PostStackMBB)
3175+
.addImm(ARMCC::LS)
3176+
.addReg(ARM::CPSR);
31773177

31783178
// Calling __morestack(StackSize, Size of stack arguments).
31793179
// __morestack knows that the stack size requested is in SR0(r4)

llvm/test/CodeGen/ARM/debug-segmented-stacks.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ define void @test_basic() #0 !dbg !4 {
2020
; ARM-linux-NEXT: mov r5, sp
2121
; ARM-linux-NEXT: ldr r4, [r4, #4]
2222
; ARM-linux-NEXT: cmp r4, r5
23-
; ARM-linux-NEXT: blo .LBB0_2
23+
; ARM-linux-NEXT: bls .LBB0_2
2424

2525
; ARM-linux: mov r4, #48
2626
; ARM-linux-NEXT: mov r5, #0

llvm/test/CodeGen/ARM/segmented-stacks-dynamic.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ false:
2727
; ARM-linux-NEXT: mov r5, sp
2828
; ARM-linux-NEXT: ldr r4, [r4, #4]
2929
; ARM-linux-NEXT: cmp r4, r5
30-
; ARM-linux-NEXT: blo .LBB0_2
30+
; ARM-linux-NEXT: bls .LBB0_2
3131

3232
; ARM-linux: mov r4, #16
3333
; ARM-linux-NEXT: mov r5, #0
@@ -47,7 +47,7 @@ false:
4747
; ARM-android-NEXT: mov r5, sp
4848
; ARM-android-NEXT: ldr r4, [r4, #252]
4949
; ARM-android-NEXT: cmp r4, r5
50-
; ARM-android-NEXT: blo .LBB0_2
50+
; ARM-android-NEXT: bls .LBB0_2
5151

5252
; ARM-android: mov r4, #16
5353
; ARM-android-NEXT: mov r5, #0

llvm/test/CodeGen/ARM/segmented-stacks.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ define void @test_basic() #0 {
2121
; ARM-linux-NEXT: mov r5, sp
2222
; ARM-linux-NEXT: ldr r4, [r4, #4]
2323
; ARM-linux-NEXT: cmp r4, r5
24-
; ARM-linux-NEXT: blo .LBB0_2
24+
; ARM-linux-NEXT: bls .LBB0_2
2525

2626
; ARM-linux: mov r4, #48
2727
; ARM-linux-NEXT: mov r5, #0
@@ -40,7 +40,7 @@ define void @test_basic() #0 {
4040
; ARM-android-NEXT: mov r5, sp
4141
; ARM-android-NEXT: ldr r4, [r4, #252]
4242
; ARM-android-NEXT: cmp r4, r5
43-
; ARM-android-NEXT: blo .LBB0_2
43+
; ARM-android-NEXT: bls .LBB0_2
4444

4545
; ARM-android: mov r4, #48
4646
; ARM-android-NEXT: mov r5, #0
@@ -68,7 +68,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
6868
; ARM-linux-NEXT: mov r5, sp
6969
; ARM-linux-NEXT: ldr r4, [r4, #4]
7070
; ARM-linux-NEXT: cmp r4, r5
71-
; ARM-linux-NEXT: blo .LBB1_2
71+
; ARM-linux-NEXT: bls .LBB1_2
7272

7373
; ARM-linux: mov r4, #56
7474
; ARM-linux-NEXT: mov r5, #0
@@ -87,7 +87,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
8787
; ARM-android-NEXT: mov r5, sp
8888
; ARM-android-NEXT: ldr r4, [r4, #252]
8989
; ARM-android-NEXT: cmp r4, r5
90-
; ARM-android-NEXT: blo .LBB1_2
90+
; ARM-android-NEXT: bls .LBB1_2
9191

9292
; ARM-android: mov r4, #56
9393
; ARM-android-NEXT: mov r5, #0
@@ -114,7 +114,7 @@ define void @test_large() #0 {
114114
; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3
115115
; ARM-linux-NEXT: ldr r4, [r4, #4]
116116
; ARM-linux-NEXT: cmp r4, r5
117-
; ARM-linux-NEXT: blo .LBB2_2
117+
; ARM-linux-NEXT: bls .LBB2_2
118118

119119
; ARM-linux: ldr r4, .LCPI2_0
120120
; ARM-linux-NEXT: mov r5, #0
@@ -137,7 +137,7 @@ define void @test_large() #0 {
137137
; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3
138138
; ARM-android-NEXT: ldr r4, [r4, #252]
139139
; ARM-android-NEXT: cmp r4, r5
140-
; ARM-android-NEXT: blo .LBB2_2
140+
; ARM-android-NEXT: bls .LBB2_2
141141

142142
; ARM-android: ldr r4, .LCPI2_0
143143
; ARM-android-NEXT: mov r5, #0
@@ -166,7 +166,7 @@ define fastcc void @test_fastcc() #0 {
166166
; ARM-linux-NEXT: mov r5, sp
167167
; ARM-linux-NEXT: ldr r4, [r4, #4]
168168
; ARM-linux-NEXT: cmp r4, r5
169-
; ARM-linux-NEXT: blo .LBB3_2
169+
; ARM-linux-NEXT: bls .LBB3_2
170170

171171
; ARM-linux: mov r4, #48
172172
; ARM-linux-NEXT: mov r5, #0
@@ -185,7 +185,7 @@ define fastcc void @test_fastcc() #0 {
185185
; ARM-android-NEXT: mov r5, sp
186186
; ARM-android-NEXT: ldr r4, [r4, #252]
187187
; ARM-android-NEXT: cmp r4, r5
188-
; ARM-android-NEXT: blo .LBB3_2
188+
; ARM-android-NEXT: bls .LBB3_2
189189

190190
; ARM-android: mov r4, #48
191191
; ARM-android-NEXT: mov r5, #0
@@ -212,7 +212,7 @@ define fastcc void @test_fastcc_large() #0 {
212212
; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3
213213
; ARM-linux-NEXT: ldr r4, [r4, #4]
214214
; ARM-linux-NEXT: cmp r4, r5
215-
; ARM-linux-NEXT: blo .LBB4_2
215+
; ARM-linux-NEXT: bls .LBB4_2
216216

217217
; ARM-linux: ldr r4, .LCPI4_0
218218
; ARM-linux-NEXT: mov r5, #0
@@ -235,7 +235,7 @@ define fastcc void @test_fastcc_large() #0 {
235235
; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3
236236
; ARM-android-NEXT: ldr r4, [r4, #252]
237237
; ARM-android-NEXT: cmp r4, r5
238-
; ARM-android-NEXT: blo .LBB4_2
238+
; ARM-android-NEXT: bls .LBB4_2
239239

240240
; ARM-android: ldr r4, .LCPI4_0
241241
; ARM-android-NEXT: mov r5, #0

llvm/test/CodeGen/Thumb/segmented-stacks-dynamic.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ false:
2727
; Thumb-linux-NEXT: ldr r4, .LCPI0_0
2828
; Thumb-linux-NEXT: ldr r4, [r4]
2929
; Thumb-linux-NEXT: cmp r4, r5
30-
; Thumb-linux-NEXT: blo .LBB0_2
30+
; Thumb-linux-NEXT: bls .LBB0_2
3131

3232
; Thumb-linux: mov r4, #16
3333
; Thumb-linux-NEXT: mov r5, #0
@@ -47,7 +47,7 @@ false:
4747
; Thumb-android-NEXT: ldr r4, .LCPI0_0
4848
; Thumb-android-NEXT: ldr r4, [r4]
4949
; Thumb-android-NEXT: cmp r4, r5
50-
; Thumb-android-NEXT: blo .LBB0_2
50+
; Thumb-android-NEXT: bls .LBB0_2
5151

5252
; Thumb-android: mov r4, #16
5353
; Thumb-android-NEXT: mov r5, #0

llvm/test/CodeGen/Thumb/segmented-stacks.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ define void @test_basic() #0 {
1919
; Thumb-android-NEXT: ldr r4, .LCPI0_0
2020
; Thumb-android-NEXT: ldr r4, [r4]
2121
; Thumb-android-NEXT: cmp r4, r5
22-
; Thumb-android-NEXT: blo .LBB0_2
22+
; Thumb-android-NEXT: bls .LBB0_2
2323

2424
; Thumb-android: mov r4, #48
2525
; Thumb-android-NEXT: mov r5, #0
@@ -43,7 +43,7 @@ define void @test_basic() #0 {
4343
; Thumb-linux-NEXT: ldr r4, .LCPI0_0
4444
; Thumb-linux-NEXT: ldr r4, [r4]
4545
; Thumb-linux-NEXT: cmp r4, r5
46-
; Thumb-linux-NEXT: blo .LBB0_2
46+
; Thumb-linux-NEXT: bls .LBB0_2
4747

4848
; Thumb-linux: mov r4, #48
4949
; Thumb-linux-NEXT: mov r5, #0
@@ -72,7 +72,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
7272
; Thumb-android-NEXT: ldr r4, .LCPI1_0
7373
; Thumb-android-NEXT: ldr r4, [r4]
7474
; Thumb-android-NEXT: cmp r4, r5
75-
; Thumb-android-NEXT: blo .LBB1_2
75+
; Thumb-android-NEXT: bls .LBB1_2
7676

7777
; Thumb-android: mov r4, #56
7878
; Thumb-android-NEXT: mov r5, #0
@@ -92,7 +92,7 @@ define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
9292
; Thumb-linux-NEXT: ldr r4, .LCPI1_0
9393
; Thumb-linux-NEXT: ldr r4, [r4]
9494
; Thumb-linux-NEXT: cmp r4, r5
95-
; Thumb-linux-NEXT: blo .LBB1_2
95+
; Thumb-linux-NEXT: bls .LBB1_2
9696

9797
; Thumb-linux: mov r4, #56
9898
; Thumb-linux-NEXT: mov r5, #0
@@ -121,7 +121,7 @@ define void @test_large() #0 {
121121
; Thumb-android-NEXT: ldr r4, .LCPI2_3
122122
; Thumb-android-NEXT: ldr r4, [r4]
123123
; Thumb-android-NEXT: cmp r4, r5
124-
; Thumb-android-NEXT: blo .LBB2_2
124+
; Thumb-android-NEXT: bls .LBB2_2
125125

126126
; Thumb-android: ldr r4, .LCPI2_2
127127
; Thumb-android-NEXT: mov r5, #0
@@ -146,7 +146,7 @@ define void @test_large() #0 {
146146
; Thumb-linux-NEXT: ldr r4, .LCPI2_3
147147
; Thumb-linux-NEXT: ldr r4, [r4]
148148
; Thumb-linux-NEXT: cmp r4, r5
149-
; Thumb-linux-NEXT: blo .LBB2_2
149+
; Thumb-linux-NEXT: bls .LBB2_2
150150

151151
; Thumb-linux: ldr r4, .LCPI2_2
152152
; Thumb-linux-NEXT: mov r5, #0
@@ -173,7 +173,7 @@ define fastcc void @test_fastcc() #0 {
173173
; Thumb-android-NEXT: ldr r4, .LCPI3_0
174174
; Thumb-android-NEXT: ldr r4, [r4]
175175
; Thumb-android-NEXT: cmp r4, r5
176-
; Thumb-android-NEXT: blo .LBB3_2
176+
; Thumb-android-NEXT: bls .LBB3_2
177177

178178
; Thumb-android: mov r4, #48
179179
; Thumb-android-NEXT: mov r5, #0
@@ -193,7 +193,7 @@ define fastcc void @test_fastcc() #0 {
193193
; Thumb-linux-NEXT: ldr r4, .LCPI3_0
194194
; Thumb-linux-NEXT: ldr r4, [r4]
195195
; Thumb-linux-NEXT: cmp r4, r5
196-
; Thumb-linux-NEXT: blo .LBB3_2
196+
; Thumb-linux-NEXT: bls .LBB3_2
197197

198198
; Thumb-linux: mov r4, #48
199199
; Thumb-linux-NEXT: mov r5, #0
@@ -222,7 +222,7 @@ define fastcc void @test_fastcc_large() #0 {
222222
; Thumb-android-NEXT: ldr r4, .LCPI4_3
223223
; Thumb-android-NEXT: ldr r4, [r4]
224224
; Thumb-android-NEXT: cmp r4, r5
225-
; Thumb-android-NEXT: blo .LBB4_2
225+
; Thumb-android-NEXT: bls .LBB4_2
226226

227227
; Thumb-android: ldr r4, .LCPI4_2
228228
; Thumb-android-NEXT: mov r5, #0
@@ -247,7 +247,7 @@ define fastcc void @test_fastcc_large() #0 {
247247
; Thumb-linux-NEXT: ldr r4, .LCPI4_3
248248
; Thumb-linux-NEXT: ldr r4, [r4]
249249
; Thumb-linux-NEXT: cmp r4, r5
250-
; Thumb-linux-NEXT: blo .LBB4_2
250+
; Thumb-linux-NEXT: bls .LBB4_2
251251

252252
; Thumb-linux: ldr r4, .LCPI4_2
253253
; Thumb-linux-NEXT: mov r5, #0

llvm/test/CodeGen/Thumb2/segmented-stacks.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ define void @test_basic() #0 {
1414
; THUMB-NEXT: mov r5, sp
1515
; THUMB-NEXT: ldr.w r4, [r4, #252]
1616
; THUMB-NEXT: cmp r4, r5
17-
; THUMB-NEXT: blo .LBB0_2
17+
; THUMB-NEXT: bls .LBB0_2
1818
; THUMB-NEXT: @ %bb.1:
1919
; THUMB-NEXT: mov r4, #48
2020
; THUMB-NEXT: mov r5, #0
@@ -42,7 +42,7 @@ define void @test_basic() #0 {
4242
; ARM-NEXT: mov r5, sp
4343
; ARM-NEXT: ldr r4, [r4, #252]
4444
; ARM-NEXT: cmp r4, r5
45-
; ARM-NEXT: blo .LBB0_2
45+
; ARM-NEXT: bls .LBB0_2
4646
; ARM-NEXT: @ %bb.1:
4747
; ARM-NEXT: mov r4, #48
4848
; ARM-NEXT: mov r5, #0
@@ -82,7 +82,7 @@ define void @test_large() #0 {
8282
; THUMB-NEXT: mrc p15, #0, r4, c13, c0, #3
8383
; THUMB-NEXT: ldr.w r4, [r4, #252]
8484
; THUMB-NEXT: cmp r4, r5
85-
; THUMB-NEXT: blo .LBB1_2
85+
; THUMB-NEXT: bls .LBB1_2
8686

8787
; THUMB: movw r4, #40192
8888
; THUMB-NEXT: movt r4, #0
@@ -104,7 +104,7 @@ define void @test_large() #0 {
104104
; ARM-NEXT: mrc p15, #0, r4, c13, c0, #3
105105
; ARM-NEXT: ldr r4, [r4, #252]
106106
; ARM-NEXT: cmp r4, r5
107-
; ARM-NEXT: blo .LBB1_2
107+
; ARM-NEXT: bls .LBB1_2
108108

109109
; ARM: ldr r4, .LCPI1_0
110110
; ARM-NEXT: mov r5, #0
@@ -136,7 +136,7 @@ define fastcc void @test_fastcc_large() #0 {
136136
; THUMB-NEXT: mrc p15, #0, r4, c13, c0, #3
137137
; THUMB-NEXT: ldr.w r4, [r4, #252]
138138
; THUMB-NEXT: cmp r4, r5
139-
; THUMB-NEXT: blo .LBB2_2
139+
; THUMB-NEXT: bls .LBB2_2
140140

141141
; THUMB: movw r4, #40192
142142
; THUMB-NEXT: movt r4, #0
@@ -157,7 +157,7 @@ define fastcc void @test_fastcc_large() #0 {
157157
; ARM-NEXT: mrc p15, #0, r4, c13, c0, #3
158158
; ARM-NEXT: ldr r4, [r4, #252]
159159
; ARM-NEXT: cmp r4, r5
160-
; ARM-NEXT: blo .LBB2_2
160+
; ARM-NEXT: bls .LBB2_2
161161

162162
; ARM: ldr r4, .LCPI2_0
163163
; ARM-NEXT: mov r5, #0

0 commit comments

Comments
 (0)