@@ -1298,10 +1298,6 @@ static void zend_optimize_op_array(zend_op_array *op_array,
1298
1298
zend_redo_pass_two (op_array );
1299
1299
1300
1300
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
- }
1305
1301
zend_recalc_live_ranges (op_array , NULL );
1306
1302
}
1307
1303
}
@@ -1369,37 +1365,21 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
1369
1365
ctx .optimization_level = optimization_level ;
1370
1366
ctx .debug_level = debug_level ;
1371
1367
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
-
1391
1368
if ((ZEND_OPTIMIZER_PASS_6 & optimization_level ) &&
1392
1369
(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 ) {
1394
1371
/* Optimize using call-graph */
1395
1372
void * checkpoint = zend_arena_checkpoint (ctx .arena );
1396
1373
int i ;
1397
1374
zend_func_info * func_info ;
1398
1375
1399
1376
for (i = 0 ; i < call_graph .op_arrays_count ; i ++ ) {
1400
1377
zend_revert_pass_two (call_graph .op_arrays [i ]);
1378
+ zend_optimize (call_graph .op_arrays [i ], & ctx );
1401
1379
}
1402
1380
1381
+ zend_analyze_call_graph (& ctx .arena , script , 0 , & call_graph );
1382
+
1403
1383
for (i = 0 ; i < call_graph .op_arrays_count ; i ++ ) {
1404
1384
func_info = ZEND_FUNC_INFO (call_graph .op_arrays [i ]);
1405
1385
if (func_info ) {
@@ -1480,11 +1460,11 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
1480
1460
}
1481
1461
1482
1462
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 );
1485
1465
1486
1466
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 );
1488
1468
} ZEND_HASH_FOREACH_END ();
1489
1469
1490
1470
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
1495
1475
if (op_array -> scope == ce
1496
1476
&& op_array -> type == ZEND_USER_FUNCTION
1497
1477
&& !(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 );
1499
1479
}
1500
1480
} ZEND_HASH_FOREACH_END ();
1501
1481
} 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
+ }
1502
1503
}
1503
1504
1504
1505
ZEND_HASH_FOREACH_STR_KEY_PTR (& script -> class_table , key , ce ) {
0 commit comments