<div dir="ltr"><div class="gmail_quote"><div dir="ltr">Hey,<div><br></div><div>I'm playing around with a backend with no callee saved registers and noticed more spilling than seems needed. I tried digging into the spilling code but with limited success. I also tried removing all the callee saved registers in the X86 backend and saw the same effect (basically making CSRs equal to CSR_NoRegs). So I seem to be misunderstanding something or missing something simple, and thought I'd ask.</div><div><br></div><div>Consider this program as an example:</div><div><br></div><div><div>volatile int x;</div><div><br></div><div>int __attribute__((noinline)) foo() { return x; }</div><div><br></div><div>int main() {</div><div>  for (int i = 0; i < 10; ++i) {</div><div>    foo();</div><div>  }</div><div>}</div></div><div><br></div><div>The resultant output code spills 'i' within the loop (I have to compile with -fno-unroll-loops else the loop and 'i' gets optimized <!--
-->away) while 'i' is assigned to a register that is used nowhere else in the generated program and I would consider 'foo' easy to analyse. At the call site of 'foo' the debugging output reports that the stack pointer and return value registers are "imp-use" and "imp-def" and no other registers are used.</div><div><br></div><div>Should the spilling have occurred? Or this due to some feature in the backend that is missing?</div><div><br></div><div>Thanks,</div><div><br></div><div>Jacques</div></div>
</div><br></div>