diff options
author | Damien George <damien.p.george@gmail.com> | 2017-04-22 14:58:01 +1000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2017-04-22 14:58:01 +1000 |
commit | ae54fbf1668959e50632034495631b0c5952ae9d (patch) | |
tree | 93af5ef82e9b2562bd96fbee26182d0d14f73cd4 /py/mpconfig.h | |
parent | 40b40ffc98627b32adf83f3d657d237a9c59acca (diff) | |
download | micropython-ae54fbf1668959e50632034495631b0c5952ae9d.tar.gz micropython-ae54fbf1668959e50632034495631b0c5952ae9d.zip |
py/compile: Add COMP_RETURN_IF_EXPR option to enable return-if-else opt.
With this optimisation enabled the compiler optimises the if-else
expression within a return statement. The optimisation reduces bytecode
size by 2 bytes for each use of such a return-if-else statement. Since
such a statement is not often used, and costs bytes for the code, the
feature is disabled by default.
For example the following code:
def f(x):
return 1 if x else 2
compiles to this bytecode with the optimisation disabled (left column is
bytecode offset in bytes):
00 LOAD_FAST 0
01 POP_JUMP_IF_FALSE 8
04 LOAD_CONST_SMALL_INT 1
05 JUMP 9
08 LOAD_CONST_SMALL_INT 2
09 RETURN_VALUE
and to this bytecode with the optimisation enabled:
00 LOAD_FAST 0
01 POP_JUMP_IF_FALSE 6
04 LOAD_CONST_SMALL_INT 1
05 RETURN_VALUE
06 LOAD_CONST_SMALL_INT 2
07 RETURN_VALUE
So the JUMP to RETURN_VALUE is optimised and replaced by RETURN_VALUE,
saving 2 bytes and making the code a bit faster.
Diffstat (limited to 'py/mpconfig.h')
-rw-r--r-- | py/mpconfig.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/py/mpconfig.h b/py/mpconfig.h index b6e24d2055..9122c99163 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -353,6 +353,12 @@ #define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (0) #endif +// Whether to enable optimisation of: return a if b else c +// Costs about 80 bytes (Thumb2) and saves 2 bytes of bytecode for each use +#ifndef MICROPY_COMP_RETURN_IF_EXPR +#define MICROPY_COMP_RETURN_IF_EXPR (0) +#endif + /*****************************************************************************/ /* Internal debugging stuff */ |