osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Python-Dev] Register-based VM [Was: Possible performance regression]


Le mar. 26 f?vr. 2019 ? 23:40, Greg Ewing
<greg.ewing at canterbury.ac.nz> a ?crit :
> Victor Stinner wrote:
> > LOAD_CONST_REG       R0, 2 (const#2)
> > LOAD_GLOBAL_REG      R1, 'range' (name#0)
> > CALL_FUNCTION_REG    4, R1, R1, R0, 'n'
>
> Out of curiosity, why is the function being passed twice here?

Ah, I should have explained that :-) The first argument of
CALL_FUNCTION_REG is the name of the register used to store the
result.

The compiler begins with using static single assignment form (SSA) but
then uses a register allocator to reduce the number of used registers.
Usually, at the end you have less than 5 registers for a whole
function.

Since R1 was only used to store the function before the call and isn't
used after, the R1 register can be re-used.

Using a different register may require an explicit "CLEAR_REG R1"
(decref the reference to the builtin range function) which is less
efficient.

Note: The CALL_FUNCTION instruction using the stack implicitly put the
result into the stack (and "pop" function arguments from the stack).

Victor
-- 
Night gathers, and now my watch begins. It shall not end until my death.