-
Notifications
You must be signed in to change notification settings - Fork 14.5k
[X86] Update the fp128/i128 test to show stack alignment (NFC) #148753
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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
@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]
|
This is the test for #138092. @nikic or @phoebewang could you review? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
@phoebewang could you please merge this for me? |
Thank you! |
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: #77401