https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72855

--- Comment #5 from Bill Schmidt <wschmidt at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #2)
> If we have release checking enabled then we shuould hit
> 
> static void
> df_analyze_1 (void)
> {
> ...
> #ifndef ENABLE_DF_CHECKING
>   if (df->changeable_flags & DF_VERIFY_SCHEDULED)
> #endif
>     df_verify ();
> 
> so I wonder why df->changeable_flags & DF_VERIFY_SCHEDULED is ever true
> for release checking.  Can you track that down?  

df_finish_pass has the following unguarded code at the end of the function:

  if (flag_checking && verify)
    df->changeable_flags |= DF_VERIFY_SCHEDULED;

This is the only way that DF_VERIFY_SCHEDULED gets turned on by itself.

> But yes, performing df_verify for each loop in a function is excessive,
> we seem to lack ever clearing said flag.  Does
> 
> Index: gcc/df-core.c
> ===================================================================
> --- gcc/df-core.c       (revision 239276)
> +++ gcc/df-core.c       (working copy)
> @@ -1833,6 +1833,7 @@ df_verify (void)
>    if (df_live)
>      df_live_verify_transfer_functions ();
>  #endif
> +  df->changeable_flags &= ~DF_VERIFY_SCHEDULED;
>  }
>  
>  #ifdef DF_DEBUG_CFG
> 
> help in the non-DF-checking case?

It should, since df_finish_pass isn't called (indirectly from iv_analysis_done)
by the doloop code until after all of the loops have been processed.

Reply via email to