mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-25 14:02:52 +02:00
c60cb66b34
The red zone consists of 128 bytes beyond the stack pointer so that the allocation of objects in leaf functions doesn't require decrementing rsp. In r255656, we introduced an optimization that would cheaply materialize certain constants via push/pop. Push decrements the stack pointer and stores it's result at what is now the top of the stack. However, this means that using push/pop would encroach on the red zone. PR26023 gives an example where this corrupts an object in the red zone. llvm-svn: 256808
40 lines
1.3 KiB
LLVM
40 lines
1.3 KiB
LLVM
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 | FileCheck %s
|
|
; Ideally this would compile to 5 multiplies.
|
|
|
|
define double @pow_wrapper(double %a) nounwind readonly ssp noredzone {
|
|
; CHECK-LABEL: pow_wrapper:
|
|
; CHECK: # BB#0:
|
|
; CHECK-NEXT: movapd %xmm0, %xmm1
|
|
; CHECK-NEXT: mulsd %xmm1, %xmm1
|
|
; CHECK-NEXT: mulsd %xmm1, %xmm0
|
|
; CHECK-NEXT: mulsd %xmm1, %xmm1
|
|
; CHECK-NEXT: mulsd %xmm1, %xmm0
|
|
; CHECK-NEXT: mulsd %xmm1, %xmm1
|
|
; CHECK-NEXT: mulsd %xmm0, %xmm1
|
|
; CHECK-NEXT: movapd %xmm1, %xmm0
|
|
; CHECK-NEXT: retq
|
|
%ret = tail call double @llvm.powi.f64(double %a, i32 15) nounwind ; <double> [#uses=1]
|
|
ret double %ret
|
|
}
|
|
|
|
define double @pow_wrapper_optsize(double %a) optsize {
|
|
; CHECK-LABEL: pow_wrapper_optsize:
|
|
; CHECK: # BB#0:
|
|
; CHECK-NEXT: movl $15, %edi
|
|
; CHECK-NEXT: jmp
|
|
%ret = tail call double @llvm.powi.f64(double %a, i32 15) nounwind ; <double> [#uses=1]
|
|
ret double %ret
|
|
}
|
|
|
|
define double @pow_wrapper_minsize(double %a) minsize {
|
|
; CHECK-LABEL: pow_wrapper_minsize:
|
|
; CHECK: # BB#0:
|
|
; CHECK-NEXT: movl $15, %edi
|
|
; CHECK-NEXT: jmp
|
|
%ret = tail call double @llvm.powi.f64(double %a, i32 15) nounwind ; <double> [#uses=1]
|
|
ret double %ret
|
|
}
|
|
|
|
declare double @llvm.powi.f64(double, i32) nounwind readonly
|
|
|