summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/opcache/Optimizer/dfa_pass.c56
1 files changed, 28 insertions, 28 deletions
diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c
index 4c2162a021..471328b6c5 100644
--- a/ext/opcache/Optimizer/dfa_pass.c
+++ b/ext/opcache/Optimizer/dfa_pass.c
@@ -1120,6 +1120,34 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
&& !(OP2_INFO() & MAY_BE_OBJECT)) {
opline->opcode = ZEND_FAST_CONCAT;
}
+ } else if (opline->opcode == ZEND_VERIFY_RETURN_TYPE
+ && opline->op1_type != IS_CONST
+ && ssa->ops[op_1].op1_def == v
+ && ssa->ops[op_1].op1_use >= 0
+ && ssa->ops[op_1].op1_use_chain == -1
+ && ssa->vars[v].use_chain >= 0
+ && can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) {
+
+// op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP
+
+ int orig_var = ssa->ops[op_1].op1_use;
+ if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
+
+ int ret = ssa->vars[v].use_chain;
+
+ ssa->ops[ret].op1_use = orig_var;
+ ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
+ ssa->vars[orig_var].use_chain = ret;
+
+ ssa->vars[v].definition = -1;
+ ssa->vars[v].use_chain = -1;
+
+ ssa->ops[op_1].op1_def = -1;
+ ssa->ops[op_1].op1_use = -1;
+
+ MAKE_NOP(opline);
+ remove_nops = 1;
+ }
}
}
@@ -1242,34 +1270,6 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
opline->extended_value = 0;
SET_UNUSED(opline->op2);
- } else if (opline->opcode == ZEND_VERIFY_RETURN_TYPE
- && ssa->ops[op_1].op1_def == v
- && ssa->ops[op_1].op1_use >= 0
- && ssa->ops[op_1].op1_use_chain == -1
- && ssa->vars[v].use_chain >= 0
- && can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) {
-
-// op_1: VERIFY_RETURN_TYPE #orig_var.CV [T] -> #v.CV [T] => NOP
-
- int orig_var = ssa->ops[op_1].op1_use;
- if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
-
- int ret = ssa->vars[v].use_chain;
-
- ssa->ops[ret].op1_use = orig_var;
- ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
- ssa->vars[orig_var].use_chain = ret;
-
- ssa->vars[v].definition = -1;
- ssa->vars[v].use_chain = -1;
-
- ssa->ops[op_1].op1_def = -1;
- ssa->ops[op_1].op1_use = -1;
-
- MAKE_NOP(opline);
- remove_nops = 1;
- }
-
} else if (ssa->ops[op_1].op1_def == v
&& !RETURN_VALUE_USED(opline)
&& ssa->ops[op_1].op1_use >= 0