summaryrefslogtreecommitdiff
path: root/ext/opcache/Optimizer
diff options
context:
space:
mode:
Diffstat (limited to 'ext/opcache/Optimizer')
-rw-r--r--ext/opcache/Optimizer/dfa_pass.c54
-rw-r--r--ext/opcache/Optimizer/zend_inference.h34
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c38
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);