On Sat, Oct 16, 2021 at 8:46 AM Richard Biener via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > On October 16, 2021 2:47:51 PM GMT+02:00, Jan Hubicka via Gcc-patches > <gcc-patches@gcc.gnu.org> wrote: > >Hi, > >while updating compute_points_to_sets I missed that the code not only > >sets the nonlocal/escaped flags but also initializes pt. With my > >previous change if uses_global_memory is false pt is not updated > >correctly which may lead to wrong code. > > > >This is fixed by the following patch I comitted to avoid strange > >misoptimizations. > > > >Bootstrapped/regtested x86_64-linux and also tested with LTO.
This caused: FAIL: gfortran.dg/deferred_type_param_6.f90 -O1 execution test on Linux/x86-64. -march=cascadelake may be needed to reproduce it. > OK. > > Richard. > > >Honza > > > >gcc/ChangeLog: > > > > PR tree-optimization/102720 > > * tree-ssa-structalias.c (compute_points_to_sets): Fix producing > > of call used and clobbered sets. > > > >diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c > >index 6f12a66ee0d..2e6513bb72a 100644 > >--- a/gcc/tree-ssa-structalias.c > >+++ b/gcc/tree-ssa-structalias.c > >@@ -7541,17 +7541,18 @@ compute_points_to_sets (void) > > determine_global_memory_access (stmt, NULL, > > &reads_global_memory, > > &uses_global_memory); > >- if (!uses_global_memory) > >- ; > >- else if ((vi = lookup_call_use_vi (stmt)) != NULL) > >+ if ((vi = lookup_call_use_vi (stmt)) != NULL) > > { > > *pt = find_what_var_points_to (cfun->decl, vi); > > /* Escaped (and thus nonlocal) variables are always > > implicitly used by calls. */ > > /* ??? ESCAPED can be empty even though NONLOCAL > > always escaped. */ > >- pt->nonlocal = uses_global_memory; > >- pt->escaped = uses_global_memory; > >+ if (uses_global_memory) > >+ { > >+ pt->nonlocal = uses_global_memory; > >+ pt->escaped = uses_global_memory; > >+ } > > } > > else if (uses_global_memory) > > { > >@@ -7572,17 +7573,18 @@ compute_points_to_sets (void) > > determine_global_memory_access (stmt, &writes_global_memory, > > NULL, NULL); > > > >- if (!writes_global_memory) > >- ; > >- else if ((vi = lookup_call_clobber_vi (stmt)) != NULL) > >+ if ((vi = lookup_call_clobber_vi (stmt)) != NULL) > > { > > *pt = find_what_var_points_to (cfun->decl, vi); > > /* Escaped (and thus nonlocal) variables are always > > implicitly clobbered by calls. */ > > /* ??? ESCAPED can be empty even though NONLOCAL > > always escaped. */ > >- pt->nonlocal = writes_global_memory; > >- pt->escaped = writes_global_memory; > >+ if (writes_global_memory) > >+ { > >+ pt->nonlocal = writes_global_memory; > >+ pt->escaped = writes_global_memory; > >+ } > > } > > else if (writes_global_memory) > > { > -- H.J.