<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Apr 7, 2017 at 3:19 PM, Chris Wilson <span dir="ltr"><<a href="mailto:chris@chris-wilson.co.uk" target="_blank">chris@chris-wilson.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Fri, Apr 07, 2017 at 02:41:13PM -0700, Jason Ekstrand wrote:<br>
>    On Fri, Apr 7, 2017 at 1:26 PM, Chris Wilson <[1]<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>><br>
<span class="">>    wrote:<br>
><br>
>      On Fri, Apr 07, 2017 at 12:55:53PM -0700, Jason Ekstrand wrote:<br>
</span><div><div class="h5">>      > +#define _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(_i) \<br>
>      > +   if ((_i) < ma->ptr_count) \<br>
>      > +      *ma->ptrs[_i] = ptr + (uintptr_t)*ma->ptrs[_i]<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(0);<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(1);<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(2);<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(3);<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(4);<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(5);<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(6);<br>
>      > +   _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(7);<br>
>      > +#undef _ANV_MULTIALLOC_UPDATE_POINTER<br>
><br>
>      #define _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(_i) case _i + 1: *ma->ptrs[_i] =<br>
>      ptr +(uintptr)*ma->ptrs[_i]<br>
><br>
>      switch (ma->ptr_count) {<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(7);<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(6);<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(5);<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(4);<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(3);<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(2);<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(1);<br>
>      _ANV_MULTIALLOC_UPDATE_<wbr>POINTER(0);<br>
>      }<br>
><br>
>      #undef _ANV_MULITALLOC_UPDATE_POINTER<br>
><br>
>    If ma->ptr_count is constant, they generate exactly the same code.  If it<br>
>    isn't (i.e. if one of the multialloc_adds is predicated), then they still<br>
>    generate basically the same code with the code for the if version being<br>
>    slightly more straightforward.<br>
<br>
</div></div>Took a look at this with <a href="https://godbolt.org/g/UwrMk1" rel="noreferrer" target="_blank">https://godbolt.org/g/UwrMk1</a><br></blockquote><div><br></div><div>Weird... That's not at all what I'm seeing with my demo file.  In fact, when I try to compile your demo file with GCC on my local machine, it reduces the entire thing down to less than a dozen instrutions.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
clang does much better at seeing the constants, but gcc doesn't and<br>
generates a large if-ladder for one and a jump table for the switch. icc<br>
doesn't fare any better than gcc. The if-ladder is going to be worse<br>
than the computed jump, but best is to file a gcc bug :|<span class="HOEnZb"></span><br></blockquote></div></div></div>