Skip to content

Commit 517c01b

Browse files
committed
Don't classify literals during compaction
This seems to be a leftover from when we were storing cache slots inside literals and had to prevent merging of literals with incompatible cache slots. Nowadays the LITERAL_* classification is not actually used for anything, we're only interested in the number of related literals.
1 parent 8a37f6b commit 517c01b

File tree

1 file changed

+38
-85
lines changed

1 file changed

+38
-85
lines changed

Zend/Optimizer/compact_literals.c

+38-85
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,16 @@
3131

3232
#define DEBUG_COMPACT_LITERALS 0
3333

34-
#define LITERAL_VALUE 0x0100
35-
#define LITERAL_FUNC 0x0200
36-
#define LITERAL_CLASS 0x0300
37-
#define LITERAL_CONST 0x0400
38-
#define LITERAL_CLASS_CONST 0x0500
39-
#define LITERAL_STATIC_METHOD 0x0600
40-
#define LITERAL_STATIC_PROPERTY 0x0700
41-
#define LITERAL_METHOD 0x0800
42-
#define LITERAL_PROPERTY 0x0900
43-
#define LITERAL_GLOBAL 0x0A00
44-
45-
#define LITERAL_KIND_MASK 0x0f00
46-
#define LITERAL_NUM_RELATED_MASK 0x000f
47-
48-
#define LITERAL_NUM_RELATED(info) (info & LITERAL_NUM_RELATED_MASK)
34+
#define LITERAL_CLASS_CONST 1
35+
#define LITERAL_STATIC_METHOD 2
36+
#define LITERAL_STATIC_PROPERTY 3
4937

5038
typedef struct _literal_info {
51-
uint32_t flags; /* bitmask (see defines above) */
39+
uint8_t num_related;
5240
} literal_info;
5341

54-
#define LITERAL_INFO(n, kind, related) do { \
55-
info[n].flags = ((kind) | (related)); \
42+
#define LITERAL_INFO(n, related) do { \
43+
info[n].num_related = (related); \
5644
} while (0)
5745

5846
static size_t type_num_classes(const zend_op_array *op_array, uint32_t arg_num)
@@ -112,10 +100,9 @@ static uint32_t add_static_slot(HashTable *hash,
112100
return ret;
113101
}
114102

