Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: tests_lit/llvm2ice_tests/alloc.ll

Issue 1426933003: Subzero: Force ebp-based frame when an alloca has a large alignment. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceTargetLoweringX86BaseImpl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 ; This is a basic test of the alloca instruction. 1 ; This is a basic test of the alloca instruction.
2 2
3 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 3 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
4 ; RUN: --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \ 4 ; RUN: --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \
5 ; RUN: | %if --need=target_X8632 --command FileCheck %s 5 ; RUN: | %if --need=target_X8632 --command FileCheck %s
6 6
7 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 7 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
8 ; RUN: --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \ 8 ; RUN: --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \
9 ; RUN: | %if --need=target_X8632 --command FileCheck %s 9 ; RUN: | %if --need=target_X8632 --command FileCheck %s
10 10
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 ; ARM32: bl {{.*}} R_{{.*}} f1 43 ; ARM32: bl {{.*}} R_{{.*}} f1
44 44
45 define internal void @fixed_416_align_32(i32 %n) { 45 define internal void @fixed_416_align_32(i32 %n) {
46 entry: 46 entry:
47 %array = alloca i8, i32 400, align 32 47 %array = alloca i8, i32 400, align 32
48 %__2 = ptrtoint i8* %array to i32 48 %__2 = ptrtoint i8* %array to i32
49 call void @f1(i32 %__2) 49 call void @f1(i32 %__2)
50 ret void 50 ret void
51 } 51 }
52 ; CHECK-LABEL: fixed_416_align_32 52 ; CHECK-LABEL: fixed_416_align_32
53 ; CHECK: push ebp
54 ; CHECK-NEXT: mov ebp,esp
53 ; CHECK: and esp,0xffffffe0 55 ; CHECK: and esp,0xffffffe0
54 ; CHECK: sub esp,0x1a0 56 ; CHECK: sub esp,0x1a0
55 ; CHECK: sub esp,0x10 57 ; CHECK: sub esp,0x10
56 ; CHECK: mov DWORD PTR [esp],eax 58 ; CHECK: mov DWORD PTR [esp],eax
57 ; CHECK: call {{.*}} R_{{.*}} f1 59 ; CHECK: call {{.*}} R_{{.*}} f1
58 60
59 ; ARM32-LABEL: fixed_416_align_32 61 ; ARM32-LABEL: fixed_416_align_32
60 ; ARM32: bic sp, sp, #31 62 ; ARM32: bic sp, sp, #31
61 ; ARM32: sub sp, sp, #416 63 ; ARM32: sub sp, sp, #416
62 ; ARM32: bl {{.*}} R_{{.*}} f1 64 ; ARM32: bl {{.*}} R_{{.*}} f1
(...skipping 17 matching lines...) Expand all
80 ; ARM32: bl {{.*}} R_{{.*}} f1 82 ; ARM32: bl {{.*}} R_{{.*}} f1
81 83
82 define internal void @fixed_351_align_32(i32 %n) { 84 define internal void @fixed_351_align_32(i32 %n) {
83 entry: 85 entry:
84 %array = alloca i8, i32 351, align 32 86 %array = alloca i8, i32 351, align 32
85 %__2 = ptrtoint i8* %array to i32 87 %__2 = ptrtoint i8* %array to i32
86 call void @f1(i32 %__2) 88 call void @f1(i32 %__2)
87 ret void 89 ret void
88 } 90 }
89 ; CHECK-LABEL: fixed_351_align_32 91 ; CHECK-LABEL: fixed_351_align_32
92 ; CHECK: push ebp
93 ; CHECK-NEXT: mov ebp,esp
90 ; CHECK: and esp,0xffffffe0 94 ; CHECK: and esp,0xffffffe0
91 ; CHECK: sub esp,0x160 95 ; CHECK: sub esp,0x160
92 ; CHECK: sub esp,0x10 96 ; CHECK: sub esp,0x10
93 ; CHECK: mov DWORD PTR [esp],eax 97 ; CHECK: mov DWORD PTR [esp],eax
94 ; CHECK: call {{.*}} R_{{.*}} f1 98 ; CHECK: call {{.*}} R_{{.*}} f1
95 99
96 ; ARM32-LABEL: fixed_351_align_32 100 ; ARM32-LABEL: fixed_351_align_32
97 ; ARM32: bic sp, sp, #31 101 ; ARM32: bic sp, sp, #31
98 ; ARM32: sub sp, sp, #352 102 ; ARM32: sub sp, sp, #352
99 ; ARM32: bl {{.*}} R_{{.*}} f1 103 ; ARM32: bl {{.*}} R_{{.*}} f1
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 ; Test a large alignment where a mask might not fit in an immediate 182 ; Test a large alignment where a mask might not fit in an immediate
179 ; field of an instruction for some architectures. 183 ; field of an instruction for some architectures.
180 define internal void @align1MB(i32 %n) { 184 define internal void @align1MB(i32 %n) {
181 entry: 185 entry:
182 %array = alloca i8, i32 %n, align 1048576 186 %array = alloca i8, i32 %n, align 1048576
183 %__2 = ptrtoint i8* %array to i32 187 %__2 = ptrtoint i8* %array to i32
184 call void @f2(i32 %__2) 188 call void @f2(i32 %__2)
185 ret void 189 ret void
186 } 190 }
187 ; CHECK-LABEL: align1MB 191 ; CHECK-LABEL: align1MB
192 ; CHECK: push ebp
193 ; CHECK-NEXT: mov ebp,esp
188 ; CHECK: and esp,0xfff00000 194 ; CHECK: and esp,0xfff00000
189 ; CHECK: add [[REG:.*]],0xfffff 195 ; CHECK: add [[REG:.*]],0xfffff
190 ; CHECK: and [[REG]],0xfff00000 196 ; CHECK: and [[REG]],0xfff00000
191 ; CHECK: sub esp,[[REG]] 197 ; CHECK: sub esp,[[REG]]
192 198
193 ; ARM32-LABEL: align1MB 199 ; ARM32-LABEL: align1MB
194 ; ARM32: movw [[REG:.*]], #0 200 ; ARM32: movw [[REG:.*]], #0
195 ; ARM32: movt [[REG]], #65520 ; 0xfff0 201 ; ARM32: movt [[REG]], #65520 ; 0xfff0
196 ; ARM32: and sp, sp, [[REG]] 202 ; ARM32: and sp, sp, [[REG]]
197 ; ARM32: movw [[REG2:.*]], #65535 ; 0xffff 203 ; ARM32: movw [[REG2:.*]], #65535 ; 0xffff
198 ; ARM32: movt [[REG2]], #15 204 ; ARM32: movt [[REG2]], #15
199 ; ARM32: add r0, r0, [[REG2]] 205 ; ARM32: add r0, r0, [[REG2]]
200 ; ARM32: movw [[REG3:.*]], #0 206 ; ARM32: movw [[REG3:.*]], #0
201 ; ARM32: movt [[REG3]], #65520 ; 0xfff0 207 ; ARM32: movt [[REG3]], #65520 ; 0xfff0
202 ; ARM32: and r0, r0, [[REG3]] 208 ; ARM32: and r0, r0, [[REG3]]
203 ; ARM32: sub sp, sp, r0 209 ; ARM32: sub sp, sp, r0
204 210
205 ; Test a large alignment where a mask might still fit in an immediate 211 ; Test a large alignment where a mask might still fit in an immediate
206 ; field of an instruction for some architectures. 212 ; field of an instruction for some architectures.
207 define internal void @align512MB(i32 %n) { 213 define internal void @align512MB(i32 %n) {
208 entry: 214 entry:
209 %array = alloca i8, i32 %n, align 536870912 215 %array = alloca i8, i32 %n, align 536870912
210 %__2 = ptrtoint i8* %array to i32 216 %__2 = ptrtoint i8* %array to i32
211 call void @f2(i32 %__2) 217 call void @f2(i32 %__2)
212 ret void 218 ret void
213 } 219 }
214 ; CHECK-LABEL: align512MB 220 ; CHECK-LABEL: align512MB
221 ; CHECK: push ebp
222 ; CHECK-NEXT: mov ebp,esp
215 ; CHECK: and esp,0xe0000000 223 ; CHECK: and esp,0xe0000000
216 ; CHECK: add [[REG:.*]],0x1fffffff 224 ; CHECK: add [[REG:.*]],0x1fffffff
217 ; CHECK: and [[REG]],0xe0000000 225 ; CHECK: and [[REG]],0xe0000000
218 ; CHECK: sub esp,[[REG]] 226 ; CHECK: sub esp,[[REG]]
219 227
220 ; ARM32-LABEL: align512MB 228 ; ARM32-LABEL: align512MB
221 ; ARM32: and sp, sp, #-536870912 ; 0xe0000000 229 ; ARM32: and sp, sp, #-536870912 ; 0xe0000000
222 ; ARM32: mvn [[REG:.*]], #-536870912 ; 0xe0000000 230 ; ARM32: mvn [[REG:.*]], #-536870912 ; 0xe0000000
223 ; ARM32: add r0, r0, [[REG]] 231 ; ARM32: add r0, r0, [[REG]]
224 ; ARM32: and r0, r0, #-536870912 ; 0xe0000000 232 ; ARM32: and r0, r0, #-536870912 ; 0xe0000000
225 ; ARM32: sub sp, sp, r0 233 ; ARM32: sub sp, sp, r0
226 234
227 ; Test that a simple alloca sequence doesn't trigger a frame pointer. 235 ; Test that a simple alloca sequence doesn't trigger a frame pointer.
228 define internal void @fixed_no_frameptr(i32 %arg) { 236 define internal void @fixed_no_frameptr(i32 %arg) {
229 entry: 237 entry:
230 %a1 = alloca i8, i32 8, align 4 238 %a1 = alloca i8, i32 8, align 4
231 %a2 = alloca i8, i32 12, align 4 239 %a2 = alloca i8, i32 12, align 4
232 %a3 = alloca i8, i32 16, align 4 240 %a3 = alloca i8, i32 16, align 4
233 %p1 = bitcast i8* %a1 to i32* 241 %p1 = bitcast i8* %a1 to i32*
234 %p2 = bitcast i8* %a2 to i32* 242 %p2 = bitcast i8* %a2 to i32*
235 %p3 = bitcast i8* %a3 to i32* 243 %p3 = bitcast i8* %a3 to i32*
236 store i32 %arg, i32* %p1, align 1 244 store i32 %arg, i32* %p1, align 1
237 store i32 %arg, i32* %p2, align 1 245 store i32 %arg, i32* %p2, align 1
238 store i32 %arg, i32* %p3, align 1 246 store i32 %arg, i32* %p3, align 1
239 ret void 247 ret void
240 } 248 }
241 ; CHECK-LABEL: fixed_no_frameptr 249 ; CHECK-LABEL: fixed_no_frameptr
242 ; CHECK-NOT: mov ebp,esp 250 ; CHECK-NOT: mov ebp,esp
243 251
252 ; Test that a simple alloca sequence with at least one large alignment does
253 ; trigger a frame pointer.
254 define internal void @fixed_bigalign_with_frameptr(i32 %arg) {
255 entry:
256 %a1 = alloca i8, i32 8, align 4
257 %a2 = alloca i8, i32 12, align 4
258 %a3 = alloca i8, i32 16, align 64
259 %p1 = bitcast i8* %a1 to i32*
260 %p2 = bitcast i8* %a2 to i32*
261 %p3 = bitcast i8* %a3 to i32*
262 store i32 %arg, i32* %p1, align 1
263 store i32 %arg, i32* %p2, align 1
264 store i32 %arg, i32* %p3, align 1
265 ret void
266 }
267 ; CHECK-LABEL: fixed_bigalign_with_frameptr
268 ; CHECK: mov ebp,esp
269
244 ; Test that a more complex alloca sequence does trigger a frame pointer. 270 ; Test that a more complex alloca sequence does trigger a frame pointer.
245 define internal void @var_with_frameptr(i32 %arg) { 271 define internal void @var_with_frameptr(i32 %arg) {
246 entry: 272 entry:
247 %a1 = alloca i8, i32 8, align 4 273 %a1 = alloca i8, i32 8, align 4
248 %a2 = alloca i8, i32 12, align 4 274 %a2 = alloca i8, i32 12, align 4
249 %a3 = alloca i8, i32 %arg, align 4 275 %a3 = alloca i8, i32 %arg, align 4
250 %p1 = bitcast i8* %a1 to i32* 276 %p1 = bitcast i8* %a1 to i32*
251 %p2 = bitcast i8* %a2 to i32* 277 %p2 = bitcast i8* %a2 to i32*
252 %p3 = bitcast i8* %a3 to i32* 278 %p3 = bitcast i8* %a3 to i32*
253 store i32 %arg, i32* %p1, align 1 279 store i32 %arg, i32* %p1, align 1
254 store i32 %arg, i32* %p2, align 1 280 store i32 %arg, i32* %p2, align 1
255 store i32 %arg, i32* %p3, align 1 281 store i32 %arg, i32* %p3, align 1
256 ret void 282 ret void
257 } 283 }
258 ; CHECK-LABEL: var_with_frameptr 284 ; CHECK-LABEL: var_with_frameptr
259 ; CHECK: mov ebp,esp 285 ; CHECK: mov ebp,esp
OLDNEW
« no previous file with comments | « src/IceTargetLoweringX86BaseImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698