Daniel Berlin wrote:

On Thu, 2005-12-15 at 00:48 +0100, Steven Bosscher wrote:
Hi,

Someone caused a >10% compile time regression yesterday for CSiBE, see
http://www.csibe.org/draw-diag.php?branchid=mainline&flags=-Os&rel_flag=--none--&dataview=Timeline&finish_button=Finish&draw=sbs&view=1&basephp=l-sbs


Gr.
Steven


This is very very bad.

Joern, i'd imagine this was your patch.
I think this is related to using register liveness information from flow. My original if-conversion patch http://gcc.gnu.org/ml/gcc-patches/2004-01/msg03281.html used a simple linear-time
algorithm to identify registers that are local to each basic block.

I can think of two things that could cause a noticable slowdown:

- comparison of global_live_at_end in struct_equiv_init. Most call sites call gcc_unreachable when struct_equiv_init fails. If an additional parameter is passed into struct_equiv_init to tell if the the comparison may fail, we can optimize the sanity check out for !ENABLE_CHECKING. - The call to update_life_info_in_dirty_blocks when one of the compared blocks is dirty. I'm not sure if we could get away with doing a local update, and/or starting the update only for the blocks under consideration. If we don't have to do the global_live_at_end comparison, we can probably also skip the update if only one of the blocks is dirty, and use the global_live_at_end from the block that is not dirty.

A further improvement might be to remove the regset comparison from struct_equiv_init altogether, and only make sure we use a global_live_at_end that is right for at least one of the blocks. The regsets can be compared later when we have matched all the edges, maybe even the entire block.

We could also go back to makling sure we have consistent data flow information at the start of the pass, and keep the bits that we need up-to-date as we go along.




Reply via email to