From: Dmitry Stogov Date: Tue, 15 Mar 2016 19:19:01 +0000 (+0300) Subject: Convert LONG constants to DOUBLE, when later they are going to be used as DOUBLE X-Git-Tag: php-7.1.0alpha1~478 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4165ae14204954bfe6497f1d724636da02bfdfd2;p=php Convert LONG constants to DOUBLE, when later they are going to be used as DOUBLE --- diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c index f2a7160cc6..6a346c4846 100644 --- a/ext/opcache/Optimizer/dfa_pass.c +++ b/ext/opcache/Optimizer/dfa_pass.c @@ -410,6 +410,35 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx } } + if (ssa->var_info) { + int i; + zend_op *opline, *end; + uint32_t op1_info, op2_info, res_info; + zval tmp; + + /* Convert LONG constants to DOUBLE */ + for (i = 0; i < ssa->vars_count; i++) { + if (ssa->var_info[i].use_as_double && ssa->vars[i].definition >= 0) { + int op = ssa->vars[i].definition; + + opline = op_array->opcodes + op; + if (opline->opcode == ZEND_ASSIGN && + opline->op2_type == IS_CONST) { + zval *zv = CT_CONSTANT_EX(op_array, opline->op2.constant); + ZEND_ASSERT(Z_TYPE_INFO_P(zv) == IS_LONG); + ZVAL_DOUBLE(&tmp, zval_get_double(zv)); + opline->op2.constant = zend_optimizer_add_literal(op_array, &tmp); + } else if (opline->opcode == ZEND_QM_ASSIGN && + opline->op1_type == IS_CONST) { + zval *zv = CT_CONSTANT_EX(op_array, opline->op1.constant); + ZEND_ASSERT(Z_TYPE_INFO_P(zv) == IS_LONG); + ZVAL_DOUBLE(&tmp, zval_get_double(zv)); + opline->op1.constant = zend_optimizer_add_literal(op_array, &tmp); + } + } + } + } + if (ctx->debug_level & ZEND_DUMP_AFTER_DFA_PASS) { zend_dump_op_array(op_array, ZEND_DUMP_SSA, "after dfa pass", ssa); }