Skip to content

Commit

Permalink
Check that POST_INC/DEC has use in DFA optimization
Browse files Browse the repository at this point in the history
We'd have usually converted it into a PRE_INC if there is no use,
but that's not guaranteed. If there is no use at this point, make
sure we don't try to use the sentinel value.
  • Loading branch information
nikic committed Sep 9, 2021
1 parent 8c3d33a commit 5cae6b9
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
13 changes: 13 additions & 0 deletions Zend/tests/post_inc_without_use.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
--TEST--
POST_INC without use during DFA optimization
--FILE--
<?php

function test($n) {
for ($i = 0; $i < $n; !$i++) {}
}

?>
===DONE===
--EXPECT--
===DONE===
4 changes: 2 additions & 2 deletions ext/opcache/Optimizer/dfa_pass.c
Original file line number Diff line number Diff line change
Expand Up @@ -1388,7 +1388,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
&& (ssa->var_info[result_var].type & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_DOUBLE))) == 0) {
int use = ssa->vars[result_var].use_chain;

if (op_array->opcodes[use].opcode == ZEND_IS_SMALLER
if (use >= 0 && op_array->opcodes[use].opcode == ZEND_IS_SMALLER
&& ssa->ops[use].op1_use == result_var
&& zend_dfa_try_to_replace_result(op_array, ssa, op_1, v)) {
opline->opcode = ZEND_PRE_INC;
Expand All @@ -1402,7 +1402,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
&& (ssa->var_info[result_var].type & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_DOUBLE))) == 0) {
int use = ssa->vars[result_var].use_chain;

if (op_array->opcodes[use].opcode == ZEND_IS_SMALLER
if (use >= 0 && op_array->opcodes[use].opcode == ZEND_IS_SMALLER
&& ssa->ops[use].op2_use == result_var
&& zend_dfa_try_to_replace_result(op_array, ssa, op_1, v)) {
opline->opcode = ZEND_PRE_DEC;
Expand Down

0 comments on commit 5cae6b9

Please sign in to comment.