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.
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) > {