Skip to content

Commit 3ad20f8

Browse files
committed
Revert/redo pass_two only once
1 parent ca265b0 commit 3ad20f8

File tree

4 files changed

+44
-35
lines changed

4 files changed

+44
-35
lines changed

ext/opcache/Optimizer/zend_call_graph.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,8 @@ static void zend_sort_op_arrays(zend_call_graph *call_graph)
250250
// TODO: perform topological sort of cyclic call graph
251251
}
252252

253-
int zend_build_call_graph(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_call_graph *call_graph) /* {{{ */
253+
int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */
254254
{
255-
int i;
256-
257255
call_graph->op_arrays_count = 0;
258256
if (zend_foreach_op_array(call_graph, script, zend_op_array_calc) != SUCCESS) {
259257
return FAILURE;
@@ -264,13 +262,20 @@ int zend_build_call_graph(zend_arena **arena, zend_script *script, uint32_t buil
264262
if (zend_foreach_op_array(call_graph, script, zend_op_array_collect) != SUCCESS) {
265263
return FAILURE;
266264
}
265+
266+
return SUCCESS;
267+
}
268+
/* }}} */
269+
270+
void zend_analyze_call_graph(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_call_graph *call_graph) /* {{{ */
271+
{
272+
int i;
273+
267274
for (i = 0; i < call_graph->op_arrays_count; i++) {
268275
zend_analyze_calls(arena, script, build_flags, call_graph->op_arrays[i], call_graph->func_infos + i);
269276
}
270277
zend_analyze_recursion(call_graph);
271278
zend_sort_op_arrays(call_graph);
272-
273-
return SUCCESS;
274279
}
275280
/* }}} */
276281

ext/opcache/Optimizer/zend_call_graph.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ typedef struct _zend_call_graph {
6969

7070
BEGIN_EXTERN_C()
7171

72-
int zend_build_call_graph(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_call_graph *call_graph);
72+
int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
73+
void zend_analyze_call_graph(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_call_graph *call_graph);
7374
zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, zend_op_array *op_array);
7475
int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info);
7576

ext/opcache/Optimizer/zend_optimizer.c

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,10 +1298,6 @@ static void zend_optimize_op_array(zend_op_array *op_array,
12981298
zend_redo_pass_two(op_array);
12991299

13001300
if (op_array->live_range) {
1301-
if ((ZEND_OPTIMIZER_PASS_6 & ctx->optimization_level) &&
1302-
(ZEND_OPTIMIZER_PASS_7 & ctx->optimization_level)) {
1303-
return;
1304-
}
13051301
zend_recalc_live_ranges(op_array, NULL);
13061302
}
13071303
}
@@ -1369,37 +1365,21 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
13691365
ctx.optimization_level = optimization_level;
13701366
ctx.debug_level = debug_level;
13711367

1372-
zend_optimize_op_array(&script->main_op_array, &ctx);
1373-
1374-
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
1375-
zend_optimize_op_array(op_array, &ctx);
1376-
} ZEND_HASH_FOREACH_END();
1377-
1378-
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
1379-
if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
1380-
continue;
1381-
}
1382-
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
1383-
if (op_array->scope == ce
1384-
&& op_array->type == ZEND_USER_FUNCTION
1385-
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
1386-
zend_optimize_op_array(op_array, &ctx);
1387-
}
1388-
} ZEND_HASH_FOREACH_END();
1389-
} ZEND_HASH_FOREACH_END();
1390-
13911368
if ((ZEND_OPTIMIZER_PASS_6 & optimization_level) &&
13921369
(ZEND_OPTIMIZER_PASS_7 & optimization_level) &&
1393-
zend_build_call_graph(&ctx.arena, script, ZEND_RT_CONSTANTS, &call_graph) == SUCCESS) {
1370+
zend_build_call_graph(&ctx.arena, script, &call_graph) == SUCCESS) {
13941371
/* Optimize using call-graph */
13951372
void *checkpoint = zend_arena_checkpoint(ctx.arena);
13961373
int i;
13971374
zend_func_info *func_info;
13981375

13991376
for (i = 0; i < call_graph.op_arrays_count; i++) {
14001377
zend_revert_pass_two(call_graph.op_arrays[i]);
1378+
zend_optimize(call_graph.op_arrays[i], &ctx);
14011379
}
14021380

1381+
zend_analyze_call_graph(&ctx.arena, script, 0, &call_graph);
1382+
14031383
for (i = 0; i < call_graph.op_arrays_count; i++) {
14041384
func_info = ZEND_FUNC_INFO(call_graph.op_arrays[i]);
14051385
if (func_info) {
@@ -1480,11 +1460,11 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
14801460
}
14811461

14821462
zend_arena_release(&ctx.arena, checkpoint);
1483-
} else if (ZEND_OPTIMIZER_PASS_12 & optimization_level) {
1484-
zend_adjust_fcall_stack_size(&script->main_op_array, &ctx);
1463+
} else {
1464+
zend_optimize_op_array(&script->main_op_array, &ctx);
14851465

14861466
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
1487-
zend_adjust_fcall_stack_size(op_array, &ctx);
1467+
zend_optimize_op_array(op_array, &ctx);
14881468
} ZEND_HASH_FOREACH_END();
14891469

14901470
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
@@ -1495,10 +1475,31 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
14951475
if (op_array->scope == ce
14961476
&& op_array->type == ZEND_USER_FUNCTION
14971477
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
1498-
zend_adjust_fcall_stack_size(op_array, &ctx);
1478+
zend_optimize_op_array(op_array, &ctx);
14991479
}
15001480
} ZEND_HASH_FOREACH_END();
15011481
} ZEND_HASH_FOREACH_END();
1482+
1483+
if (ZEND_OPTIMIZER_PASS_12 & optimization_level) {
1484+
zend_adjust_fcall_stack_size(&script->main_op_array, &ctx);
1485+
1486+
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
1487+
zend_adjust_fcall_stack_size(op_array, &ctx);
1488+
} ZEND_HASH_FOREACH_END();
1489+
1490+
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
1491+
if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
1492+
continue;
1493+
}
1494+
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
1495+
if (op_array->scope == ce
1496+
&& op_array->type == ZEND_USER_FUNCTION
1497+
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
1498+
zend_adjust_fcall_stack_size(op_array, &ctx);
1499+
}
1500+
} ZEND_HASH_FOREACH_END();
1501+
} ZEND_HASH_FOREACH_END();
1502+
}
15021503
}
15031504

15041505
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {

ext/opcache/jit/zend_jit.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2828,10 +2828,12 @@ ZEND_EXT_API int zend_jit_script(zend_script *script)
28282828
checkpoint = zend_arena_checkpoint(CG(arena));
28292829

28302830
call_graph.op_arrays_count = 0;
2831-
if (zend_build_call_graph(&CG(arena), script, ZEND_RT_CONSTANTS, &call_graph) != SUCCESS) {
2831+
if (zend_build_call_graph(&CG(arena), script, &call_graph) != SUCCESS) {
28322832
goto jit_failure;
28332833
}
28342834

2835+
zend_analyze_call_graph(&CG(arena), script, ZEND_RT_CONSTANTS, &call_graph);
2836+
28352837
if (zend_jit_trigger == ZEND_JIT_ON_FIRST_EXEC ||
28362838
zend_jit_trigger == ZEND_JIT_ON_PROF_REQUEST ||
28372839
zend_jit_trigger == ZEND_JIT_ON_HOT_COUNTERS) {

0 commit comments

Comments
 (0)