On Thu, Jun 28, 2012 at 10:33 AM, Zhenqiang Chen <zhenqiang.c...@arm.com> wrote: >>> diff --git a/gcc/loop-init.c b/gcc/loop-init.c index 03f8f61..5d8cf73 >>> 100644 >>> --- a/gcc/loop-init.c >>> +++ b/gcc/loop-init.c >>> @@ -273,6 +273,12 @@ struct rtl_opt_pass pass_rtl_loop_done = >>> static bool >>> gate_rtl_move_loop_invariants (void) >>> { >>> + /* In general, invariant motion can not reduce code size. But it >>> + will >>> + change the liverange of the invariant, which increases the >>> + register >>> + pressure and might lead to more spilling. */ >>> + if (optimize_function_for_size_p (cfun)) >>> + return false; >>> + >> >>Can you do this per loop instead? Using optimize_loop_nest_for_size_p? > > Update it according to the comments. > > Thanks! > -Zhenqiang > > diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c > index f8405dd..b0e84a7 100644 > --- a/gcc/loop-invariant.c > +++ b/gcc/loop-invariant.c > @@ -1931,7 +1931,8 @@ move_loop_invariants (void) > curr_loop = loop; > /* move_single_loop_invariants for very large loops > is time consuming and might need a lot of memory. */ > - if (loop->num_nodes <= (unsigned) LOOP_INVARIANT_MAX_BBS_IN_LOOP) > + if (loop->num_nodes <= (unsigned) LOOP_INVARIANT_MAX_BBS_IN_LOOP > + && ! optimize_loop_nest_for_size_p (loop)) > move_single_loop_invariants (loop);
Wait - move_single_loop_invariants itself already uses optimize_loop_for_speed_p. And looking down it seems to have support for tracking spill cost (eventually only with -fira-loop-pressure) - please work out why this support is not working for you. Richard. > } > > ChangeLog: > 2012-06-28 Zhenqiang Chen <zhenqiang.c...@arm.com> > > * loop-invariant.c (move_loop_invariants): Skip > move_single_loop_invariants when optimizing loop for size > > > >