diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2021-03-22 14:50:28 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-03-22 14:54:29 +0100 |
commit | 6a5d60085d381255da94789f69892a9c979948a2 (patch) | |
tree | 1e76818d61a81517e0b132723aa14ed8b692d793 /Zend | |
parent | 8ed8cf86a98d1317c633189857ce4d64f105e6f7 (diff) | |
download | php-git-6a5d60085d381255da94789f69892a9c979948a2.tar.gz |
Support VERIFY_RETURN_TYPE elision with unused operand
This handles the degenerate case where SCCP replaced the value in
the RETURN opcode with a constant, but the VERIFY_RETURN is still
there. We can still apply the same optimization, just don't need
to adjust the use list in this case.
The result is still sub-optimal in that a dead QM_ASSIGN is left
behind.
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/Optimizer/dfa_pass.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 3ce28f63e3..90410e5972 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -1236,7 +1236,6 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx && 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 @@ -1245,10 +1244,11 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx 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; + if (ret >= 0) { + 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; |