[CFG] More aggresive constant_iterations

Zdenek Dvorak rakdver@atrey.karlin.mff.cuni.cz
Wed May 29 03:58:00 GMT 2002


Hello.

> > Changelog:
> > 	* loop.h (struct loop_desc): Field init replaced by var_alts,
> > 	new field lim_alts.
> > 	* unroll-new.c (variable_initial_values): New static function.
> > 	(count_loop_iterations): Add arguments for explicit values of
> > 	initial and final value.
> > 	(simple_condition_p): Use variable_initial_values.
> > 	(constant_iterations): More aggressive now.
> > 	(simple_loop_exit_p): Use variable_initial_values, dump lim_alts and
> > 	var_alts.
> > 	(test_for_iteration, unroll_loop_runtime_iterations): Modified.
> 
> OK,
> Looks correct to me, so I will install it.  In what testcases this
> helps?

The only one I'm able to think out is

for (i=a;i<a+100;i++)
  {
    ...
  }

Where we had problems because we were often not able to determine that
it iterates 100 times (because value of a was copied and a+100 was
calculated from the first place, for example); probably it is not very
important, but this fix is more consistent than the previous one I made
for this case.

> Is the gain considerable?  Can't we run into very expensive loops (where
> we get a lot of alternatives)

The alternatives are created only when registers are copied from one to
other several times; I'm not sure how long and often such chains are. If
the possibly quadratic behavior turned out to be a problem, it could be
reworked so that it would be linear (it does not make much sense to
compare every with every, when all members of the lists except the last
one are just registers); I haven't done it because it is more general
this way (although I don't have an idea whether/how it could help us in
the future).

Zdenek



More information about the Gcc-patches mailing list