[Bug lto/50494] gcc.dg/vect/vect-reduc-2char.c fails spuriously on ppc with -flto

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Tue Mar 5 15:49:00 GMT 2013


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

--- Comment #33 from rguenther at suse dot de <rguenther at suse dot de> 2013-03-05 15:48:03 UTC ---
On Tue, 5 Mar 2013, ebotcazou at gcc dot gnu.org wrote:

> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50494
> 
> --- Comment #32 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2013-03-05 15:32:15 UTC ---
> > But in all places I found we check TREE_ASM_WRITTEN on DECL_INITIAL
> > of the SYMBOL_REF_DECL ...
> 
> Nope, maybe_output_constant_def_contents has:
> 
>   rtx symbol = XEXP (desc->rtl, 0);
>   tree exp = desc->value;
> 
>   if (flag_syntax_only)
>     return;
> 
>   if (TREE_ASM_WRITTEN (exp))
>     /* Already output; don't do it again.  */
>     return;
> 
> so the DECL_INITIAL of the SYMBOL_REF_DECL must be desc->value.

Ah, ok ... too many smart TREE_ASM_WRITTEN bits around ...

> > So it must be pure luck that we survived LTO bootstrap before my
> > patch (as far as I understand things).  Before my patch we created
> > yet another decl for the constant pool entry.  With my patch
> > we will have one less (we still have the decls from the constant
> > pool entries that end up being shared in the LTRANS unit).
> 
> We use LTO on heavy Ada applications with an unmodified 4.7 compiler (modulo a
> patch for -g) so I don't think that luck has anything to do here.

Fine, so the above might be the only issue.

> > So in the end I can agree to that my patch doesn't really fix
> > the original issue fully.  So we can as well revert it and
> > instead avoid messing with alignment of the constant pool entries.
> 
> That would be my preference.

Which of course pessimizes code generation and probably causes
some testsuite fallout for ppc (the original reported spurious
fails).

> > Hmm, maybe.  Then, why do we copy the constant in the first place ...
> > 
> > Thus,
> > 
> > Index: varasm.c
> > ===================================================================
> > --- varasm.c    (revision 196462)
> > +++ varasm.c    (working copy)
> > @@ -3087,7 +3087,7 @@ build_constant_desc (tree exp, tree decl
> >    int labelno;
> > 
> >    desc = ggc_alloc_constant_descriptor_tree ();
> > -  desc->value = copy_constant (exp);
> > +  desc->value = exp;
> > 
> >    /* Propagate marked-ness to copied constant.  */
> >    if (flag_mudflap && mf_marked_p (exp))
> > 
> > should be an "equivalent" fix.
> 
> This call to copy_constant has been there for ages though. so a little bit of
> archeology would probably be in order before removing it.

;)  Did that, it's there since forever - well, I traced it back to
the point we only deferred string constants:

 37459      jakub                 p = (struct deferred_string *)
 37459      jakub                     xmalloc (sizeof (struct 
deferred_string));
 37459      jakub 
 37459      jakub                 p->exp = copy_constant (exp);
 37459      jakub                 p->label = desc->label;

I'm LTO bootstrapping

  desc->value = decl ? exp : copy_constant (exp);

and doing a regular bootstrap with the copy_constant completely removed
at the moment.  Just curious ...

> In the meantime, I've successfully bootstrapped my patchlet so we can also go
> for it.

I'm fine with that.

As I concluded that the original fix didn't fix the alignment issue
(well, not for all possible cases at least) reverting the original
fix works for me as well.

I'm working on a patch to avoid re-aligning constant pool entries.



More information about the Gcc-bugs mailing list