From 502002aa6e11452ed27829f7e29604b27fc69ad2 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 10 Jul 2017 13:33:14 +0300 Subject: [PATCH] Replacel constant JMPZ/NZ/ZNZ by JMP or NOP --- ext/opcache/Optimizer/zend_optimizer.c | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index f21e234877d..4a70de5eabc 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -256,7 +256,41 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, zend_op *opline, zval *val) { + zend_op *target_opline; + switch (opline->opcode) { + case ZEND_JMPZ: + if (zend_is_true(val)) { + MAKE_NOP(opline); + } else { + opline->opcode = ZEND_JMP; + COPY_NODE(opline->op1, opline->op2); + opline->op2_type = IS_UNUSED; + } + zval_ptr_dtor_nogc(val); + return 1; + case ZEND_JMPNZ: + if (zend_is_true(val)) { + opline->opcode = ZEND_JMP; + COPY_NODE(opline->op1, opline->op2); + opline->op2_type = IS_UNUSED; + } else { + MAKE_NOP(opline); + } + zval_ptr_dtor_nogc(val); + return 1; + case ZEND_JMPZNZ: + if (zend_is_true(val)) { + target_opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); + } else { + target_opline = ZEND_OP2_JMP_ADDR(opline); + } + ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline); + opline->op1_type = IS_UNUSED; + opline->extended_value = 0; + opline->opcode = ZEND_JMP; + zval_ptr_dtor_nogc(val); + return 1; case ZEND_FREE: MAKE_NOP(opline); zval_ptr_dtor_nogc(val);