From f4cf76dd5eabd8af5d2a866da1f75fa745aa6f29 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 24 Apr 2003 05:45:23 +0000 Subject: Revert the previous enhancement to the bytecode optimizer. The additional code complexity and new NOP opcode were not worth it. --- Include/opcode.h | 2 -- Lib/opcode.py | 2 -- Misc/NEWS | 7 ----- Python/ceval.c | 3 -- Python/compile.c | 92 ++++++-------------------------------------------------- 5 files changed, 9 insertions(+), 97 deletions(-) diff --git a/Include/opcode.h b/Include/opcode.h index 9f7d263..2f3dd04 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -14,8 +14,6 @@ extern "C" { #define DUP_TOP 4 #define ROT_FOUR 5 -#define NOP 9 - #define UNARY_POSITIVE 10 #define UNARY_NEGATIVE 11 #define UNARY_NOT 12 diff --git a/Lib/opcode.py b/Lib/opcode.py index 15f92a7..cfde5f8 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -49,8 +49,6 @@ def_op('ROT_THREE', 3) def_op('DUP_TOP', 4) def_op('ROT_FOUR', 5) -def_op('NOP', 9) - def_op('UNARY_POSITIVE', 10) def_op('UNARY_NEGATIVE', 11) def_op('UNARY_NOT', 12) diff --git a/Misc/NEWS b/Misc/NEWS index 4996f1b..65ad925 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -306,13 +306,6 @@ Core and builtins value, but according to PEP 237 it really needs to be 1 now. This will be backported to Python 2.2.3 a well. (SF #660455) -- Added several bytecode optimizations. Provides speed-ups to - inverted in/is tests, inverted jumps, while 1 loops, and jumps to - unconditional jumps. - -- Added a new opcode, NOP, which is used in some of the bytecode - transformations. - - int(s, base) sometimes sign-folds hex and oct constants; it only does this when base is 0 and s.strip() starts with a '0'. When the sign is actually folded, as in int("0xffffffff", 0) on a 32-bit diff --git a/Python/ceval.c b/Python/ceval.c index 7f8f654..3ea1bdc 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -873,9 +873,6 @@ eval_frame(PyFrameObject *f) /* case STOP_CODE: this is an error! */ - case NOP: - goto fast_next_opcode; - case LOAD_FAST: x = GETLOCAL(oparg); if (x != NULL) { diff --git a/Python/compile.c b/Python/compile.c index 4afd0eb..57f0edb 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -328,43 +328,6 @@ intern_strings(PyObject *tuple) #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP) #define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3)) #define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255 -#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1) -#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1]) - -static unsigned int * -markblocks(unsigned char *code, int len) -{ - unsigned int *blocks = PyMem_Malloc(len*sizeof(int)); - int i,j, opcode, oldblock, newblock, blockcnt = 0; - - if (blocks == NULL) - return NULL; - memset(blocks, 0, len*sizeof(int)); - for (i=0 ; i a is not b - not a in b --> a not in b - not a is not b --> a is b - not a not in b --> a in b */ - case COMPARE_OP: - j = GETARG(codestr, i); - if (codestr[i+3] != UNARY_NOT || j < 6 || \ - j > 9 || !ISBASICBLOCK(blocks,i,4)) - continue; - SETARG(codestr, i, (j^1)); - codestr[i+3] = NOP; - break; - /* Replace jumps to unconditional jumps */ case FOR_ITER: case JUMP_FORWARD: @@ -475,7 +402,7 @@ optimize_code(PyObject *code, PyObject* consts) case SETUP_EXCEPT: case SETUP_FINALLY: tgt = GETJUMPTGT(codestr, i); - if (!UNCONDITIONAL_JUMP(codestr[tgt])) + if (!UNCONDITIONAL_JUMP(codestr[tgt])) continue; tgttgt = GETJUMPTGT(codestr, tgt); if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */ @@ -495,7 +422,6 @@ optimize_code(PyObject *code, PyObject* consts) } code = PyString_FromStringAndSize(codestr, codelen); PyMem_Free(codestr); - PyMem_Free(blocks); return code; exitUnchanged: -- cgit v0.12