> On Fri, Apr 20, 2012 at 11:24 AM, Jan Hubicka <hubi...@ucw.cz> wrote:
> >> >
> >> > The original motivation to do switch conversion early was to get function
> >> > bodies smaller (i.e. when inlining the static var don't need 
> >> > duplication, the
> >> > switch code does)
> >> >
> >> > This was motivated by real world examples, i.e. mesa that inlines 
> >> > function converting
> >> > error codes into strings. At one point we estimated it to be of 0 size 
> >> > (because it
> >> > has only switch that was ignored and string constants that are zero 
> >> > cost) and we
> >> > ended up completely exploding by inlining it everywhere.
> >>
> >> Well, I never really believed this theory ;)
> >
> > :) It was a bug in the cost functions (it now has switch statement 
> > estimation code in it
> > for this reason), but anyway it shows that converting those kind of switch 
> > constructs
> > helps to get more inlining and code sharing.
> 
> Well, there are a lot of things that eventually lead to code size savings.  
> But
> in early opts we only want to do things that _always_ lead to code size 
> savings.

Agreed, we should do only transforms that are win code size and performance 
wise.
But the switch conversion code does that (at least in the cases we speak about).

> And things that do not affect debugging (I'm still thinking of doing a -Og or
> re-doing -O1 to only do early opts - still having switch conversion in that 
> set
> sounds odd).

Converting swtich to table lookup kills the statements in the case labels and 
degrade
debug info. But this is not too different from what copy propagation/DCE and 
other things
we definitely want in early opts does. It does not seem to be that disturbing 
for
debugger to me.

Honza
> 
> > Still it seems to me that we are mixing two essentially independent things 
> > - one is
> > set of recognizers for trivial switch constructs that can be easilly 
> > converted into
> > smaller and faster switch free code. This IMO makes sense to do early.
> >
> > Second is expanding switch constructs into decision trees (i.e. lowering) 
> > that
> > makes sense to be later after profile is built and code is resonably 
> > optimized.
> >>
> >> > I think we should retain this and perhaps have always win conversions 
> >> > done early
> >> > and real coversion (of switches to decision trees) done much later.
> >> > Switch expansion hides what the code really does and some of the late 
> >> > optimizers
> >> > will probably benefit from knowing that switch is really a switch.
> >> >
> >> > I would expect that somewhere before second VRP makes most sense.
> >>
> >> No, I think before loop opts it makes most sense as you can end up
> >> creating vectorizable code.  After first VRP because such VRP can
> >> remove dead cases.
> >
> > Hmm, before loop opts it makes sense indeed.
> >>
> >> Richard.
> >>
> >> > Honza

Reply via email to