This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] x86: Define _mm*_undefined_*


On Tue, Mar 18, 2014 at 4:03 PM, Ulrich Drepper <drepper@gmail.com> wrote:
> On Tue, Mar 18, 2014 at 7:13 AM, Richard Biener
> <richard.guenther@gmail.com> wrote:
>> extern __inline __m512
>> __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
>> _mm512_undefined_ps (void)
>> {
>>   __m512 __Y = __Y;
>>   return __Y;
>> }
>
>
> This provokes no warnings (as you wrote) and it doesn't clobber flags,
> but it doesn't avoid loading.  The code below creates a pxor for the
> parameter.  That's what I think compiler support should help to get
> rid of.  If the compiler has some magic to recognize -1 masks then
> this will help in some situations but it seems to be a specific
> implementation for the intrinsics while I've been looking at generic
> solution.
>
>
> typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
>
> void g(__m128d);
>
> extern __inline __m128d
> __attribute__((__gnu_inline__, __always_inline__, __artificial__, const))
> _mm_undefined_pd(void) {
>   __m128d v = v;
>   return v;
> }
>
> void
> f()
> {
>   g(_mm_undefined_pd());
> }

The load from zero is caused by the init-regs pass.  To quote:

/* Check all of the uses of pseudo variables.  If any use that is MUST
   uninitialized, add a store of 0 immediately before it.  For
   subregs, this makes combine happy.  For full word regs, this makes
   other optimizations, like the register allocator and the reg-stack
   happy as well as papers over some problems on the arm and other
   processors where certain isa constraints cannot be handled by gcc.
   These are of the form where two operands to an insn my not be the
   same.  The ra will only make them the same if they do not
   interfere, and this can only happen if one is not initialized.

   There is also the unfortunate consequence that this may mask some
   buggy programs where people forget to initialize stack variable.
   Any programmer with half a brain would look at the uninitialized
   variable warnings.  */

You can disable it with -fdisable-rtl-init-regs.  Not sure if the above
comment today is just overly cautious ... maybe we should have a
target hook that controls its execution.

Richard.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]