diff options
Diffstat (limited to 'ext/opcache/Optimizer')
| -rw-r--r-- | ext/opcache/Optimizer/dfa_pass.c | 54 | ||||
| -rw-r--r-- | ext/opcache/Optimizer/zend_inference.h | 34 | ||||
| -rw-r--r-- | ext/opcache/Optimizer/zend_optimizer.c | 38 |
3 files changed, 49 insertions, 77 deletions
diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c index 760e2e6e81..6a346c4846 100644 --- a/ext/opcache/Optimizer/dfa_pass.c +++ b/ext/opcache/Optimizer/dfa_pass.c @@ -413,53 +413,27 @@ 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->vars[i].definition >= 0) { + 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 (ssa->var_info[i].use_as_double) { - 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); - } - } else { - if (opline->opcode == ZEND_ADD || - opline->opcode == ZEND_SUB || - opline->opcode == ZEND_MUL || - opline->opcode == ZEND_IS_EQUAL || - opline->opcode == ZEND_IS_NOT_EQUAL || - opline->opcode == ZEND_IS_SMALLER || - opline->opcode == ZEND_IS_SMALLER_OR_EQUAL) { - if (opline->op1_type == IS_CONST && - opline->op2_type != IS_CONST && - (OP2_INFO() & MAY_BE_ANY) == MAY_BE_DOUBLE && - Z_TYPE_INFO_P(CT_CONSTANT_EX(op_array, opline->op1.constant)) == IS_LONG) { - zval *zv = CT_CONSTANT_EX(op_array, opline->op1.constant); - ZVAL_DOUBLE(&tmp, zval_get_double(zv)); - opline->op1.constant = zend_optimizer_add_literal(op_array, &tmp); - } else if (opline->op1_type != IS_CONST && - opline->op2_type == IS_CONST && - (OP1_INFO() & MAY_BE_ANY) == MAY_BE_DOUBLE && - Z_TYPE_INFO_P(CT_CONSTANT_EX(op_array, opline->op2.constant)) == IS_LONG) { - zval *zv = CT_CONSTANT_EX(op_array, opline->op2.constant); - ZVAL_DOUBLE(&tmp, zval_get_double(zv)); - opline->op2.constant = zend_optimizer_add_literal(op_array, &tmp); - } - - } + 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); } } } diff --git a/ext/opcache/Optimizer/zend_inference.h b/ext/opcache/Optimizer/zend_inference.h index b82d7b1c39..1826b99434 100644 --- a/ext/opcache/Optimizer/zend_inference.h +++ b/ext/opcache/Optimizer/zend_inference.h @@ -24,7 +24,39 @@ #include "zend_bitset.h" /* Bitmask for type inference (zend_ssa_var_info.type) */ -#include "zend_type_info.h" +#define MAY_BE_UNDEF (1 << IS_UNDEF) +#define MAY_BE_NULL (1 << IS_NULL) +#define MAY_BE_FALSE (1 << IS_FALSE) +#define MAY_BE_TRUE (1 << IS_TRUE) +#define MAY_BE_LONG (1 << IS_LONG) +#define MAY_BE_DOUBLE (1 << IS_DOUBLE) +#define MAY_BE_STRING (1 << IS_STRING) +#define MAY_BE_ARRAY (1 << IS_ARRAY) +#define MAY_BE_OBJECT (1 << IS_OBJECT) +#define MAY_BE_RESOURCE (1 << IS_RESOURCE) +#define MAY_BE_ANY (MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE) +#define MAY_BE_REF (1 << IS_REFERENCE) /* may be reference */ + +#define MAY_BE_ARRAY_SHIFT (IS_REFERENCE) + +#define MAY_BE_ARRAY_OF_NULL (MAY_BE_NULL << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_FALSE (MAY_BE_FALSE << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_TRUE (MAY_BE_TRUE << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_LONG (MAY_BE_LONG << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_DOUBLE (MAY_BE_DOUBLE << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_STRING (MAY_BE_STRING << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_ARRAY (MAY_BE_ARRAY << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_OBJECT (MAY_BE_OBJECT << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_RESOURCE (MAY_BE_RESOURCE << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_ANY (MAY_BE_ANY << MAY_BE_ARRAY_SHIFT) +#define MAY_BE_ARRAY_OF_REF (MAY_BE_REF << MAY_BE_ARRAY_SHIFT) + +#define MAY_BE_ARRAY_KEY_LONG (1<<21) +#define MAY_BE_ARRAY_KEY_STRING (1<<22) +#define MAY_BE_ARRAY_KEY_ANY (MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_KEY_STRING) + +#define MAY_BE_ERROR (1<<23) +#define MAY_BE_CLASS (1<<24) #define MAY_BE_IN_REG (1<<25) /* value allocated in CPU register */ diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 48247eeba8..7882a43f6a 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -29,7 +29,6 @@ #include "zend_cfg.h" #include "zend_func_info.h" #include "zend_call_graph.h" -#include "zend_inference.h" #include "zend_dump.h" #ifndef HAVE_DFA_PASS @@ -679,34 +678,6 @@ static void zend_redo_pass_two(zend_op_array *op_array) } } -#if HAVE_DFA_PASS -static void zend_redo_pass_two_ex(zend_op_array *op_array, zend_ssa *ssa) -{ - zend_op *opline, *end; - - opline = op_array->opcodes; - end = opline + op_array->last; - while (opline < end) { - zend_vm_set_opcode_handler_ex(opline, - opline->op1_type == IS_UNDEF ? 0 : OP1_INFO(), - opline->op2_type == IS_UNDEF ? 0 : OP2_INFO(), - (opline->opcode == ZEND_PRE_INC || - opline->opcode == ZEND_PRE_DEC || - opline->opcode == ZEND_POST_INC || - opline->opcode == ZEND_POST_DEC) ? - ((ssa->ops[opline - op_array->opcodes].op1_def >= 0) ? OP1_DEF_INFO() : MAY_BE_ANY) : - (opline->result_type == IS_UNDEF ? 0 : RES_INFO())); - if (opline->op1_type == IS_CONST) { - ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op1); - } - if (opline->op2_type == IS_CONST) { - ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op2); - } - opline++; - } -} -#endif - static void zend_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx) { @@ -839,13 +810,8 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend } for (i = 0; i < call_graph.op_arrays_count; i++) { - func_info = ZEND_FUNC_INFO(call_graph.op_arrays[i]); - if (func_info && func_info->ssa.var_info) { - zend_redo_pass_two_ex(call_graph.op_arrays[i], &func_info->ssa); - ZEND_SET_FUNC_INFO(call_graph.op_arrays[i], NULL); - } else { - zend_redo_pass_two(call_graph.op_arrays[i]); - } + zend_redo_pass_two(call_graph.op_arrays[i]); + ZEND_SET_FUNC_INFO(call_graph.op_arrays[i], NULL); } zend_arena_release(&ctx.arena, checkpoint); |
