From: Nikita Popov Date: Mon, 10 Apr 2017 20:11:47 +0000 (+0200) Subject: Merge branch 'PHP-7.0' into PHP-7.1 X-Git-Tag: php-7.1.5RC1~53 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1df3099f2f7ef5d1b5613be60f796e67bf7724a1;p=php Merge branch 'PHP-7.0' into PHP-7.1 --- 1df3099f2f7ef5d1b5613be60f796e67bf7724a1 diff --cc ext/opcache/Optimizer/block_pass.c index 38c2ecb124,acce8b70d0..bf411f4e77 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@@ -1173,16 -1445,33 +1173,19 @@@ static void zend_jmp_optimization(zend_ break; } - if (block->op2_to == block->follow_to) { - /* L: JMPZ(X, L+1) -> NOP or FREE(X) */ - - if (last_op->op1_type == IS_VAR) { - zend_op **Tsource = cfg->Tsource; - zend_op *src = VAR_SOURCE(last_op->op1); + if (block->successors[0] == block->successors[1]) { + /* L: JMP[N]Z(X, L+1) -> NOP or FREE(X) */ - if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) { - if (src && - src->opcode != ZEND_FETCH_R && - src->opcode != ZEND_FETCH_DIM_R && - src->opcode != ZEND_FETCH_OBJ_R) { - ZEND_RESULT_TYPE(src) |= EXT_TYPE_UNUSED; - MAKE_NOP(last_op); - block->op2_to = NULL; - break; - } - } + if (last_op->op1_type == IS_CV) { - break; ++ last_op->opcode = ZEND_CHECK_VAR; ++ last_op->op2.num = 0; + } else if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) { last_op->opcode = ZEND_FREE; last_op->op2.num = 0; - block->op2_to = NULL; } else { MAKE_NOP(last_op); - block->op2_to = NULL; } + block->successors[1] = -1; break; } diff --cc ext/opcache/Optimizer/pass2.c index 41ab7c6045,098be5146b..d592938256 --- a/ext/opcache/Optimizer/pass2.c +++ b/ext/opcache/Optimizer/pass2.c @@@ -174,15 -154,22 +174,23 @@@ void zend_optimizer_pass2(zend_op_arra if ((opline + 1)->opcode == ZEND_JMP) { /* JMPZ(X, L1), JMP(L2) => JMPZNZ(X, L1, L2) */ /* JMPNZ(X, L1), JMP(L2) => JMPZNZ(X, L2, L1) */ - if (ZEND_OP2(opline).opline_num == ZEND_OP1(opline + 1).opline_num) { + if (ZEND_OP2_JMP_ADDR(opline) == ZEND_OP1_JMP_ADDR(opline + 1)) { /* JMPZ(X, L1), JMP(L1) => NOP, JMP(L1) */ - MAKE_NOP(opline); + if (opline->op1_type == IS_CV) { - break; ++ opline->opcode = ZEND_CHECK_VAR; ++ opline->op2.num = 0; + } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { + opline->opcode = ZEND_FREE; + opline->op2.num = 0; + } else { + MAKE_NOP(opline); + } } else { if (opline->opcode == ZEND_JMPZ) { - opline->extended_value = ZEND_OP1(opline + 1).opline_num; + opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, ZEND_OP1_JMP_ADDR(opline + 1)); } else { - opline->extended_value = ZEND_OP2(opline).opline_num; - COPY_NODE(opline->op2, (opline + 1)->op1); + opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, ZEND_OP2_JMP_ADDR(opline)); + ZEND_SET_OP_JMP_ADDR(opline, opline->op2, ZEND_OP1_JMP_ADDR(opline + 1)); } opline->opcode = ZEND_JMPZNZ; }