OLD | NEW |
1 ; Tests basics and corner cases of x86-32 sandboxing, using -Om1 in | 1 ; Tests basics and corner cases of x86-32 sandboxing, using -Om1 in |
2 ; the hope that the output will remain stable. When packing bundles, | 2 ; the hope that the output will remain stable. When packing bundles, |
3 ; we try to limit to a few instructions with well known sizes and | 3 ; we try to limit to a few instructions with well known sizes and |
4 ; minimal use of registers and stack slots in the lowering sequence. | 4 ; minimal use of registers and stack slots in the lowering sequence. |
5 | 5 |
6 ; RUN: %p2i -i %s --assemble --disassemble --args -Om1 --verbose none \ | 6 ; RUN: %p2i -i %s --assemble --disassemble --args -Om1 --verbose none \ |
7 ; RUN: -ffunction-sections -sandbox | FileCheck %s | 7 ; RUN: -ffunction-sections -sandbox | FileCheck %s |
8 | 8 |
9 declare void @call_target() | 9 declare void @call_target() |
10 @global_byte = internal global [1 x i8] zeroinitializer | 10 @global_byte = internal global [1 x i8] zeroinitializer |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 ; CHECK-LABEL: bundle_lock_align_to_end_padding_2 | 223 ; CHECK-LABEL: bundle_lock_align_to_end_padding_2 |
224 ; CHECK: call | 224 ; CHECK: call |
225 ; CHECK-NEXT: 20: {{.*}} mov BYTE PTR | 225 ; CHECK-NEXT: 20: {{.*}} mov BYTE PTR |
226 ; CHECK-NEXT: 27: {{.*}} mov WORD PTR | 226 ; CHECK-NEXT: 27: {{.*}} mov WORD PTR |
227 ; CHECK-NEXT: 30: {{.*}} mov WORD PTR | 227 ; CHECK-NEXT: 30: {{.*}} mov WORD PTR |
228 ; CHECK-NEXT: 39: {{.*}} mov [[REG:.*]],DWORD PTR [esp | 228 ; CHECK-NEXT: 39: {{.*}} mov [[REG:.*]],DWORD PTR [esp |
229 ; CHECK-NEXT: 3d: {{.*}} nop | 229 ; CHECK-NEXT: 3d: {{.*}} nop |
230 ; CHECK: 40: {{.*}} nop | 230 ; CHECK: 40: {{.*}} nop |
231 ; CHECK: 5b: {{.*}} and [[REG]],0xffffffe0 | 231 ; CHECK: 5b: {{.*}} and [[REG]],0xffffffe0 |
232 ; CHECK-NEXT: 5e: {{.*}} call [[REG]] | 232 ; CHECK-NEXT: 5e: {{.*}} call [[REG]] |
| 233 |
| 234 ; Stack adjustment state during an argument push sequence gets |
| 235 ; properly checkpointed and restored during the two passes, as |
| 236 ; observed by the stack adjustment for accessing stack-allocated |
| 237 ; variables. |
| 238 define void @checkpoint_restore_stack_adjustment(i32 %arg) { |
| 239 entry: |
| 240 call void @call_target() |
| 241 ; bundle boundary |
| 242 call void @checkpoint_restore_stack_adjustment(i32 %arg) |
| 243 ret void |
| 244 } |
| 245 ; CHECK-LABEL: checkpoint_restore_stack_adjustment |
| 246 ; CHECK: call |
| 247 ; CHECK: sub esp,0x10 |
| 248 ; The address of %arg should be [esp+0x20], not [esp+0x30]. |
| 249 ; CHECK-NEXT: mov [[REG:.*]],DWORD PTR [esp+0x20] |
| 250 ; CHECK-NEXT: mov DWORD PTR [esp],[[REG]] |
| 251 ; CHECK: call |
| 252 ; CHECK: add esp,0x10 |
OLD | NEW |