Re: Fix wrong code in ldist-strlen-1.c
On Sat, Oct 16, 2021 at 8:46 AM Richard Biener via Gcc-patches wrote: > > On October 16, 2021 2:47:51 PM GMT+02:00, Jan Hubicka via Gcc-patches > 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, > > _global_memory, > > _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, _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.
Re: Fix wrong code in ldist-strlen-1.c
On October 16, 2021 2:47:51 PM GMT+02:00, Jan Hubicka via Gcc-patches 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, > _global_memory, > _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, _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) > {
Fix wrong code in ldist-strlen-1.c
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. 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, _global_memory, _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, _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) {