diff options
Diffstat (limited to 'ext/opcache/Optimizer/dfa_pass.c')
-rw-r--r-- | ext/opcache/Optimizer/dfa_pass.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c index b62b35c8b6..733c99ce7a 100644 --- a/ext/opcache/Optimizer/dfa_pass.c +++ b/ext/opcache/Optimizer/dfa_pass.c @@ -140,6 +140,19 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa) shiftlist = (uint32_t *)do_alloca(sizeof(uint32_t) * op_array->last, use_heap); memset(shiftlist, 0, sizeof(uint32_t) * op_array->last); + /* remove empty callee_info */ + func_info = ZEND_FUNC_INFO(op_array); + if (func_info) { + zend_call_info **call_info = &func_info->callee_info; + while ((*call_info)) { + if ((*call_info)->caller_init_opline->opcode == ZEND_NOP) { + *call_info = (*call_info)->next_callee; + } else { + call_info = &(*call_info)->next_callee; + } + } + } + for (b = blocks; b < end; b++) { if (b->flags & (ZEND_BB_REACHABLE|ZEND_BB_UNREACHABLE_FREE)) { uint32_t end; @@ -261,7 +274,6 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa) } /* update call graph */ - func_info = ZEND_FUNC_INFO(op_array); if (func_info) { zend_call_info *call_info = func_info->callee_info; while (call_info) { |