115-
static zend_string *create_str_cache_key(zval *literal, uint32_t flags)
103+
static zend_string *create_str_cache_key(zval *literal, uint8_t num_related)
116104
{
117105
ZEND_ASSERT(Z_TYPE_P(literal) == IS_STRING);
118-
uint32_t num_related = LITERAL_NUM_RELATED(flags);
119106
if (num_related == 1) {
120107
return zend_string_copy(Z_STR_P(literal));
121108
}
@@ -167,49 +154,43 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
167154
end = opline + op_array->last;
168155
while (opline < end) {
169156
switch (opline->opcode) {
170-
case ZEND_INIT_FCALL:
171-
LITERAL_INFO(opline->op2.constant, LITERAL_FUNC, 1);
172-
break;
173157
case ZEND_INIT_FCALL_BY_NAME:
174-
LITERAL_INFO(opline->op2.constant, LITERAL_FUNC, 2);
158+
LITERAL_INFO(opline->op2.constant, 2);
175159
break;
176160
case ZEND_INIT_NS_FCALL_BY_NAME:
177-
LITERAL_INFO(opline->op2.constant, LITERAL_FUNC, 3);
161+
LITERAL_INFO(opline->op2.constant, 3);
178162
break;
179163
case ZEND_INIT_METHOD_CALL:
180164
if (opline->op1_type == IS_CONST) {
181-
LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 1);
165+
LITERAL_INFO(opline->op1.constant, 1);
182166
}
183167
if (opline->op2_type == IS_CONST) {
184-
LITERAL_INFO(opline->op2.constant, LITERAL_METHOD, 2);
168+
LITERAL_INFO(opline->op2.constant, 2);
185169
}
186170
break;
187171
case ZEND_INIT_STATIC_METHOD_CALL:
188172
if (opline->op1_type == IS_CONST) {
189-
LITERAL_INFO(opline->op1.constant, LITERAL_CLASS, 2);
173+
LITERAL_INFO(opline->op1.constant, 2);
190174
}
191175
if (opline->op2_type == IS_CONST) {
192-
LITERAL_INFO(opline->op2.constant, LITERAL_STATIC_METHOD, 2);
176+
LITERAL_INFO(opline->op2.constant, 2);
193177
}
194178
break;
195179
case ZEND_CATCH:
196-
LITERAL_INFO(opline->op1.constant, LITERAL_CLASS, 2);
197-
break;
198-
case ZEND_DEFINED:
199-
LITERAL_INFO(opline->op1.constant, LITERAL_CONST, 1);
180+
LITERAL_INFO(opline->op1.constant, 2);
200181
break;
201182
case ZEND_FETCH_CONSTANT:
202183
if (opline->op1.num & IS_CONSTANT_UNQUALIFIED_IN_NAMESPACE) {
203-
LITERAL_INFO(opline->op2.constant, LITERAL_CONST, 3);
184+
LITERAL_INFO(opline->op2.constant, 3);
204185
} else {
205-
LITERAL_INFO(opline->op2.constant, LITERAL_CONST, 2);
186+
LITERAL_INFO(opline->op2.constant, 2);
206187
}
207188
break;
208189
case ZEND_FETCH_CLASS_CONSTANT:
209190
if (opline->op1_type == IS_CONST) {
210-
LITERAL_INFO(opline->op1.constant, LITERAL_CLASS, 2);
191+
LITERAL_INFO(opline->op1.constant, 2);
211192
}
212-
LITERAL_INFO(opline->op2.constant, LITERAL_CLASS_CONST, 1);
193+
LITERAL_INFO(opline->op2.constant, 1);
213194
break;
214195
case ZEND_ASSIGN_STATIC_PROP:
215196
case ZEND_ASSIGN_STATIC_PROP_REF:
@@ -227,56 +208,28 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
227208
case ZEND_POST_DEC_STATIC_PROP:
228209
case ZEND_ASSIGN_STATIC_PROP_OP:
229210
if (opline->op2_type == IS_CONST) {
230-
LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 2);
211+
LITERAL_INFO(opline->op2.constant, 2);
231212
}
232213
if (opline->op1_type == IS_CONST) {
233-
LITERAL_INFO(opline->op1.constant, LITERAL_STATIC_PROPERTY, 1);
214+
LITERAL_INFO(opline->op1.constant, 1);
234215
}
235216
break;
236217
case ZEND_FETCH_CLASS:
237218
case ZEND_INSTANCEOF:
238219
if (opline->op2_type == IS_CONST) {
239-
LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 2);
220+
LITERAL_INFO(opline->op2.constant, 2);
240221
}
241222
break;
242223
case ZEND_NEW:
243224
if (opline->op1_type == IS_CONST) {
244-
LITERAL_INFO(opline->op1.constant, LITERAL_CLASS, 2);
245-
}
246-
break;
247-
case ZEND_ASSIGN_OBJ:
248-
case ZEND_ASSIGN_OBJ_REF:
249-
case ZEND_FETCH_OBJ_R:
250-
case ZEND_FETCH_OBJ_W:
251-
case ZEND_FETCH_OBJ_RW:
252-
case ZEND_FETCH_OBJ_IS:
253-
case ZEND_FETCH_OBJ_UNSET:
254-
case ZEND_FETCH_OBJ_FUNC_ARG:
255-
case ZEND_UNSET_OBJ:
256-
case ZEND_PRE_INC_OBJ:
257-
case ZEND_PRE_DEC_OBJ:
258-
case ZEND_POST_INC_OBJ:
259-
case ZEND_POST_DEC_OBJ:
260-
case ZEND_ISSET_ISEMPTY_PROP_OBJ:
261-
case ZEND_ASSIGN_OBJ_OP:
262-
if (opline->op1_type == IS_CONST) {
263-
LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 1);
264-
}
265-
if (opline->op2_type == IS_CONST) {
266-
LITERAL_INFO(opline->op2.constant, LITERAL_PROPERTY, 1);
225+
LITERAL_INFO(opline->op1.constant, 2);
267226
}
268227
break;
269-
case ZEND_BIND_GLOBAL:
270-
LITERAL_INFO(opline->op2.constant, LITERAL_GLOBAL, 1);
271-
break;
272-
case ZEND_RECV_INIT:
273-
LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1);
274-
break;
275228
case ZEND_DECLARE_CLASS:
276229
case ZEND_DECLARE_CLASS_DELAYED:
277-
LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 2);
230+
LITERAL_INFO(opline->op1.constant, 2);
278231
if (opline->op2_type == IS_CONST) {
279-
LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1);
232+
LITERAL_INFO(opline->op2.constant, 1);
280233
}
281234
break;
282235
case ZEND_ISSET_ISEMPTY_DIM_OBJ:
@@ -292,22 +245,22 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
292245
case ZEND_FETCH_LIST_W:
293246
case ZEND_ASSIGN_DIM_OP:
294247
if (opline->op1_type == IS_CONST) {
295-
LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 1);
248+
LITERAL_INFO(opline->op1.constant, 1);
296249
}
297250
if (opline->op2_type == IS_CONST) {
298251
if (Z_EXTRA(op_array->literals[opline->op2.constant]) == ZEND_EXTRA_VALUE) {
299-
LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 2);
252+
LITERAL_INFO(opline->op2.constant, 2);
300253
} else {
301-
LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1);
254+
LITERAL_INFO(opline->op2.constant, 1);
302255
}
303256
}
304257
break;
305258
default:
306259
if (opline->op1_type == IS_CONST) {
307-
LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 1);
260+
LITERAL_INFO(opline->op1.constant, 1);
308261
}
309262
if (opline->op2_type == IS_CONST) {
310-
LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1);
263+
LITERAL_INFO(opline->op2.constant, 1);
311264
}
312265
break;
313266
}
@@ -337,7 +290,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
337290
map = (int*)zend_arena_alloc(&ctx->arena, op_array->last_literal * sizeof(int));
338291
memset(map, 0, op_array->last_literal * sizeof(int));
339292
for (i = 0; i < op_array->last_literal; i++) {
340-
if (!info[i].flags) {
293+
if (!info[i].num_related) {
341294
/* unset literal */
342295
zval_ptr_dtor_nogc(&op_array->literals[i]);
343296
continue;
@@ -377,7 +330,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
377330
map[i] = l_true;
378331
break;
379332
case IS_LONG:
380-
if (LITERAL_NUM_RELATED(info[i].flags) == 1) {
333+
if (info[i].num_related == 1) {
381334
if ((pos = zend_hash_index_find(&hash, Z_LVAL(op_array->literals[i]))) != NULL) {
382335
map[i] = Z_LVAL_P(pos);
383336
} else {
@@ -391,12 +344,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
391344
j++;
392345
}
393346
} else {
394-
ZEND_ASSERT(LITERAL_NUM_RELATED(info[i].flags) == 2);
347+
ZEND_ASSERT(info[i].num_related == 2);
395348
key = zend_string_init(Z_STRVAL(op_array->literals[i+1]), Z_STRLEN(op_array->literals[i+1]), 0);
396349
ZSTR_H(key) = ZSTR_HASH(Z_STR(op_array->literals[i+1])) + 100 +
397-
LITERAL_NUM_RELATED(info[i].flags) - 1;
350+
info[i].num_related - 1;
398351
if ((pos = zend_hash_find(&hash, key)) != NULL
399-
&& LITERAL_NUM_RELATED(info[Z_LVAL_P(pos)].flags) == 2) {
352+
&& info[Z_LVAL_P(pos)].num_related == 2) {
400353
map[i] = Z_LVAL_P(pos);
401354
zval_ptr_dtor_nogc(&op_array->literals[i+1]);
402355
} else {
@@ -430,14 +383,14 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
430383
}
431384
break;
432385
case IS_STRING: {
433-
key = create_str_cache_key(&op_array->literals[i], info[i].flags);
386+
key = create_str_cache_key(&op_array->literals[i], info[i].num_related);
434387
if ((pos = zend_hash_find(&hash, key)) != NULL) {
435388
ZEND_ASSERT(Z_TYPE(op_array->literals[Z_LVAL_P(pos)]) == IS_STRING &&
436-
LITERAL_NUM_RELATED(info[i].flags) == LITERAL_NUM_RELATED(info[Z_LVAL_P(pos)].flags));
389+
info[i].num_related == info[Z_LVAL_P(pos)].num_related);
437390
zend_string_release_ex(key, 0);
438391
map[i] = Z_LVAL_P(pos);
439392
zval_ptr_dtor_nogc(&op_array->literals[i]);
440-
n = LITERAL_NUM_RELATED(info[i].flags);
393+
n = info[i].num_related;
441394
while (n > 1) {
442395
i++;
443396
zval_ptr_dtor_nogc(&op_array->literals[i]);
@@ -455,7 +408,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
455408
info[j] = info[i];
456409
}
457410
j++;
458-
n = LITERAL_NUM_RELATED(info[i].flags);
411+
n = info[i].num_related;
459412
while (n > 1) {
460413
i++;
461414
if (i != j) op_array->literals[j] = op_array->literals[i];

0 commit comments

Comments
 (0)