From bfaf662ac2e58c16208224f32cb8387a35b3da97 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 6 Nov 2018 17:04:17 +0300 Subject: [PATCH] Micro-optimization --- ext/opcache/Optimizer/block_pass.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 4168730e30..34dc008a6d 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -92,30 +92,33 @@ static void strip_leading_nops(zend_op_array *op_array, zend_basic_block *b) { zend_op *opcodes = op_array->opcodes; - while (b->len > 0 && opcodes[b->start].opcode == ZEND_NOP) { + do { /* check if NOP breaks incorrect smart branch */ if (b->len == 2 - && (op_array->opcodes[b->start + 1].opcode == ZEND_JMPZ - || op_array->opcodes[b->start + 1].opcode == ZEND_JMPNZ) - && (op_array->opcodes[b->start + 1].op1_type & (IS_CV|IS_CONST)) + && (opcodes[b->start + 1].opcode == ZEND_JMPZ + || opcodes[b->start + 1].opcode == ZEND_JMPNZ) + && (opcodes[b->start + 1].op1_type & (IS_CV|IS_CONST)) && b->start > 0 - && zend_is_smart_branch(op_array->opcodes + b->start - 1)) { + && zend_is_smart_branch(opcodes + b->start - 1)) { break; } b->start++; b->len--; - } + } while (b->len > 0 && opcodes[b->start].opcode == ZEND_NOP); } static void strip_nops(zend_op_array *op_array, zend_basic_block *b) { uint32_t i, j; - strip_leading_nops(op_array, b); if (b->len == 0) { return; } + if (op_array->opcodes[b->start].opcode == ZEND_NOP) { + strip_leading_nops(op_array, b); + } + /* strip the inside NOPs */ i = j = b->start + 1; while (i < b->start + b->len) { @@ -168,8 +171,14 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array zend_op *opline, *src; zend_op *end, *last_op = NULL; - /* remove leading NOPs */ - strip_leading_nops(op_array, block); + if (block->len == 0) { + return; + } + + if (op_array->opcodes[block->start].opcode == ZEND_NOP) { + /* remove leading NOPs */ + strip_leading_nops(op_array, block); + } opline = op_array->opcodes + block->start; end = opline + block->len; -- 2.49.0