This is the mail archive of the
mailing list for the GCC project.
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 ();
> 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