This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, PR rtl-optimization/71148] Avoid cleanup_cfg called with invalidated dominance info


On Wed, May 18, 2016 at 6:17 PM, Ilya Enkovich <enkovich.gnu@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.enkovich@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.enkovich@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;
> +}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]