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

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |marxin at gcc dot gnu.org

--- Comment #7 from Martin Liška <marxin at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #6)
> (In reply to vries from comment #5)
> > before icf, we have:
> > ...
> >   static real(kind=4) A.4[2] = {1.0e+0, 2.0e+0};
> >   static real(kind=4) A.1[2] = {1.0e+0, 2.0e+0};
> > ...
> > 
> > Then icf does:
> > ...
> > Semantic equality hit:A.4->A.1
> > Assembler symbol names:A.4.3435->A.1.3429
> > Unified; Variable alias has been created.
> > ...
> > 
> > And after icf, we have:
> > ...
> >   static real(kind=4) A.4[2] = {1.0e+0, 2.0e+0};
> >   static real(kind=4) A.1[2];
> > ...
> > 
> > What openacc does, is run ipa-pta before and after icf.
> > 
> > The compilation succeeds with -fno-ipa-icf.
> 
> Hmm, indeed running ICF after IPA PTA invalidates points-to info (eventually
> even causing wrong-code).  There is nothing ICF can do here (it would need
> to adjust all points-to bitmaps).
> 
> Note that this is true also for non-IPA PTA info.
> 
> The wrong-code possibilities (given that we only merge readonly decls in ICF)
> restrict themselves to equality/inequality compares which constitute an area
> in ICF that is fishy anyway.
> 
> That said - if ICF would adjust DECL_PT_UID then a testcase like
> 
> static const int a[] = { 1, 2, 3, 4 };
> static const int b[] = { 1, 2, 3, 4 };
> 
> bool isA (int *p) { return p == a; }
> bool isB (int *p) { return p == b; }
> int main()
> {
>   if (! (isA (a) || isB (a)))
>     abort (); 
> }

In the following sample, we do not merge because of:
"Not unifying; adress of original and alias may be compared."

> 
> could start to abort (it's a bit tricky and would involve some disabling
> of some CCP I guess).
> 
> Honza, Martin - I suppose if we start to comare DECL_PT_UID in ICF then
> this effectively disables ICF of variables.  Any ideas besides adjusting
> DECL_PT_UID in ICF and hoping for the best (on the wrong-code issue)?

I would expect that we'll kill majority of merges of variables.
Well, using the obvious patch:

diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index dda5cac..3c04b5a 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -2258,6 +2258,8 @@ sem_variable::merge (sem_item *alias_item)

       varpool_node::create_alias (alias_var->decl, decl);
       alias->resolve_alias (original);
+      if (DECL_PT_UID_SET_P (original->decl))
+       SET_DECL_PT_UID (alias->decl, DECL_PT_UID (original->decl));

       if (dump_file)
        fprintf (dump_file, "Unified; Variable alias has been created.\n\n");

The ICE has gone. However, I can't imagine if it can have any negative
consequences?

Martin

Reply via email to