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: ifcvt/crossjump patch: Fix PR 42496, 21803


On 07/29/2010 06:19 PM, Paolo Bonzini wrote:
> I'd like to have a note to the reader that df_analyze is only invoked
> when you do crossjumping.  Please add an assert like
> 
>   if (block_was_dirty)
>     {
>       gcc_assert (mode & CLEANUP_CROSSJUMP);
>       df_analyze ();
>     }

Can do.

> We do not use dataflow otherwise, and it is not necessary to call it
> gratuitously.  Passes know that CFG cleanup destroys dataflow and call
> it themselves if necessary.

Then again, we probably won't lose much by calling df_analyze during
cfgcleanup if the following pass needs it anyway - right?

> Second, crossjumping is now more expensive.  Does it buy much really to
> iterate it?  Something like
> 
>   mode &= ~CLEANUP_CROSSJUMP;
> 
> just before iterating may still leave it "good enough".

A quick experiment shows that this causes many missed opportunities.
(Placed it after the run_fast_dce call).

Another issue that I stumbled across is that cfgcleanup uses the
df_bb_dirty flag for other reasons: it uses it to test whether a block
has changed previously, and retries its optimizations only if that is
the case.  We probably need a different flag to indicate "block changed
during cfgcleanup" and set it from df_bb_dirty just before calling
df_analyze.


Bernd


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