Venkataramanan Kumar via llvm-dev
2021-Mar-18 15:07 UTC
[llvm-dev] Question on using caller saved register around a library call.
Hi,
For the below test case, I see LLVM allocates an XMM1 register for holding
the variable "t". My understanding is XMM1 is a caller saved register
and
hence it is spilled to stack and restored back around the library call.
Ref: https://godbolt.org/z/Peaczh
--snip--
#include <math.h>
double arr[1000000];
int n;
double foo()
{
double t = 0.0;
for(int i=0;i<100000;i++)
t += log(arr[i]);
return t;
}
--snip--
Assembly Snip
---Snip--
.LBB0_1: # =>This Inner Loop Header: Depth=1
#DEBUG_VALUE: foo:t <- 0.000000e+00
#DEBUG_VALUE: i <- 0
*vmovupd %ymm1, (%rsp) # 32-byte Spill*
.Ltmp1:
.loc 1 8 15 prologue_end # ./example.cpp:8:15
vmovupd arr+800000(%rbx), %ymm0
.loc 1 8 11 is_stmt 0 # ./example.cpp:8:11
callq __svml_log4 at PLT
.Ltmp2:
.loc 1 0 11 # ./example.cpp:0:11
*vmovupd (%rsp), %ymm1 # 32-byte Reload*
.loc 1 8 8 # ./example.cpp:8:8
vaddpd %ymm1, %ymm0, %ymm1
.loc 1 7 26 is_stmt 1 # ./example.cpp:7:26
addq $32, %rbx
jne .LBB0_1
---Snip---
Why is LLVM not choosing a callee saved register here? It can then avoid
pushing to the stack and restoring from the stack in the loop.
regards,
Venkat.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20210318/3c18eb2a/attachment.html>
Venkataramanan Kumar via llvm-dev
2021-Mar-19 06:00 UTC
[llvm-dev] Question on using caller saved register around a library call.
Is that the case, all XMM, YMM and ZMM are caller saved or scratch only ? As per the ABI, we don't have any Callee saved registers available? regards, Venkat. On Thu, 18 Mar 2021 at 20:37, Venkataramanan Kumar < venkataramanan.kumar.llvm at gmail.com> wrote:> Hi, > > For the below test case, I see LLVM allocates an XMM1 register for holding > the variable "t". My understanding is XMM1 is a caller saved register and > hence it is spilled to stack and restored back around the library call. > > Ref: https://godbolt.org/z/Peaczh > > --snip-- > #include <math.h> > double arr[1000000]; > int n; > double foo() > { > double t = 0.0; > for(int i=0;i<100000;i++) > t += log(arr[i]); > > return t; > } > --snip-- > > Assembly Snip > ---Snip-- > .LBB0_1: # =>This Inner Loop Header: Depth> 1 > #DEBUG_VALUE: foo:t <- 0.000000e+00 > #DEBUG_VALUE: i <- 0 > *vmovupd %ymm1, (%rsp) # 32-byte Spill* > .Ltmp1: > .loc 1 8 15 prologue_end # ./example.cpp:8:15 > vmovupd arr+800000(%rbx), %ymm0 > .loc 1 8 11 is_stmt 0 # ./example.cpp:8:11 > callq __svml_log4 at PLT > .Ltmp2: > .loc 1 0 11 # ./example.cpp:0:11 > *vmovupd (%rsp), %ymm1 # 32-byte Reload* > .loc 1 8 8 # ./example.cpp:8:8 > vaddpd %ymm1, %ymm0, %ymm1 > .loc 1 7 26 is_stmt 1 # ./example.cpp:7:26 > addq $32, %rbx > jne .LBB0_1 > ---Snip--- > > Why is LLVM not choosing a callee saved register here? It can then avoid > pushing to the stack and restoring from the stack in the loop. > > regards, > Venkat. > > >On Thu, 18 Mar 2021 at 20:37, Venkataramanan Kumar < venkataramanan.kumar.llvm at gmail.com> wrote:> Hi, > > For the below test case, I see LLVM allocates an XMM1 register for holding > the variable "t". My understanding is XMM1 is a caller saved register and > hence it is spilled to stack and restored back around the library call. > > Ref: https://godbolt.org/z/Peaczh > > --snip-- > #include <math.h> > double arr[1000000]; > int n; > double foo() > { > double t = 0.0; > for(int i=0;i<100000;i++) > t += log(arr[i]); > > return t; > } > --snip-- > > Assembly Snip > ---Snip-- > .LBB0_1: # =>This Inner Loop Header: Depth> 1 > #DEBUG_VALUE: foo:t <- 0.000000e+00 > #DEBUG_VALUE: i <- 0 > *vmovupd %ymm1, (%rsp) # 32-byte Spill* > .Ltmp1: > .loc 1 8 15 prologue_end # ./example.cpp:8:15 > vmovupd arr+800000(%rbx), %ymm0 > .loc 1 8 11 is_stmt 0 # ./example.cpp:8:11 > callq __svml_log4 at PLT > .Ltmp2: > .loc 1 0 11 # ./example.cpp:0:11 > *vmovupd (%rsp), %ymm1 # 32-byte Reload* > .loc 1 8 8 # ./example.cpp:8:8 > vaddpd %ymm1, %ymm0, %ymm1 > .loc 1 7 26 is_stmt 1 # ./example.cpp:7:26 > addq $32, %rbx > jne .LBB0_1 > ---Snip--- > > Why is LLVM not choosing a callee saved register here? It can then avoid > pushing to the stack and restoring from the stack in the loop. > > regards, > Venkat. > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210319/e5c594e4/attachment.html>