refactor Perl_leave_scope
authorDavid Mitchell <davem@iabyn.com>
Sun, 25 Nov 2012 23:08:11 +0000 (23:08 +0000)
committerDavid Mitchell <davem@iabyn.com>
Tue, 4 Dec 2012 10:22:20 +0000 (10:22 +0000)
commit03dba56127506a6979ee0298da57d71840dee39d
tree9ea5b5599689de08be766807e2adba6105d1dc59
parentd172696c35223548e4cde3868d91bd72b7c7c195
refactor Perl_leave_scope

This is a large and hot function. The main problem with it is that
there is code to pop a few args repeated in just about every branch.
Also, there are a whole bunch of local vars (sv, av, hv, gv etc)
that are never all used simultaneously, but are really just there for
casting convenience. Together, they defeat the compiler's register
allocation algorithms (well, they did for gcc anyway).

We fix this by just declaring three general vars, arg0,1,2 of type ANY, and
move the popping code to above the switch(). We sort the SAVEt_*
indices in order of number of args, so it's quick to determine how many
args we need to pop for a particular type.

Together with the previous commits which added the SS_ADD_* macros, this
reduces the size of scope.o (-O2, gcc x86_64) by about 9% (threaded)
or 17% (unthreaded), and seems to speed up simple loops / function calls
by around 5%.
scope.c
scope.h