| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |