<div dir="ltr"><div>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?</div><div><br></div><div>regards,</div><div>Venkat. </div><div>   <br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 18 Mar 2021 at 20:37, Venkataramanan Kumar <<a href="mailto:venkataramanan.kumar.llvm@gmail.com">venkataramanan.kumar.llvm@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><font face="verdana, sans-serif">Hi,</font><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">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. </font></div><div><font face="verdana, sans-serif"><br></font></div><div><span style="font-family:verdana,sans-serif">Ref: <a href="https://godbolt.org/z/Peaczh" target="_blank">https://godbolt.org/z/Peaczh</a></span><br></div><div><div><br></div><div>--snip--</div><div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254);font-family:"Consolas, ""><div><span style="color:rgb(0,0,255)">#include</span> <span style="color:rgb(0,0,255)"><</span><span style="color:rgb(163,21,21)">math.h</span><span style="color:rgb(0,0,255)">></span></div><div><span style="color:rgb(0,0,255)">double</span> arr[<span style="color:rgb(9,134,88)">1000000</span>];</div><div><span style="color:rgb(0,0,255)">int</span> n;</div><div><span style="color:rgb(0,0,255)">double</span> foo()</div><div>{</div><div>   <span style="color:rgb(0,0,255)">double</span> t = <span style="color:rgb(9,134,88)">0.0</span>;</div><div>   <span style="color:rgb(0,0,255)">for</span>(<span style="color:rgb(0,0,255)">int</span> i=<span style="color:rgb(9,134,88)">0</span>;i<<span style="color:rgb(9,134,88)">100000</span>;i++)</div><div>     t += log(arr[i]);</div><br><div>   <span style="color:rgb(0,0,255)">return</span> t;</div><div>}</div></div></div><div>--snip--</div><div><br></div><div>Assembly Snip</div><div>---Snip--</div><div><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(0,128,128)">.LBB0_1:                                # =>This Inner Loop Header:</span><span style="background-color:rgb(255,255,254);color:rgb(0,0,0);font-family:"Consolas, ""> </span><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(0,0,255)">Depth</span><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(205,49,49)">=</span><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(9,134,88)">1</span><br></div><div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><div style="font-family:"Consolas, "">        <span style="color:rgb(0,128,0)">#DEBUG_VALUE: foo:t <- 0.000000e+00</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,128,0)">#DEBUG_VALUE: i <- 0</span></div><div style="font-family:"Consolas, "">        <b><span style="color:rgb(0,0,255)">vmovupd</span> <span style="color:rgb(72,100,170)">%ymm1</span>, (<span style="color:rgb(72,100,170)">%rsp</span>)                   <span style="color:rgb(0,128,0)"># 32-byte Spill</span></b></div><div style="font-family:"Consolas, ""><span style="color:rgb(0,128,128)">.Ltmp1:</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">8</span> <span style="color:rgb(9,134,88)">15</span> <span style="color:rgb(0,128,128)">prologue_end</span>             <span style="color:rgb(0,128,0)"># ./example.cpp:8:15</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">vmovupd</span> <span style="color:rgb(0,128,128)">arr</span>+<span style="color:rgb(9,134,88)">800000</span>(<span style="color:rgb(72,100,170)">%rbx</span>), <span style="color:rgb(72,100,170)">%ymm0</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">8</span> <span style="color:rgb(9,134,88)">11</span> <span style="color:rgb(0,128,128)">is_stmt</span> <span style="color:rgb(9,134,88)">0</span>                <span style="color:rgb(0,128,0)"># ./example.cpp:8:11</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">callq</span>   <span style="color:rgb(0,128,128)">__svml_log4@PLT</span></div><div style="font-family:"Consolas, ""><span style="color:rgb(0,128,128)">.Ltmp2:</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">0</span> <span style="color:rgb(9,134,88)">11</span>                          <span style="color:rgb(0,128,0)"># ./example.cpp:0:11</span></div><div style="font-family:"Consolas, "">        <b><span style="color:rgb(0,0,255)">vmovupd</span> (<span style="color:rgb(72,100,170)">%rsp</span>), <span style="color:rgb(72,100,170)">%ymm1</span>                   <span style="color:rgb(0,128,0)"># 32-byte Reload</span></b></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">8</span> <span style="color:rgb(9,134,88)">8</span>                           <span style="color:rgb(0,128,0)"># ./example.cpp:8:8</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">vaddpd</span>  <span style="color:rgb(72,100,170)">%ymm1</span>, <span style="color:rgb(72,100,170)">%ymm0</span>, <span style="color:rgb(72,100,170)">%ymm1</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">7</span> <span style="color:rgb(9,134,88)">26</span> <span style="color:rgb(0,128,128)">is_stmt</span> <span style="color:rgb(9,134,88)">1</span>                <span style="color:rgb(0,128,0)"># ./example.cpp:7:26</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">addq</span>    <span style="color:rgb(48,48,192)">$32</span>, <span style="color:rgb(72,100,170)">%rbx</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">jne</span>     <span style="color:rgb(0,128,128)">.LBB0_1</span></div><div style="font-family:"Consolas, "">---Snip---</div><div><font face="verdana, sans-serif"><br></font></div><div><div><font face="verdana, sans-serif">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.<br><br>regards,<br>Venkat.</font><br></div><div style="font-family:"Consolas, ""></div></div><div style="font-family:"Consolas, ""><br></div><div style="font-family:"Consolas, ""><br></div></div></div></div></div>
</blockquote></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 18 Mar 2021 at 20:37, Venkataramanan Kumar <<a href="mailto:venkataramanan.kumar.llvm@gmail.com">venkataramanan.kumar.llvm@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><font face="verdana, sans-serif">Hi,</font><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">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. </font></div><div><font face="verdana, sans-serif"><br></font></div><div><span style="font-family:verdana,sans-serif">Ref: <a href="https://godbolt.org/z/Peaczh" target="_blank">https://godbolt.org/z/Peaczh</a></span><br></div><div><div><br></div><div>--snip--</div><div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254);font-family:"Consolas, ""><div><span style="color:rgb(0,0,255)">#include</span> <span style="color:rgb(0,0,255)"><</span><span style="color:rgb(163,21,21)">math.h</span><span style="color:rgb(0,0,255)">></span></div><div><span style="color:rgb(0,0,255)">double</span> arr[<span style="color:rgb(9,134,88)">1000000</span>];</div><div><span style="color:rgb(0,0,255)">int</span> n;</div><div><span style="color:rgb(0,0,255)">double</span> foo()</div><div>{</div><div>   <span style="color:rgb(0,0,255)">double</span> t = <span style="color:rgb(9,134,88)">0.0</span>;</div><div>   <span style="color:rgb(0,0,255)">for</span>(<span style="color:rgb(0,0,255)">int</span> i=<span style="color:rgb(9,134,88)">0</span>;i<<span style="color:rgb(9,134,88)">100000</span>;i++)</div><div>     t += log(arr[i]);</div><br><div>   <span style="color:rgb(0,0,255)">return</span> t;</div><div>}</div></div></div><div>--snip--</div><div><br></div><div>Assembly Snip</div><div>---Snip--</div><div><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(0,128,128)">.LBB0_1:                                # =>This Inner Loop Header:</span><span style="background-color:rgb(255,255,254);color:rgb(0,0,0);font-family:"Consolas, ""> </span><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(0,0,255)">Depth</span><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(205,49,49)">=</span><span style="background-color:rgb(255,255,254);font-family:"Consolas, ";color:rgb(9,134,88)">1</span><br></div><div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><div style="font-family:"Consolas, "">        <span style="color:rgb(0,128,0)">#DEBUG_VALUE: foo:t <- 0.000000e+00</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,128,0)">#DEBUG_VALUE: i <- 0</span></div><div style="font-family:"Consolas, "">        <b><span style="color:rgb(0,0,255)">vmovupd</span> <span style="color:rgb(72,100,170)">%ymm1</span>, (<span style="color:rgb(72,100,170)">%rsp</span>)                   <span style="color:rgb(0,128,0)"># 32-byte Spill</span></b></div><div style="font-family:"Consolas, ""><span style="color:rgb(0,128,128)">.Ltmp1:</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">8</span> <span style="color:rgb(9,134,88)">15</span> <span style="color:rgb(0,128,128)">prologue_end</span>             <span style="color:rgb(0,128,0)"># ./example.cpp:8:15</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">vmovupd</span> <span style="color:rgb(0,128,128)">arr</span>+<span style="color:rgb(9,134,88)">800000</span>(<span style="color:rgb(72,100,170)">%rbx</span>), <span style="color:rgb(72,100,170)">%ymm0</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">8</span> <span style="color:rgb(9,134,88)">11</span> <span style="color:rgb(0,128,128)">is_stmt</span> <span style="color:rgb(9,134,88)">0</span>                <span style="color:rgb(0,128,0)"># ./example.cpp:8:11</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">callq</span>   <span style="color:rgb(0,128,128)">__svml_log4@PLT</span></div><div style="font-family:"Consolas, ""><span style="color:rgb(0,128,128)">.Ltmp2:</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">0</span> <span style="color:rgb(9,134,88)">11</span>                          <span style="color:rgb(0,128,0)"># ./example.cpp:0:11</span></div><div style="font-family:"Consolas, "">        <b><span style="color:rgb(0,0,255)">vmovupd</span> (<span style="color:rgb(72,100,170)">%rsp</span>), <span style="color:rgb(72,100,170)">%ymm1</span>                   <span style="color:rgb(0,128,0)"># 32-byte Reload</span></b></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">8</span> <span style="color:rgb(9,134,88)">8</span>                           <span style="color:rgb(0,128,0)"># ./example.cpp:8:8</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">vaddpd</span>  <span style="color:rgb(72,100,170)">%ymm1</span>, <span style="color:rgb(72,100,170)">%ymm0</span>, <span style="color:rgb(72,100,170)">%ymm1</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">.loc</span>    <span style="color:rgb(9,134,88)">1</span> <span style="color:rgb(9,134,88)">7</span> <span style="color:rgb(9,134,88)">26</span> <span style="color:rgb(0,128,128)">is_stmt</span> <span style="color:rgb(9,134,88)">1</span>                <span style="color:rgb(0,128,0)"># ./example.cpp:7:26</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">addq</span>    <span style="color:rgb(48,48,192)">$32</span>, <span style="color:rgb(72,100,170)">%rbx</span></div><div style="font-family:"Consolas, "">        <span style="color:rgb(0,0,255)">jne</span>     <span style="color:rgb(0,128,128)">.LBB0_1</span></div><div style="font-family:"Consolas, "">---Snip---</div><div><font face="verdana, sans-serif"><br></font></div><div><div><font face="verdana, sans-serif">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.<br><br>regards,<br>Venkat.</font><br></div><div style="font-family:"Consolas, ""></div></div><div style="font-family:"Consolas, ""><br></div><div style="font-family:"Consolas, ""><br></div></div></div></div></div>
</blockquote></div>