From acdf6d25cddd4b05c7a034de76ba8a08573bb148 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sun, 11 Jan 2026 14:58:45 +0100 Subject: [PATCH] [block_pass] Relink successors after block becomes empty Improvement of GH-20850 for master only. --- Zend/Optimizer/block_pass.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 79e95ed3fab4..9a7b33735008 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -546,7 +546,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array } } break; - + case ZEND_BOOL: case ZEND_BOOL_NOT: optimize_bool: @@ -1800,6 +1800,7 @@ void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx) } /* Eliminate NOPs */ + bool recompute_successors = false; for (b = blocks; b < end; b++) { if (b->flags & ZEND_BB_UNREACHABLE_FREE) { /* In unreachable_free blocks only preserve loop var frees. */ @@ -1813,6 +1814,19 @@ void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (b->flags & (ZEND_BB_REACHABLE|ZEND_BB_UNREACHABLE_FREE)) { strip_nops(op_array, b); } + if (b->len == 0 && (b->flags & ZEND_BB_TARGET)) { + recompute_successors = true; + } + } + if (recompute_successors) { + for (b = blocks; b < end; b++) { + for (int s = 0; s < b->successors_count; s++) { + get_target_block(&cfg, b, s, &opt_count); + } + if (b->len == 0 && (b->flags & ZEND_BB_TARGET)) { + b->flags &= ~ZEND_BB_TARGET; + } + } } opt_count = 0;