<div dir="ltr"><div><div><div>From a purely theoretical perspective, the compiler has to deal with here. <br><br></div>1. "Is the variable modified by other functions?"<br>     If so, the compiler must reload the value of global variables after each call to such a function (or calls that MAY end up in such a function)<br></div>2. "is this variable used enough inside the function to warrant it being placed in a local variable?"<br></div><div>     If so, it can be moved to a register (subject to #1 - if it still has to be reloaded umpteen times, it's not necessarily meaningful to do so)<br><br></div><div>It's entirely plausible to come up with code that uses a global variable and the compiler can allocate a register for it, but also equally possible to come up with something where the compiler CAN'T use a register. <br><br></div><div>Using the method of <br><br></div><div>     int local = global;<br> <br></div><div>would solve #1 above - as the local value won't change other than within the function. <br><br></div><div>Making the global(s) into `static` - in other words letting the compiler know "nothing outside this TU can see this variable" can help with #1 as well, as the compiler can then analyze this TU and see what is going on without having to worry that calls outside the TU will modify the variable unknown to its current knowledge.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 1 July 2015 at 05:57, Hayden Livingston <span dir="ltr"><<a href="mailto:halivingston@gmail.com" target="_blank">halivingston@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> Thanks, Reid. I'm not an optimization expert, but as a workaround,<br>
can I do the following:<br>
<br>
void myFunction()<br>
{<br>
   int local = global;<br>
   .. use local ...<br>
}<br>
<br>
?<br>
<div class="HOEnZb"><div class="h5"><br>
On Tue, Jun 30, 2015 at 6:53 PM, Reid Kleckner <<a href="mailto:rnk@google.com">rnk@google.com</a>> wrote:<br>
> This came up in the past for GHC, and we recommended passing it as a<br>
> parameter everywhere, as it lets the register allocator spill it under high<br>
> register pressure.<br>
><br>
> GCC has support for allocating globals in GPRs and removing that GPR from<br>
> the allocatable set, but LLVM doesn't implement it so far as I know.<br>
><br>
> On Tue, Jun 30, 2015 at 5:43 PM, Hayden Livingston <<a href="mailto:halivingston@gmail.com">halivingston@gmail.com</a>><br>
> wrote:<br>
>><br>
>> I was wondering if global variables can be candidates for register<br>
>> allocation. My use case is a global variable that is used in every<br>
>> function in my program.<br>
>><br>
>> I'm wondering if it's better to pass it in, or let it stay as a global.<br>
>><br>
>> Passing it in will require a bit of work.<br>
>> _______________________________________________<br>
>> LLVM Developers mailing list<br>
>> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
><br>
><br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br></div>