[Bug ipa/84658] [7/8 Regression] -O3 -fmerge-all-constants causes incorrect for-each loop generation.

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Thu Mar 8 13:08:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84658

--- Comment #18 from rguenther at suse dot de <rguenther at suse dot de> ---
On Thu, 8 Mar 2018, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84658
> 
> --- Comment #17 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> (In reply to Richard Biener from comment #16)
> > Hum, isn't the bug INVALID then?  Shouldn't we restrict -fmerge-all-constants
> 
> No.
> 
> > to not address-taken variables to not make the option useless?
> 
> -fmerge-all-constants is an extension where the addresses of the constant
> variables may be the same even if without the option they would need to be
> guaranteed to be different.  That is the whole point of the option, many people
> just don't care about it and care more about .rodata size, so they have an
> option to tell the compiler about it.

That's not really an answer to the question ...

But anyway, we have precedence in points-to-set editing which we do
during RTL expansion to reflect variable coalescing.

So ... a different approach for fixing would be if ICF would keep

 a) a global bitmap of all DECL_UID that took part in any merging operation
 b) a mapping of merged DECL_UID to prevailing DECL_UID (which is also the
    DECL_PT_UID of the merged ones)

then during IPA ICF transform phase do

  FOR_EACH_DEFINED_FUNCTION (...)
    {
       FOR_EACH_SSA_NAME_FN (..., name)
         if (POINTER_TYPE_P (TREE_TYPE (name))
             && SSA_NAME_PTR_INFO (name))
           fixup_pt_set (&SSA_NAME_PTR_INFO (name)->pt);
       fixup_pt_set (fn->gimple_df->escaped);

       /* The above get's us to 99% I guess, at least catching the
          address compares.  Below also gets us aliasing correct
          but as said we're giving leeway to the situation with
          readonly vars anyway, so ... */
       FOR_EACH_BB_FN (...)
         for (each-stmt)
           if (is_gimple_call (...))
             {
               fixup_pt_set (gimple_call_use_set (call));
               fixup_pt_set (gimple_call_clobber_set (call));
             }
    }

and fixup_pt_set essentially doing

  EXECUTE_IF_AND_IN_BITMAP (pt->vars, bitmap-of-merged-decls, 0, i, bi)
    bitmap_set_bit (pt->vars, *merged_uid_to_pt_uid->get (i));

that would be a "real" fix, also allowing the forthcoming pointer
comparison optimization using two pointers (and thus two points-to
sets).

> > I presume -fmerge-all-constants pre-dates ICF?
> 
> Yes, by far.  -fmerge-all-constants is from 2001, ICF from 2014.


More information about the Gcc-bugs mailing list