diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 61c8f420aa4..18f5a98cc15 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -1892,6 +1892,15 @@ void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx) /* Eliminate NOPs */ for (b = blocks; b < end; b++) { + if (b->flags & ZEND_BB_UNREACHABLE_FREE) { + /* In unreachable_free blocks only preserve loop var frees. */ + for (uint32_t i = b->start; i < b->start + b->len; i++) { + zend_op *opline = &op_array->opcodes[i]; + if (!zend_optimizer_is_loop_var_free(opline)) { + MAKE_NOP(opline); + } + } + } if (b->flags & (ZEND_BB_REACHABLE|ZEND_BB_UNREACHABLE_FREE)) { strip_nops(op_array, b); } diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index cbdf32c1c4c..4294e44f2e4 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -437,9 +437,6 @@ ZEND_API int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, u case ZEND_FE_FREE: if (zend_optimizer_is_loop_var_free(opline)) { BB_START(i); - if (i + 1 < op_array->last) { - BB_START(i + 1); - } flags |= ZEND_FUNC_FREE_LOOP_VAR; } break;