[X86] Update the fp128/i128 test to show stack alignment (NFC)#148753
Merged
phoebewang merged 1 commit intollvm:mainfrom Jul 15, 2025
Merged
[X86] Update the fp128/i128 test to show stack alignment (NFC)#148753phoebewang merged 1 commit intollvm:mainfrom
phoebewang merged 1 commit intollvm:mainfrom
Conversation
Adding an extra argument before a `fp128` only changes the stack offset by four bytes, while it should instead go in the next 16-aligned slot. Add a test demonstrating the current behavior. `no_x86_scrub_sp` is added because offset from the stack pointer is needed to show the problem. Relevant issue: llvm#77401
Member
|
@llvm/pr-subscribers-backend-x86 Author: Trevor Gross (tgross35) ChangesAdding an extra argument before a
Relevant issue: #77401 Patch is 30.11 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/148753.diff 1 Files Affected:
diff --git a/llvm/test/CodeGen/X86/i128-fp128-abi.ll b/llvm/test/CodeGen/X86/i128-fp128-abi.ll
index be8f7923b8f98..4152dcf07f7e7 100644
--- a/llvm/test/CodeGen/X86/i128-fp128-abi.ll
+++ b/llvm/test/CodeGen/X86/i128-fp128-abi.ll
@@ -1,4 +1,4 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
; Combined ABI tests for fp128 and i128
@@ -15,6 +15,154 @@
; RUN: sed 's/PrimTy/fp128/g' %s | sed 's/Prim0/0xL0/g' | llc -mtriple=i686-pc-windows-msvc -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-MSVC32
; RUN: sed 's/PrimTy/i128/g' %s | sed 's/Prim0/0/g' | llc -mtriple=i686-pc-windows-msvc -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-MSVC32
+define void @store(PrimTy %x, ptr %p) nounwind {
+; CHECK-X64-F128-LABEL: store:
+; CHECK-X64-F128: # %bb.0:
+; CHECK-X64-F128-NEXT: movaps %xmm0, (%rdi)
+; CHECK-X64-F128-NEXT: retq
+;
+; CHECK-X64-I128-LABEL: store:
+; CHECK-X64-I128: # %bb.0:
+; CHECK-X64-I128-NEXT: movq %rsi, 8(%rdx)
+; CHECK-X64-I128-NEXT: movq %rdi, (%rdx)
+; CHECK-X64-I128-NEXT: retq
+;
+; CHECK-MSVC64-F128-LABEL: store:
+; CHECK-MSVC64-F128: # %bb.0:
+; CHECK-MSVC64-F128-NEXT: movaps (%rcx), %xmm0
+; CHECK-MSVC64-F128-NEXT: movaps %xmm0, (%rdx)
+; CHECK-MSVC64-F128-NEXT: retq
+;
+; CHECK-MSVC64-I128-LABEL: store:
+; CHECK-MSVC64-I128: # %bb.0:
+; CHECK-MSVC64-I128-NEXT: movq %rdx, 8(%r8)
+; CHECK-MSVC64-I128-NEXT: movq %rcx, (%r8)
+; CHECK-MSVC64-I128-NEXT: retq
+;
+; CHECK-MINGW-F128-LABEL: store:
+; CHECK-MINGW-F128: # %bb.0:
+; CHECK-MINGW-F128-NEXT: movaps (%rcx), %xmm0
+; CHECK-MINGW-F128-NEXT: movaps %xmm0, (%rdx)
+; CHECK-MINGW-F128-NEXT: retq
+;
+; CHECK-MINGW-I128-LABEL: store:
+; CHECK-MINGW-I128: # %bb.0:
+; CHECK-MINGW-I128-NEXT: movq %rdx, 8(%r8)
+; CHECK-MINGW-I128-NEXT: movq %rcx, (%r8)
+; CHECK-MINGW-I128-NEXT: retq
+;
+; CHECK-X86-LABEL: store:
+; CHECK-X86: # %bb.0:
+; CHECK-X86-NEXT: pushl %edi
+; CHECK-X86-NEXT: pushl %esi
+; CHECK-X86-NEXT: movl 12(%esp), %eax
+; CHECK-X86-NEXT: movl 16(%esp), %ecx
+; CHECK-X86-NEXT: movl 20(%esp), %edx
+; CHECK-X86-NEXT: movl 24(%esp), %esi
+; CHECK-X86-NEXT: movl 28(%esp), %edi
+; CHECK-X86-NEXT: movl %esi, 12(%edi)
+; CHECK-X86-NEXT: movl %edx, 8(%edi)
+; CHECK-X86-NEXT: movl %ecx, 4(%edi)
+; CHECK-X86-NEXT: movl %eax, (%edi)
+; CHECK-X86-NEXT: popl %esi
+; CHECK-X86-NEXT: popl %edi
+; CHECK-X86-NEXT: retl
+;
+; CHECK-MSVC32-LABEL: store:
+; CHECK-MSVC32: # %bb.0:
+; CHECK-MSVC32-NEXT: pushl %edi
+; CHECK-MSVC32-NEXT: pushl %esi
+; CHECK-MSVC32-NEXT: movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT: movl 16(%esp), %ecx
+; CHECK-MSVC32-NEXT: movl 20(%esp), %edx
+; CHECK-MSVC32-NEXT: movl 24(%esp), %esi
+; CHECK-MSVC32-NEXT: movl 28(%esp), %edi
+; CHECK-MSVC32-NEXT: movl %esi, 12(%edi)
+; CHECK-MSVC32-NEXT: movl %edx, 8(%edi)
+; CHECK-MSVC32-NEXT: movl %ecx, 4(%edi)
+; CHECK-MSVC32-NEXT: movl %eax, (%edi)
+; CHECK-MSVC32-NEXT: popl %esi
+; CHECK-MSVC32-NEXT: popl %edi
+; CHECK-MSVC32-NEXT: retl
+ store PrimTy %x, ptr %p
+ ret void
+}
+
+; Illustrate stack alignment
+; FIXME(#77401): alignment on x86-32 is ABI-incorrect.
+define void @store_perturbed(i8 %_0, PrimTy %x, ptr %p) nounwind {
+; CHECK-X64-F128-LABEL: store_perturbed:
+; CHECK-X64-F128: # %bb.0:
+; CHECK-X64-F128-NEXT: movaps %xmm0, (%rsi)
+; CHECK-X64-F128-NEXT: retq
+;
+; CHECK-X64-I128-LABEL: store_perturbed:
+; CHECK-X64-I128: # %bb.0:
+; CHECK-X64-I128-NEXT: movq %rdx, 8(%rcx)
+; CHECK-X64-I128-NEXT: movq %rsi, (%rcx)
+; CHECK-X64-I128-NEXT: retq
+;
+; CHECK-MSVC64-F128-LABEL: store_perturbed:
+; CHECK-MSVC64-F128: # %bb.0:
+; CHECK-MSVC64-F128-NEXT: movaps (%rdx), %xmm0
+; CHECK-MSVC64-F128-NEXT: movaps %xmm0, (%r8)
+; CHECK-MSVC64-F128-NEXT: retq
+;
+; CHECK-MSVC64-I128-LABEL: store_perturbed:
+; CHECK-MSVC64-I128: # %bb.0:
+; CHECK-MSVC64-I128-NEXT: movq %r8, 8(%r9)
+; CHECK-MSVC64-I128-NEXT: movq %rdx, (%r9)
+; CHECK-MSVC64-I128-NEXT: retq
+;
+; CHECK-MINGW-F128-LABEL: store_perturbed:
+; CHECK-MINGW-F128: # %bb.0:
+; CHECK-MINGW-F128-NEXT: movaps (%rdx), %xmm0
+; CHECK-MINGW-F128-NEXT: movaps %xmm0, (%r8)
+; CHECK-MINGW-F128-NEXT: retq
+;
+; CHECK-MINGW-I128-LABEL: store_perturbed:
+; CHECK-MINGW-I128: # %bb.0:
+; CHECK-MINGW-I128-NEXT: movq %r8, 8(%r9)
+; CHECK-MINGW-I128-NEXT: movq %rdx, (%r9)
+; CHECK-MINGW-I128-NEXT: retq
+;
+; CHECK-X86-LABEL: store_perturbed:
+; CHECK-X86: # %bb.0:
+; CHECK-X86-NEXT: pushl %edi
+; CHECK-X86-NEXT: pushl %esi
+; CHECK-X86-NEXT: movl 16(%esp), %eax
+; CHECK-X86-NEXT: movl 20(%esp), %ecx
+; CHECK-X86-NEXT: movl 24(%esp), %edx
+; CHECK-X86-NEXT: movl 28(%esp), %esi
+; CHECK-X86-NEXT: movl 32(%esp), %edi
+; CHECK-X86-NEXT: movl %esi, 12(%edi)
+; CHECK-X86-NEXT: movl %edx, 8(%edi)
+; CHECK-X86-NEXT: movl %ecx, 4(%edi)
+; CHECK-X86-NEXT: movl %eax, (%edi)
+; CHECK-X86-NEXT: popl %esi
+; CHECK-X86-NEXT: popl %edi
+; CHECK-X86-NEXT: retl
+;
+; CHECK-MSVC32-LABEL: store_perturbed:
+; CHECK-MSVC32: # %bb.0:
+; CHECK-MSVC32-NEXT: pushl %edi
+; CHECK-MSVC32-NEXT: pushl %esi
+; CHECK-MSVC32-NEXT: movl 16(%esp), %eax
+; CHECK-MSVC32-NEXT: movl 20(%esp), %ecx
+; CHECK-MSVC32-NEXT: movl 24(%esp), %edx
+; CHECK-MSVC32-NEXT: movl 28(%esp), %esi
+; CHECK-MSVC32-NEXT: movl 32(%esp), %edi
+; CHECK-MSVC32-NEXT: movl %esi, 12(%edi)
+; CHECK-MSVC32-NEXT: movl %edx, 8(%edi)
+; CHECK-MSVC32-NEXT: movl %ecx, 4(%edi)
+; CHECK-MSVC32-NEXT: movl %eax, (%edi)
+; CHECK-MSVC32-NEXT: popl %esi
+; CHECK-MSVC32-NEXT: popl %edi
+; CHECK-MSVC32-NEXT: retl
+ store PrimTy %x, ptr %p
+ ret void
+}
+
define PrimTy @return(ptr %p) nounwind {
; CHECK-X64-F128-LABEL: return:
; CHECK-X64-F128: # %bb.0:
@@ -53,8 +201,8 @@ define PrimTy @return(ptr %p) nounwind {
; CHECK-X86: # %bb.0:
; CHECK-X86-NEXT: pushl %edi
; CHECK-X86-NEXT: pushl %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-X86-NEXT: movl 12(%esp), %eax
+; CHECK-X86-NEXT: movl 16(%esp), %ecx
; CHECK-X86-NEXT: movl (%ecx), %edx
; CHECK-X86-NEXT: movl 4(%ecx), %esi
; CHECK-X86-NEXT: movl 8(%ecx), %edi
@@ -71,8 +219,8 @@ define PrimTy @return(ptr %p) nounwind {
; CHECK-MSVC32: # %bb.0:
; CHECK-MSVC32-NEXT: pushl %edi
; CHECK-MSVC32-NEXT: pushl %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-MSVC32-NEXT: movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT: movl 16(%esp), %ecx
; CHECK-MSVC32-NEXT: movl (%ecx), %edx
; CHECK-MSVC32-NEXT: movl 4(%ecx), %esi
; CHECK-MSVC32-NEXT: movl 8(%ecx), %edi
@@ -123,11 +271,11 @@ define PrimTy @first_arg(PrimTy %x) nounwind {
; CHECK-X86: # %bb.0:
; CHECK-X86-NEXT: pushl %edi
; CHECK-X86-NEXT: pushl %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT: movl 12(%esp), %eax
+; CHECK-X86-NEXT: movl 16(%esp), %ecx
+; CHECK-X86-NEXT: movl 20(%esp), %edx
+; CHECK-X86-NEXT: movl 24(%esp), %esi
+; CHECK-X86-NEXT: movl 28(%esp), %edi
; CHECK-X86-NEXT: movl %edi, 12(%eax)
; CHECK-X86-NEXT: movl %esi, 8(%eax)
; CHECK-X86-NEXT: movl %edx, 4(%eax)
@@ -140,11 +288,11 @@ define PrimTy @first_arg(PrimTy %x) nounwind {
; CHECK-MSVC32: # %bb.0:
; CHECK-MSVC32-NEXT: pushl %edi
; CHECK-MSVC32-NEXT: pushl %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT: movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT: movl 16(%esp), %ecx
+; CHECK-MSVC32-NEXT: movl 20(%esp), %edx
+; CHECK-MSVC32-NEXT: movl 24(%esp), %esi
+; CHECK-MSVC32-NEXT: movl 28(%esp), %edi
; CHECK-MSVC32-NEXT: movl %edi, 12(%eax)
; CHECK-MSVC32-NEXT: movl %esi, 8(%eax)
; CHECK-MSVC32-NEXT: movl %edx, 4(%eax)
@@ -155,6 +303,8 @@ define PrimTy @first_arg(PrimTy %x) nounwind {
ret PrimTy %x
}
+; Leading args such that i128 is the last possible position where it still
+; gets passed in registers.
define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounwind {
; CHECK-X64-F128-LABEL: leading_args:
; CHECK-X64-F128: # %bb.0:
@@ -168,37 +318,37 @@ define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounw
;
; CHECK-MSVC64-F128-LABEL: leading_args:
; CHECK-MSVC64-F128: # %bb.0:
-; CHECK-MSVC64-F128-NEXT: movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MSVC64-F128-NEXT: movq 40(%rsp), %rax
; CHECK-MSVC64-F128-NEXT: movaps (%rax), %xmm0
; CHECK-MSVC64-F128-NEXT: retq
;
; CHECK-MSVC64-I128-LABEL: leading_args:
; CHECK-MSVC64-I128: # %bb.0:
-; CHECK-MSVC64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MSVC64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MSVC64-I128-NEXT: movq 40(%rsp), %rax
+; CHECK-MSVC64-I128-NEXT: movq 48(%rsp), %rdx
; CHECK-MSVC64-I128-NEXT: retq
;
; CHECK-MINGW-F128-LABEL: leading_args:
; CHECK-MINGW-F128: # %bb.0:
-; CHECK-MINGW-F128-NEXT: movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MINGW-F128-NEXT: movq 40(%rsp), %rax
; CHECK-MINGW-F128-NEXT: movaps (%rax), %xmm0
; CHECK-MINGW-F128-NEXT: retq
;
; CHECK-MINGW-I128-LABEL: leading_args:
; CHECK-MINGW-I128: # %bb.0:
-; CHECK-MINGW-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MINGW-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MINGW-I128-NEXT: movq 40(%rsp), %rax
+; CHECK-MINGW-I128-NEXT: movq 48(%rsp), %rdx
; CHECK-MINGW-I128-NEXT: retq
;
; CHECK-X86-LABEL: leading_args:
; CHECK-X86: # %bb.0:
; CHECK-X86-NEXT: pushl %edi
; CHECK-X86-NEXT: pushl %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT: movl 12(%esp), %eax
+; CHECK-X86-NEXT: movl 48(%esp), %ecx
+; CHECK-X86-NEXT: movl 52(%esp), %edx
+; CHECK-X86-NEXT: movl 56(%esp), %esi
+; CHECK-X86-NEXT: movl 60(%esp), %edi
; CHECK-X86-NEXT: movl %edi, 12(%eax)
; CHECK-X86-NEXT: movl %esi, 8(%eax)
; CHECK-X86-NEXT: movl %edx, 4(%eax)
@@ -211,11 +361,11 @@ define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounw
; CHECK-MSVC32: # %bb.0:
; CHECK-MSVC32-NEXT: pushl %edi
; CHECK-MSVC32-NEXT: pushl %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT: movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT: movl 48(%esp), %ecx
+; CHECK-MSVC32-NEXT: movl 52(%esp), %edx
+; CHECK-MSVC32-NEXT: movl 56(%esp), %esi
+; CHECK-MSVC32-NEXT: movl 60(%esp), %edi
; CHECK-MSVC32-NEXT: movl %edi, 12(%eax)
; CHECK-MSVC32-NEXT: movl %esi, 8(%eax)
; CHECK-MSVC32-NEXT: movl %edx, 4(%eax)
@@ -226,6 +376,7 @@ define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounw
ret PrimTy %x
}
+; The i128 of interest must be in memory.
define PrimTy @many_leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy %_5, PrimTy %x) nounwind {
; CHECK-X64-F128-LABEL: many_leading_args:
; CHECK-X64-F128: # %bb.0:
@@ -234,43 +385,43 @@ define PrimTy @many_leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, Pr
;
; CHECK-X64-I128-LABEL: many_leading_args:
; CHECK-X64-I128: # %bb.0:
-; CHECK-X64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-X64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-X64-I128-NEXT: movq 24(%rsp), %rax
+; CHECK-X64-I128-NEXT: movq 32(%rsp), %rdx
; CHECK-X64-I128-NEXT: retq
;
; CHECK-MSVC64-F128-LABEL: many_leading_args:
; CHECK-MSVC64-F128: # %bb.0:
-; CHECK-MSVC64-F128-NEXT: movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MSVC64-F128-NEXT: movq 56(%rsp), %rax
; CHECK-MSVC64-F128-NEXT: movaps (%rax), %xmm0
; CHECK-MSVC64-F128-NEXT: retq
;
; CHECK-MSVC64-I128-LABEL: many_leading_args:
; CHECK-MSVC64-I128: # %bb.0:
-; CHECK-MSVC64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MSVC64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MSVC64-I128-NEXT: movq 64(%rsp), %rax
+; CHECK-MSVC64-I128-NEXT: movq 72(%rsp), %rdx
; CHECK-MSVC64-I128-NEXT: retq
;
; CHECK-MINGW-F128-LABEL: many_leading_args:
; CHECK-MINGW-F128: # %bb.0:
-; CHECK-MINGW-F128-NEXT: movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MINGW-F128-NEXT: movq 56(%rsp), %rax
; CHECK-MINGW-F128-NEXT: movaps (%rax), %xmm0
; CHECK-MINGW-F128-NEXT: retq
;
; CHECK-MINGW-I128-LABEL: many_leading_args:
; CHECK-MINGW-I128: # %bb.0:
-; CHECK-MINGW-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MINGW-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MINGW-I128-NEXT: movq 64(%rsp), %rax
+; CHECK-MINGW-I128-NEXT: movq 72(%rsp), %rdx
; CHECK-MINGW-I128-NEXT: retq
;
; CHECK-X86-LABEL: many_leading_args:
; CHECK-X86: # %bb.0:
; CHECK-X86-NEXT: pushl %edi
; CHECK-X86-NEXT: pushl %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT: movl 12(%esp), %eax
+; CHECK-X86-NEXT: movl 72(%esp), %ecx
+; CHECK-X86-NEXT: movl 76(%esp), %edx
+; CHECK-X86-NEXT: movl 80(%esp), %esi
+; CHECK-X86-NEXT: movl 84(%esp), %edi
; CHECK-X86-NEXT: movl %edi, 12(%eax)
; CHECK-X86-NEXT: movl %esi, 8(%eax)
; CHECK-X86-NEXT: movl %edx, 4(%eax)
@@ -283,11 +434,11 @@ define PrimTy @many_leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, Pr
; CHECK-MSVC32: # %bb.0:
; CHECK-MSVC32-NEXT: pushl %edi
; CHECK-MSVC32-NEXT: pushl %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT: movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT: movl 72(%esp), %ecx
+; CHECK-MSVC32-NEXT: movl 76(%esp), %edx
+; CHECK-MSVC32-NEXT: movl 80(%esp), %esi
+; CHECK-MSVC32-NEXT: movl 84(%esp), %edi
; CHECK-MSVC32-NEXT: movl %edi, 12(%eax)
; CHECK-MSVC32-NEXT: movl %esi, 8(%eax)
; CHECK-MSVC32-NEXT: movl %edx, 4(%eax)
@@ -305,43 +456,43 @@ define PrimTy @trailing_arg(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy
;
; CHECK-X64-I128-LABEL: trailing_arg:
; CHECK-X64-I128: # %bb.0:
-; CHECK-X64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-X64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-X64-I128-NEXT: movq 8(%rsp), %rax
+; CHECK-X64-I128-NEXT: movq 16(%rsp), %rdx
; CHECK-X64-I128-NEXT: retq
;
; CHECK-MSVC64-F128-LABEL: trailing_arg:
; CHECK-MSVC64-F128: # %bb.0:
-; CHECK-MSVC64-F128-NEXT: movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MSVC64-F128-NEXT: movq 48(%rsp), %rax
; CHECK-MSVC64-F128-NEXT: movaps (%rax), %xmm0
; CHECK-MSVC64-F128-NEXT: retq
;
; CHECK-MSVC64-I128-LABEL: trailing_arg:
; CHECK-MSVC64-I128: # %bb.0:
-; CHECK-MSVC64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MSVC64-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MSVC64-I128-NEXT: movq 48(%rsp), %rax
+; CHECK-MSVC64-I128-NEXT: movq 56(%rsp), %rdx
; CHECK-MSVC64-I128-NEXT: retq
;
; CHECK-MINGW-F128-LABEL: trailing_arg:
; CHECK-MINGW-F128: # %bb.0:
-; CHECK-MINGW-F128-NEXT: movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MINGW-F128-NEXT: movq 48(%rsp), %rax
; CHECK-MINGW-F128-NEXT: movaps (%rax), %xmm0
; CHECK-MINGW-F128-NEXT: retq
;
; CHECK-MINGW-I128-LABEL: trailing_arg:
; CHECK-MINGW-I128: # %bb.0:
-; CHECK-MINGW-I128-NEXT: movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MINGW-I128-NEXT: movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MINGW-I128-NEXT: movq 48(%rsp), %rax
+; CHECK-MINGW-I128-NEXT: movq 56(%rsp), %rdx
; CHECK-MINGW-I128-NEXT: retq
;
; CHECK-X86-LABEL: trailing_arg:
; CHECK-X86: # %bb.0:
; CHECK-X86-NEXT: pushl %edi
; CHECK-X86-NEXT: pushl %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT: movl 12(%esp), %eax
+; CHECK-X86-NEXT: movl 56(%esp), %ecx
+; CHECK-X86-NEXT: movl 60(%esp), %edx
+; CHECK-X86-NEXT: movl 64(%esp), %esi
+; CHECK-X86-NEXT: movl 68(%esp), %edi
; CHECK-X86-NEXT: movl %edi, 12(%eax)
; CHECK-X86-NEXT: movl %esi, 8(%eax)
; CHECK-X86-NEXT: movl %edx, 4(%eax)
@@ -354,11 +505,11 @@ define PrimTy @trailing_arg(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy
; CHECK-MSVC32: # %bb.0:
; CHECK-MSVC32-NEXT: pushl %edi
; CHECK-MSVC32-NEXT: pushl %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT: movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT: movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT: movl 56(%esp), %ecx
+; CHECK-MSVC32-NEXT: movl 60(%esp), %edx
+; CHECK-MSVC32-NEXT: movl 64(%esp), %esi
+; CHECK-MSVC32-NEXT: movl 68(%esp), %edi
; CHECK-MSVC32-NEXT: movl %edi, 12(%eax)
; CHECK-MSVC32-NEXT: movl %esi, 8(%eax)
; CHECK-MSVC32-NEXT: movl %edx, 4(%eax)
@@ -388,8 +539,8 @@ define void @call_first_arg(PrimTy %x) nounwind {
; CHECK-MSVC64-F128: # %bb.0:
; CHECK-MSVC64-F128-NEXT: subq $56, %rsp
; CHECK-MSVC64-F128-NEXT: movaps (%rcx), %xmm0
-; CHECK-MSVC64-F128-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; CHECK-MSVC64-F128-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; CHECK-MSVC64-F128-NEXT: movaps %xmm0, 32(%rsp)
+; CHECK-MSVC64-F128-NEXT: leaq 32(%rsp), %rcx
; CHECK-MSVC64-F128-NEXT: callq first_arg
; CHECK-MSVC64-F128-NEXT: addq $56, %rsp
; CHECK-MSVC64-F128-NEXT: retq
@@ -405,8 +556,8 @@ define void @call_first_arg(PrimTy %x) nounwind {
; CHECK-MINGW-F128: # %bb.0:
; CHECK-MINGW-F128-NEXT: subq $56, %rsp
; CHECK-MINGW-F128-NEXT: movaps (%rcx), %xmm0
-; CHECK-MINGW-F128-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; CHECK-MINGW-F128-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; CHECK-MINGW-F128-NEXT: movaps %xmm0, 32(%rsp)
+; CHECK-MINGW-F128-NEXT: leaq 32(%rsp), %rcx
; CHECK-MINGW-F128-NEXT: callq first_arg
; CHECK-MINGW-F128-NEXT: addq $56, %rsp
; CHECK-MINGW-F128-NEXT: retq
@@ -421,11 +572,11 @@ define void @call_first_arg(PrimTy %x) nounwind {
; CHECK-X86-LABEL: call_first_arg:
; CHECK-X86: # %bb.0:
; CHECK-X86-NEXT: subl $40, %esp
-; CHECK-X86-NEXT: leal {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT: pushl {{[0-9]+}}(%esp)
-; CHECK-X86-NEXT: pushl {{[0-9]+}}(%esp)
-; CHECK-X86-NEXT: pushl {{[0-9]+}}(%esp)
-; CHECK-X86-NEXT: pushl {{[0-9]+}}(%esp)
+; CHECK-X86-NEXT: leal 12(%esp), %eax
+; CHECK-X86-NEXT: pushl 56(%esp)
+; CHECK-X86-NEXT: pushl 56(%esp)
+; CHECK-X86-NEXT: pushl 56(%esp)
+; CHECK-X86-NEXT: pushl 56(%esp)
; CHECK-X86-NEXT: pushl %eax
; CHECK-X86-NEXT: calll first_arg@PLT
; CHECK-X86-NEXT: addl $56, %esp
@@ -481,9 +632,9 @@ define void @call_leading_args(PrimTy %x) nounwind {
; CHECK-MSVC64-F128: # %bb.0:
; CHECK-MSVC64-F128-NEXT: subq $72, %rsp
; CHECK-MSVC64-F128-NEXT: ...
[truncated]
|
Contributor
Author
|
This is the test for #138092. @nikic or @phoebewang could you review? |
Contributor
Author
|
@phoebewang could you please merge this for me? |
Contributor
Author
|
Thank you! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adding an extra argument before a
fp128only changes the stack offset by four bytes, while it should instead go in the next 16-aligned slot. Add a test demonstrating the current behavior.no_x86_scrub_spis added because offset from the stack pointer is needed to show the problem.Relevant issue: #77401