This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/70856] [6/7 Regression] ICE with -fopenacc in get_constraint_for_ssa_var, at tree-ssa-structalias.c:2952
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 17 May 2016 07:47:51 +0000
- Subject: [Bug fortran/70856] [6/7 Regression] ICE with -fopenacc in get_constraint_for_ssa_var, at tree-ssa-structalias.c:2952
- Auto-submitted: auto-generated
- References: <bug-70856-4 at http dot gcc dot gnu dot org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70856
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |hubicka at gcc dot gnu.org,
| |mliska at suse dot cz
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
(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 ();
}
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)?