| ; This checks to ensure that Subzero aligns spill slots. |
| |
| ; TODO(kschimpf) Find out why lc2i needed. |
| ; REQUIRES: allow_llvm_ir_as_input |
| ; RUN: %lc2i -i %s --args --verbose none \ |
| ; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \ |
| ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s |
| ; RUN: %lc2i -i %s --args -O2 --verbose none \ |
| ; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \ |
| ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s |
| |
| ; The location of the stack slot for a variable is inferred from the |
| ; return sequence. |
| |
| ; In this file, "global" refers to a variable with a live range across |
| ; multiple basic blocks (not an LLVM global variable) and "local" |
| ; refers to a variable that is live in only a single basic block. |
| |
| define <4 x i32> @align_global_vector(i32 %arg) { |
| entry: |
| %vec.global = insertelement <4 x i32> undef, i32 %arg, i32 0 |
| br label %block |
| block: |
| call void @ForceXmmSpills() |
| ret <4 x i32> %vec.global |
| ; CHECK-LABEL: align_global_vector: |
| ; CHECK: movups xmm0, xmmword ptr [esp] |
| ; CHECK-NEXT: add esp, 28 |
| ; CHECK-NEXT: ret |
| } |
| |
| define <4 x i32> @align_local_vector(i32 %arg) { |
| entry: |
| br label %block |
| block: |
| %vec.local = insertelement <4 x i32> undef, i32 %arg, i32 0 |
| call void @ForceXmmSpills() |
| ret <4 x i32> %vec.local |
| ; CHECK-LABEL: align_local_vector: |
| ; CHECK: movups xmm0, xmmword ptr [esp] |
| ; CHECK-NEXT: add esp, 28 |
| ; CHECK-NEXT: ret |
| } |
| |
| declare void @ForceXmmSpills() |
| |
| define <4 x i32> @align_global_vector_ebp_based(i32 %arg) { |
| entry: |
| %alloc = alloca i8, i32 1, align 1 |
| %vec.global = insertelement <4 x i32> undef, i32 %arg, i32 0 |
| br label %block |
| block: |
| call void @ForceXmmSpillsAndUseAlloca(i8* %alloc) |
| ret <4 x i32> %vec.global |
| ; CHECK-LABEL: align_global_vector_ebp_based: |
| ; CHECK: movups xmm0, xmmword ptr [ebp - 24] |
| ; CHECK-NEXT: mov esp, ebp |
| ; CHECK-NEXT: pop ebp |
| ; CHECK: ret |
| } |
| |
| define <4 x i32> @align_local_vector_ebp_based(i32 %arg) { |
| entry: |
| %alloc = alloca i8, i32 1, align 1 |
| %vec.local = insertelement <4 x i32> undef, i32 %arg, i32 0 |
| call void @ForceXmmSpillsAndUseAlloca(i8* %alloc) |
| ret <4 x i32> %vec.local |
| ; CHECK-LABEL: align_local_vector_ebp_based: |
| ; CHECK: movups xmm0, xmmword ptr [ebp - 24] |
| ; CHECK-NEXT: mov esp, ebp |
| ; CHECK-NEXT: pop ebp |
| ; CHECK: ret |
| } |
| |
| define <4 x i32> @align_local_vector_and_global_float(i32 %arg) { |
| entry: |
| %float.global = sitofp i32 %arg to float |
| call void @ForceXmmSpillsAndUseFloat(float %float.global) |
| br label %block |
| block: |
| %vec.local = insertelement <4 x i32> undef, i32 undef, i32 0 |
| call void @ForceXmmSpillsAndUseFloat(float %float.global) |
| ret <4 x i32> %vec.local |
| ; CHECK-LABEL: align_local_vector_and_global_float: |
| ; CHECK: cvtsi2ss xmm0, eax |
| ; CHECK-NEXT: movss dword ptr [esp + {{12|28}}], xmm0 |
| ; CHECK: movups xmm0, xmmword ptr [{{esp|esp \+ 16}}] |
| ; CHECK-NEXT: add esp, 44 |
| ; CHECK-NEXT: ret |
| } |
| |
| declare void @ForceXmmSpillsAndUseAlloca(i8*) |
| declare void @ForceXmmSpillsAndUseFloat(float) |