On Wed, May 18, 2016 at 6:17 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: > Hi, > > This patch resolves PR71148 by releasing dominance info before > cleanup_cfg calls to avoid attempts to fixup invalid dominance > info. > > Dominance info handling in cleanup_cfg looks weird though. It > tries to fix it but can invalidate it at the same time (PR71084). > We should probably do something with that. > > Tracker is P1 and this patch may be OK solution for now. > > Bootstrapped and regtested on x86_64-pc-linux-gnu. Ok for trunk?
Hum... all this dancing with CSE looks bogus to me. Does CSE itself need dominance info? If not then unconditionally free it at its start. Richard. > Thanks, > Ilya > -- > gcc/ > > 2016-05-18 Ilya Enkovich <ilya.enkov...@intel.com> > > PR rtl-optimization/71148 > * cse.c (rest_of_handle_cse): Free dominance info > before cleanup_cfg call if required. > (rest_of_handle_cse2): Likewise. > (rest_of_handle_cse_after_global_opts): Likewise. > > gcc/testsuite/ > > 2016-05-18 Ilya Enkovich <ilya.enkov...@intel.com> > > PR rtl-optimization/71148 > * gcc.dg/pr71148.c: New test. > > > diff --git a/gcc/cse.c b/gcc/cse.c > index 322e352..4aa4443 100644 > --- a/gcc/cse.c > +++ b/gcc/cse.c > @@ -7558,6 +7558,12 @@ rest_of_handle_cse (void) > expecting CSE to be run. But always rerun it in a cheap mode. */ > cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse; > > + /* Check if we need to free dominance info before cleanup_cfg > + because it may become really slow in case of invalid > + dominance info. */ > + if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) > + free_dominance_info (CDI_DOMINATORS); > + > if (tem == 2) > { > timevar_push (TV_JUMP); > @@ -7630,6 +7636,12 @@ rest_of_handle_cse2 (void) > > delete_trivially_dead_insns (get_insns (), max_reg_num ()); > > + /* Check if we need to free dominance info before cleanup_cfg > + because it may become really slow in case of invalid > + dominance info. */ > + if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) > + free_dominance_info (CDI_DOMINATORS); > + > if (tem == 2) > { > timevar_push (TV_JUMP); > @@ -7706,6 +7718,12 @@ rest_of_handle_cse_after_global_opts (void) > > cse_not_expected = !flag_rerun_cse_after_loop; > > + /* Check if we need to free dominance info before cleanup_cfg > + because it may become really slow in case of invalid > + dominance info. */ > + if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS)) > + free_dominance_info (CDI_DOMINATORS); > + > /* If cse altered any jumps, rerun jump opts to clean things up. */ > if (tem == 2) > { > diff --git a/gcc/testsuite/gcc.dg/pr71148.c b/gcc/testsuite/gcc.dg/pr71148.c > new file mode 100644 > index 0000000..6aa4920 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr71148.c > @@ -0,0 +1,46 @@ > +/* PR rtl-optimization/71148 */ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -funroll-loops" } */ > + > +int rh, ok, kq, fu; > + > +void > +js (int cs) > +{ > + rh = fu; > + if (fu != 0) > + { > + cs /= 3; > + if (cs <= 0) > + { > + int z9; > + for (z9 = 0; z9 < 2; ++z9) > + { > + z9 += cs; > + ok += z9; > + fu += ok; > + } > + } > + } > +} > + > +void > +vy (int s3) > +{ > + int yo, g2 = 0; > + sd: > + js (g2); > + for (yo = 0; yo < 2; ++yo) > + { > + if (fu != 0) > + goto sd; > + kq += (s3 != (g2 ? s3 : 0)); > + for (s3 = 0; s3 < 72; ++s3) > + g2 *= (~0 - 1); > + g2 -= yo; > + } > + for (fu = 0; fu < 18; ++fu) > + for (yo = 0; yo < 17; ++yo) > + if (g2 < 0) > + goto sd; > +}