Skip to content

Commit 9bdeafe

Browse files
committed
Fix eliding of call result in optimizer
1 parent 5710a4a commit 9bdeafe

File tree

3 files changed

+42
-39
lines changed

3 files changed

+42
-39
lines changed

Zend/Optimizer/block_pass.c

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -289,20 +289,10 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
289289
MAKE_NOP(opline);
290290
++(*opt_count);
291291
break;
292-
case ZEND_ASSIGN:
293-
case ZEND_ASSIGN_DIM:
294-
case ZEND_ASSIGN_OBJ:
295-
case ZEND_ASSIGN_STATIC_PROP:
296-
case ZEND_ASSIGN_OP:
297-
case ZEND_ASSIGN_DIM_OP:
298-
case ZEND_ASSIGN_OBJ_OP:
299-
case ZEND_ASSIGN_STATIC_PROP_OP:
300-
case ZEND_PRE_INC:
301-
case ZEND_PRE_DEC:
302-
case ZEND_PRE_INC_OBJ:
303-
case ZEND_PRE_DEC_OBJ:
304-
case ZEND_PRE_INC_STATIC_PROP:
305-
case ZEND_PRE_DEC_STATIC_PROP:
292+
default:
293+
if (!zend_op_may_elide_result(src->opcode)) {
294+
break;
295+
}
306296
if (src < op_array->opcodes + block->start) {
307297
break;
308298
}
@@ -311,8 +301,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
311301
MAKE_NOP(opline);
312302
++(*opt_count);
313303
break;
314-
default:
315-
break;
316304
}
317305
}
318306
} else if (opline->op1_type == IS_VAR) {

Zend/zend_compile.c

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,36 @@ static inline void zend_end_loop(int cont_addr, const znode *var_node) /* {{{ */
753753
}
754754
/* }}} */
755755

756+
bool zend_op_may_elide_result(uint8_t opcode)
757+
{
758+
switch (opcode) {
759+
case ZEND_ASSIGN:
760+
case ZEND_ASSIGN_DIM:
761+
case ZEND_ASSIGN_OBJ:
762+
case ZEND_ASSIGN_STATIC_PROP:
763+
case ZEND_ASSIGN_OP:
764+
case ZEND_ASSIGN_DIM_OP:
765+
case ZEND_ASSIGN_OBJ_OP:
766+
case ZEND_ASSIGN_STATIC_PROP_OP:
767+
case ZEND_PRE_INC_STATIC_PROP:
768+
case ZEND_PRE_DEC_STATIC_PROP:
769+
case ZEND_PRE_INC_OBJ:
770+
case ZEND_PRE_DEC_OBJ:
771+
case ZEND_PRE_INC:
772+
case ZEND_PRE_DEC:
773+
case ZEND_DO_FCALL:
774+
case ZEND_DO_ICALL:
775+
case ZEND_DO_UCALL:
776+
case ZEND_DO_FCALL_BY_NAME:
777+
case ZEND_YIELD:
778+
case ZEND_YIELD_FROM:
779+
case ZEND_INCLUDE_OR_EVAL:
780+
return true;
781+
default:
782+
return false;
783+
}
784+
}
785+
756786
static void zend_do_free(znode *op1) /* {{{ */
757787
{
758788
if (op1->op_type == IS_TMP_VAR) {
@@ -779,29 +809,12 @@ static void zend_do_free(znode *op1) /* {{{ */
779809
opline->opcode -= 2;
780810
SET_UNUSED(opline->result);
781811
return;
782-
case ZEND_ASSIGN:
783-
case ZEND_ASSIGN_DIM:
784-
case ZEND_ASSIGN_OBJ:
785-
case ZEND_ASSIGN_STATIC_PROP:
786-
case ZEND_ASSIGN_OP:
787-
case ZEND_ASSIGN_DIM_OP:
788-
case ZEND_ASSIGN_OBJ_OP:
789-
case ZEND_ASSIGN_STATIC_PROP_OP:
790-
case ZEND_PRE_INC_STATIC_PROP:
791-
case ZEND_PRE_DEC_STATIC_PROP:
792-
case ZEND_PRE_INC_OBJ:
793-
case ZEND_PRE_DEC_OBJ:
794-
case ZEND_PRE_INC:
795-
case ZEND_PRE_DEC:
796-
case ZEND_DO_FCALL:
797-
case ZEND_DO_ICALL:
798-
case ZEND_DO_UCALL:
799-
case ZEND_DO_FCALL_BY_NAME:
800-
case ZEND_YIELD:
801-
case ZEND_YIELD_FROM:
802-
case ZEND_INCLUDE_OR_EVAL:
803-
SET_UNUSED(opline->result);
804-
return;
812+
default:
813+
if (zend_op_may_elide_result(opline->opcode)) {
814+
SET_UNUSED(opline->result);
815+
return;
816+
}
817+
break;
805818
}
806819
}
807820

Zend/zend_compile.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,4 +1326,6 @@ ZEND_API bool zend_unary_op_produces_error(uint32_t opcode, const zval *op);
13261326

13271327
bool zend_try_ct_eval_cast(zval *result, uint32_t type, zval *op1);
13281328

1329+
bool zend_op_may_elide_result(uint8_t opcode);
1330+
13291331
#endif /* ZEND_COMPILE_H */

0 commit comments

Comments
 (0)