http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50494



--- Comment #18 from rguenther at suse dot de <rguenther at suse dot de> 
2013-02-14 10:41:07 UTC ---

On Thu, 14 Feb 2013, ebotcazou at gcc dot gnu.org wrote:



> 

> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50494

> 

> --- Comment #17 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2013-02-14 
> 09:18:46 UTC ---

> > Because as it is seen as a regular VAR_DECL by optimizers the

> > vectorizer (well, IPA increase-alignment in this case) chooses to

> > bump its alignment to be able to use aligned vector moves.

> > 

> > Thus we need to honor the increased DECL_ALIGN when outputting the

> > constant pool, otherwise we generate wrong-code.

> 

> I see, thanks.  Perhaps the safest solution is to prevent IPA from increasing

> the alignment if DECL_IN_CONSTANT_POOL, as initializations of aggregate 
> objects

> are presumably not supposed to happen in hot spots.



It's also done by the vectorizer pass (for -fno-section-anchors).

I believe it's wrong to not honor DECL_ALIGN of decl in



  /* If this variable belongs to the global constant pool, retrieve the

     pre-computed RTL or recompute it in LTO mode.  */

  if (TREE_CODE (decl) == VAR_DECL && DECL_IN_CONSTANT_POOL (decl))

    {

      SET_DECL_RTL (decl, output_constant_def (DECL_INITIAL (decl), 1));

      return;



which is what happens here.  Thus, if we say DECL_IN_CONSTANT_POOL

decls may not have their alignment changed we should assert that

(but my patch just honors DECL_ALIGN and avoids creation of yet

another DECL_IN_CONSTANT_POOL decl ...).  After all we also

use DECL_ALIGN information if anybody inspects the address

(which may happen if we elide the local static to the initializer

if we can see it is never changed - I suppose we cannot do that

at the moment)



Btw, if properly aligned the block-move can use vector code as well

(not sure if any target does that though).



Richard.

Reply via email to