annotate Python/peephole.c @ 48178:cf331fef3293 legacy-trunk

Silence warnings under -3 triggered by wsgiref.
author Brett Cannon <bcannon@gmail.com>
date Mon, 04 Aug 2008 21:30:53 +0000
parents 52294af4b663
children 97d7cd365dd5 ef8fe9088696
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
40998
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
1 /* Peephole optimizations for bytecode compiler. */
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
2
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 #include "Python.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5 #include "Python-ast.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
6 #include "node.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7 #include "pyarena.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 #include "ast.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9 #include "code.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 #include "compile.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11 #include "symtable.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 #include "opcode.h"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
14 #define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
15 #define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16 #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
17 #define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18 #define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19 #define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 #define ISBASICBLOCK(blocks, start, bytes) \
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 (blocks[start]==blocks[start+bytes-1])
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23 /* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24 with LOAD_CONST (c1, c2, ... cn).
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
25 The consts table must still be in list form so that the
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 new constant (c1, c2, ... cn) can be appended.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27 Called with codestr pointing to the first LOAD_CONST.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 Bails out with no change if one or more of the LOAD_CONSTs is missing.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29 Also works for BUILD_LIST when followed by an "in" or "not in" test.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30 */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31 static int
46062
09adff3d6691 Try to fix a bunch of compiler warnings on Win64.
Neal Norwitz <nnorwitz@gmail.com>
parents: 45511
diff changeset
32 tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
33 {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34 PyObject *newconst, *constant;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 Py_ssize_t i, arg, len_consts;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37 /* Pre-conditions */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
38 assert(PyList_CheckExact(consts));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
39 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
40 assert(GETARG(codestr, (n*3)) == n);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
41 for (i=0 ; i<n ; i++)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
42 assert(codestr[i*3] == LOAD_CONST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
43
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
44 /* Buildup new tuple of constants */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
45 newconst = PyTuple_New(n);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46 if (newconst == NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
48 len_consts = PyList_GET_SIZE(consts);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 for (i=0 ; i<n ; i++) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
50 arg = GETARG(codestr, (i*3));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
51 assert(arg < len_consts);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
52 constant = PyList_GET_ITEM(consts, arg);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
53 Py_INCREF(constant);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
54 PyTuple_SET_ITEM(newconst, i, constant);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
55 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
56
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
57 /* Append folded constant onto consts */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
58 if (PyList_Append(consts, newconst)) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
59 Py_DECREF(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
60 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
62 Py_DECREF(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
63
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
64 /* Write NOPs over old LOAD_CONSTS and
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
65 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
66 memset(codestr, NOP, n*3);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
67 codestr[n*3] = LOAD_CONST;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
68 SETARG(codestr, (n*3), len_consts);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
69 return 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
70 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
71
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
72 /* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
73 with LOAD_CONST binop(c1,c2)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
74 The consts table must still be in list form so that the
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
75 new constant can be appended.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
76 Called with codestr pointing to the first LOAD_CONST.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
77 Abandons the transformation if the folding fails (i.e. 1+'a').
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
78 If the new constant is a sequence, only folds when the size
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
79 is below a threshold value. That keeps pyc files from
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
80 becoming large in the presence of code like: (None,)*1000.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
81 */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
82 static int
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
83 fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
84 {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
85 PyObject *newconst, *v, *w;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
86 Py_ssize_t len_consts, size;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
87 int opcode;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
88
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
89 /* Pre-conditions */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
90 assert(PyList_CheckExact(consts));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
91 assert(codestr[0] == LOAD_CONST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
92 assert(codestr[3] == LOAD_CONST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
93
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
94 /* Create new constant */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
95 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
96 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
97 opcode = codestr[6];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
98 switch (opcode) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
99 case BINARY_POWER:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
100 newconst = PyNumber_Power(v, w, Py_None);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
101 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
102 case BINARY_MULTIPLY:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
103 newconst = PyNumber_Multiply(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
105 case BINARY_DIVIDE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
106 /* Cannot fold this operation statically since
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
107 the result can depend on the run-time presence
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
108 of the -Qnew flag */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
109 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
110 case BINARY_TRUE_DIVIDE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111 newconst = PyNumber_TrueDivide(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
112 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
113 case BINARY_FLOOR_DIVIDE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
114 newconst = PyNumber_FloorDivide(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
115 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
116 case BINARY_MODULO:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
117 newconst = PyNumber_Remainder(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
118 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
119 case BINARY_ADD:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
120 newconst = PyNumber_Add(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
121 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
122 case BINARY_SUBTRACT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
123 newconst = PyNumber_Subtract(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
124 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
125 case BINARY_SUBSCR:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 newconst = PyObject_GetItem(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
127 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
128 case BINARY_LSHIFT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
129 newconst = PyNumber_Lshift(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
130 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
131 case BINARY_RSHIFT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
132 newconst = PyNumber_Rshift(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
133 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
134 case BINARY_AND:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
135 newconst = PyNumber_And(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
136 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
137 case BINARY_XOR:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
138 newconst = PyNumber_Xor(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
139 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
140 case BINARY_OR:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
141 newconst = PyNumber_Or(v, w);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
142 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
143 default:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
144 /* Called with an unknown opcode */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
145 PyErr_Format(PyExc_SystemError,
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
146 "unexpected binary operation %d on a constant",
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
147 opcode);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
148 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
149 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
150 if (newconst == NULL) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
151 PyErr_Clear();
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
152 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
153 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
154 size = PyObject_Size(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
155 if (size == -1)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
156 PyErr_Clear();
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
157 else if (size > 20) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
158 Py_DECREF(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
159 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
160 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
161
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
162 /* Append folded constant into consts table */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
163 len_consts = PyList_GET_SIZE(consts);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
164 if (PyList_Append(consts, newconst)) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
165 Py_DECREF(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
166 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
167 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
168 Py_DECREF(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
169
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
170 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
171 memset(codestr, NOP, 4);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
172 codestr[4] = LOAD_CONST;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
173 SETARG(codestr, 4, len_consts);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
174 return 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
175 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
176
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
177 static int
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
178 fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
179 {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
180 PyObject *newconst=NULL, *v;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
181 Py_ssize_t len_consts;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
182 int opcode;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
183
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
184 /* Pre-conditions */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
185 assert(PyList_CheckExact(consts));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
186 assert(codestr[0] == LOAD_CONST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
187
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
188 /* Create new constant */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
189 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
190 opcode = codestr[3];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
191 switch (opcode) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
192 case UNARY_NEGATIVE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
193 /* Preserve the sign of -0.0 */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
194 if (PyObject_IsTrue(v) == 1)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
195 newconst = PyNumber_Negative(v);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
196 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
197 case UNARY_CONVERT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
198 newconst = PyObject_Repr(v);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
199 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
200 case UNARY_INVERT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
201 newconst = PyNumber_Invert(v);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
202 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
203 default:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
204 /* Called with an unknown opcode */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
205 PyErr_Format(PyExc_SystemError,
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
206 "unexpected unary operation %d on a constant",
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
207 opcode);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
208 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
209 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
210 if (newconst == NULL) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
211 PyErr_Clear();
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
212 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
213 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
214
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
215 /* Append folded constant into consts table */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
216 len_consts = PyList_GET_SIZE(consts);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
217 if (PyList_Append(consts, newconst)) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
218 Py_DECREF(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
219 return 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
220 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
221 Py_DECREF(newconst);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
222
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
223 /* Write NOP LOAD_CONST newconst */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
224 codestr[0] = NOP;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
225 codestr[1] = LOAD_CONST;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
226 SETARG(codestr, 1, len_consts);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
227 return 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
228 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
229
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
230 static unsigned int *
46062
09adff3d6691 Try to fix a bunch of compiler warnings on Win64.
Neal Norwitz <nnorwitz@gmail.com>
parents: 45511
diff changeset
231 markblocks(unsigned char *code, Py_ssize_t len)
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
232 {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
233 unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
234 int i,j, opcode, blockcnt = 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
235
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
236 if (blocks == NULL) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
237 PyErr_NoMemory();
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
238 return NULL;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
239 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
240 memset(blocks, 0, len*sizeof(int));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
241
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
242 /* Mark labels in the first pass */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
243 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
244 opcode = code[i];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
245 switch (opcode) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
246 case FOR_ITER:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
247 case JUMP_FORWARD:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
248 case JUMP_IF_FALSE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
249 case JUMP_IF_TRUE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
250 case JUMP_ABSOLUTE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
251 case CONTINUE_LOOP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
252 case SETUP_LOOP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
253 case SETUP_EXCEPT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
254 case SETUP_FINALLY:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
255 j = GETJUMPTGT(code, i);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
256 blocks[j] = 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
257 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
258 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
259 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
260 /* Build block numbers in the second pass */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
261 for (i=0 ; i<len ; i++) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
262 blockcnt += blocks[i]; /* increment blockcnt over labels */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
263 blocks[i] = blockcnt;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
264 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
265 return blocks;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
266 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
267
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
268 /* Perform basic peephole optimizations to components of a code object.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
269 The consts object should still be in list form to allow new constants
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
270 to be appended.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
271
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
272 To keep the optimizer simple, it bails out (does nothing) for code
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
273 containing extended arguments or that has a length over 32,700. That
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
274 allows us to avoid overflow and sign issues. Likewise, it bails when
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
275 the lineno table has complex encoding for gaps >= 255.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
276
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
277 Optimizations are restricted to simple transformations occuring within a
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
278 single basic block. All transformations keep the code size the same or
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
279 smaller. For those that reduce size, the gaps are initially filled with
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
280 NOPs. Later those NOPs are removed and the jump addresses retargeted in
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
281 a single pass. Line numbering is adjusted accordingly. */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
282
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
283 PyObject *
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
284 PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
285 PyObject *lineno_obj)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
286 {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
287 Py_ssize_t i, j, codelen;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
288 int nops, h, adj;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
289 int tgt, tgttgt, opcode;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
290 unsigned char *codestr = NULL;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
291 unsigned char *lineno;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
292 int *addrmap = NULL;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
293 int new_line, cum_orig_line, last_line, tabsiz;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
294 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
295 unsigned int *blocks = NULL;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
296 char *name;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
297
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
298 /* Bail out if an exception is set */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
299 if (PyErr_Occurred())
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
300 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
301
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
302 /* Bypass optimization when the lineno table is too complex */
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
303 assert(PyString_Check(lineno_obj));
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
304 lineno = (unsigned char*)PyString_AS_STRING(lineno_obj);
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
305 tabsiz = PyString_GET_SIZE(lineno_obj);
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
306 if (memchr(lineno, 255, tabsiz) != NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
307 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
308
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
309 /* Avoid situations where jump retargeting could overflow */
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
310 assert(PyString_Check(code));
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
311 codelen = PyString_GET_SIZE(code);
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
312 if (codelen > 32700)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
313 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
314
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
315 /* Make a modifiable copy of the code string */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
316 codestr = (unsigned char *)PyMem_Malloc(codelen);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
317 if (codestr == NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
318 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
319 codestr = (unsigned char *)memcpy(codestr,
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
320 PyString_AS_STRING(code), codelen);
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
321
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
322 /* Verify that RETURN_VALUE terminates the codestring. This allows
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
323 the various transformation patterns to look ahead several
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
324 instructions without additional checks to make sure they are not
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
325 looking beyond the end of the code string.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
326 */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
327 if (codestr[codelen-1] != RETURN_VALUE)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
328 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
329
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
330 /* Mapping to new jump targets after NOPs are removed */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
331 addrmap = (int *)PyMem_Malloc(codelen * sizeof(int));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
332 if (addrmap == NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
333 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
334
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
335 blocks = markblocks(codestr, codelen);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
336 if (blocks == NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
337 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
338 assert(PyList_Check(consts));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
339
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
340 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
341 opcode = codestr[i];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
342
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
343 lastlc = cumlc;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
344 cumlc = 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
345
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
346 switch (opcode) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
347
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
348 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
349 with JUMP_IF_TRUE POP_TOP */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
350 case UNARY_NOT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
351 if (codestr[i+1] != JUMP_IF_FALSE ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
352 codestr[i+4] != POP_TOP ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
353 !ISBASICBLOCK(blocks,i,5))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
354 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
355 tgt = GETJUMPTGT(codestr, (i+1));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
356 if (codestr[tgt] != POP_TOP)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
357 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
358 j = GETARG(codestr, i+1) + 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
359 codestr[i] = JUMP_IF_TRUE;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
360 SETARG(codestr, i, j);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
361 codestr[i+3] = POP_TOP;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
362 codestr[i+4] = NOP;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
363 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
364
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
365 /* not a is b --> a is not b
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
366 not a in b --> a not in b
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
367 not a is not b --> a is b
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
368 not a not in b --> a in b
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
369 */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
370 case COMPARE_OP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
371 j = GETARG(codestr, i);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
372 if (j < 6 || j > 9 ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
373 codestr[i+3] != UNARY_NOT ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
374 !ISBASICBLOCK(blocks,i,4))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
375 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
376 SETARG(codestr, i, (j^1));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
377 codestr[i+3] = NOP;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
378 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
379
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
380 /* Replace LOAD_GLOBAL/LOAD_NAME None
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
381 with LOAD_CONST None */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
382 case LOAD_NAME:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
383 case LOAD_GLOBAL:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
384 j = GETARG(codestr, i);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
385 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
386 if (name == NULL || strcmp(name, "None") != 0)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
387 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
388 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
40998
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
389 if (PyList_GET_ITEM(consts, j) == Py_None)
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
390 break;
40998
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
391 }
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
392 if (j == PyList_GET_SIZE(consts)) {
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
393 if (PyList_Append(consts, Py_None) == -1)
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
394 goto exitUnchanged;
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
395 }
40998
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
396 assert(PyList_GET_ITEM(consts, j) == Py_None);
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
397 codestr[i] = LOAD_CONST;
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
398 SETARG(codestr, i, j);
4e3481961fbb Fix embarrassing typo and fix constantification of None
Raymond Hettinger <python@rcn.com>
parents: 40116
diff changeset
399 cumlc = lastlc + 1;
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
400 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
401
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
402 /* Skip over LOAD_CONST trueconst
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
403 JUMP_IF_FALSE xx POP_TOP */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
404 case LOAD_CONST:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
405 cumlc = lastlc + 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
406 j = GETARG(codestr, i);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
407 if (codestr[i+3] != JUMP_IF_FALSE ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
408 codestr[i+6] != POP_TOP ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
409 !ISBASICBLOCK(blocks,i,7) ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
410 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
411 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
412 memset(codestr+i, NOP, 7);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
413 cumlc = 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
414 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
415
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
416 /* Try to fold tuples of constants (includes a case for lists
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
417 which are only used for "in" and "not in" tests).
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
418 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
419 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
420 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
421 case BUILD_TUPLE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
422 case BUILD_LIST:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
423 j = GETARG(codestr, i);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
424 h = i - 3 * j;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
425 if (h >= 0 &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
426 j <= lastlc &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
427 ((opcode == BUILD_TUPLE &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
428 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
429 (opcode == BUILD_LIST &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
430 codestr[i+3]==COMPARE_OP &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
431 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
432 (GETARG(codestr,i+3)==6 ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
433 GETARG(codestr,i+3)==7))) &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
434 tuple_of_constants(&codestr[h], j, consts)) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
435 assert(codestr[i] == LOAD_CONST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
436 cumlc = 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
437 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
438 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
439 if (codestr[i+3] != UNPACK_SEQUENCE ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
440 !ISBASICBLOCK(blocks,i,6) ||
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
441 j != GETARG(codestr, i+3))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
442 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
443 if (j == 1) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
444 memset(codestr+i, NOP, 6);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
445 } else if (j == 2) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
446 codestr[i] = ROT_TWO;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
447 memset(codestr+i+1, NOP, 5);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
448 } else if (j == 3) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
449 codestr[i] = ROT_THREE;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
450 codestr[i+1] = ROT_TWO;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
451 memset(codestr+i+2, NOP, 4);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
452 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
453 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
454
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
455 /* Fold binary ops on constants.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
456 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
457 case BINARY_POWER:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
458 case BINARY_MULTIPLY:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
459 case BINARY_TRUE_DIVIDE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
460 case BINARY_FLOOR_DIVIDE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
461 case BINARY_MODULO:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
462 case BINARY_ADD:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
463 case BINARY_SUBTRACT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
464 case BINARY_SUBSCR:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
465 case BINARY_LSHIFT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
466 case BINARY_RSHIFT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
467 case BINARY_AND:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
468 case BINARY_XOR:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
469 case BINARY_OR:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
470 if (lastlc >= 2 &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
471 ISBASICBLOCK(blocks, i-6, 7) &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
472 fold_binops_on_constants(&codestr[i-6], consts)) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
473 i -= 2;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
474 assert(codestr[i] == LOAD_CONST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
475 cumlc = 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
476 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
477 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
478
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
479 /* Fold unary ops on constants.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
480 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
481 case UNARY_NEGATIVE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
482 case UNARY_CONVERT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
483 case UNARY_INVERT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
484 if (lastlc >= 1 &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
485 ISBASICBLOCK(blocks, i-3, 4) &&
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
486 fold_unaryops_on_constants(&codestr[i-3], consts)) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
487 i -= 2;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
488 assert(codestr[i] == LOAD_CONST);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
489 cumlc = 1;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
490 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
491 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
492
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
493 /* Simplify conditional jump to conditional jump where the
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
494 result of the first test implies the success of a similar
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
495 test or the failure of the opposite test.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
496 Arises in code like:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
497 "if a and b:"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
498 "if a or b:"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
499 "a and b or c"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
500 "(a and b) and c"
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
501 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
502 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
503 where y+3 is the instruction following the second test.
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
504 */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
505 case JUMP_IF_FALSE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
506 case JUMP_IF_TRUE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
507 tgt = GETJUMPTGT(codestr, i);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
508 j = codestr[tgt];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
509 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
510 if (j == opcode) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
511 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
512 SETARG(codestr, i, tgttgt);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
513 } else {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
514 tgt -= i;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
515 SETARG(codestr, i, tgt);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
516 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
517 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
518 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
519 /* Intentional fallthrough */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
520
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
521 /* Replace jumps to unconditional jumps */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
522 case FOR_ITER:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
523 case JUMP_FORWARD:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
524 case JUMP_ABSOLUTE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
525 case CONTINUE_LOOP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
526 case SETUP_LOOP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
527 case SETUP_EXCEPT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
528 case SETUP_FINALLY:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
529 tgt = GETJUMPTGT(codestr, i);
40116
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
530 /* Replace JUMP_* to a RETURN into just a RETURN */
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
531 if (UNCONDITIONAL_JUMP(opcode) &&
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
532 codestr[tgt] == RETURN_VALUE) {
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
533 codestr[i] = RETURN_VALUE;
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
534 memset(codestr+i+1, NOP, 2);
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
535 continue;
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
536 }
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
537 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
538 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
539 tgttgt = GETJUMPTGT(codestr, tgt);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
540 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
541 opcode = JUMP_ABSOLUTE;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
542 if (!ABSOLUTE_JUMP(opcode))
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
543 tgttgt -= i + 3; /* Calc relative jump addr */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
544 if (tgttgt < 0) /* No backward relative jumps */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
545 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
546 codestr[i] = opcode;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
547 SETARG(codestr, i, tgttgt);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
548 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
549
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
550 case EXTENDED_ARG:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
551 goto exitUnchanged;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
552
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
553 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
40116
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
554 /* Remove unreachable JUMPs after RETURN */
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
555 case RETURN_VALUE:
40116
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
556 if (i+4 >= codelen)
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
557 continue;
40116
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
558 if (codestr[i+4] == RETURN_VALUE &&
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
559 ISBASICBLOCK(blocks,i,5))
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
560 memset(codestr+i+1, NOP, 4);
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
561 else if (UNCONDITIONAL_JUMP(codestr[i+1]) &&
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
562 ISBASICBLOCK(blocks,i,4))
3985d7e2067d Update the peephole optimizer to remove more dead code (jumps after returns)
Neal Norwitz <nnorwitz@gmail.com>
parents: 39600
diff changeset
563 memset(codestr+i+1, NOP, 3);
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
564 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
565 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
566 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
567
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
568 /* Fixup linenotab */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
569 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
570 addrmap[i] = i - nops;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
571 if (codestr[i] == NOP)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
572 nops++;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
573 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
574 cum_orig_line = 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
575 last_line = 0;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
576 for (i=0 ; i < tabsiz ; i+=2) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
577 cum_orig_line += lineno[i];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
578 new_line = addrmap[cum_orig_line];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
579 assert (new_line - last_line < 255);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
580 lineno[i] =((unsigned char)(new_line - last_line));
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
581 last_line = new_line;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
582 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
583
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
584 /* Remove NOPs and fixup jump targets */
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
585 for (i=0, h=0 ; i<codelen ; ) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
586 opcode = codestr[i];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
587 switch (opcode) {
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
588 case NOP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
589 i++;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
590 continue;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
591
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
592 case JUMP_ABSOLUTE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
593 case CONTINUE_LOOP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
594 j = addrmap[GETARG(codestr, i)];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
595 SETARG(codestr, i, j);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
596 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
597
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
598 case FOR_ITER:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
599 case JUMP_FORWARD:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
600 case JUMP_IF_FALSE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
601 case JUMP_IF_TRUE:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
602 case SETUP_LOOP:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
603 case SETUP_EXCEPT:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
604 case SETUP_FINALLY:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
605 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
606 SETARG(codestr, i, j);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
607 break;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
608 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
609 adj = CODESIZE(opcode);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
610 while (adj--)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
611 codestr[h++] = codestr[i++];
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
612 }
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
613 assert(h + nops == codelen);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
614
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
615 code = PyString_FromStringAndSize((char *)codestr, h);
39600
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
616 PyMem_Free(addrmap);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
617 PyMem_Free(codestr);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
618 PyMem_Free(blocks);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
619 return code;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
620
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
621 exitUnchanged:
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
622 if (blocks != NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
623 PyMem_Free(blocks);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
624 if (addrmap != NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
625 PyMem_Free(addrmap);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
626 if (codestr != NULL)
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
627 PyMem_Free(codestr);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
628 Py_INCREF(code);
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
629 return code;
5e143944770b Move peephole optimizer to separate file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
630 }