@@ -657,16 +657,19 @@ static zend_bool is_fake_def(zend_op *opline) {
657
657
static zend_bool keeps_op1_alive (zend_op * opline ) {
658
658
/* These opcodes don't consume their OP1 operand,
659
659
* it is later freed by something else. */
660
- return opline -> opcode == ZEND_CASE
661
- || opline -> opcode == ZEND_SWITCH_LONG
662
- || opline -> opcode == ZEND_SWITCH_STRING
663
- || opline -> opcode == ZEND_FE_FETCH_R
664
- || opline -> opcode == ZEND_FE_FETCH_RW
665
- || opline -> opcode == ZEND_FETCH_LIST_R
666
- || opline -> opcode == ZEND_FETCH_LIST_W
667
- || opline -> opcode == ZEND_VERIFY_RETURN_TYPE
668
- || opline -> opcode == ZEND_BIND_LEXICAL
669
- || opline -> opcode == ZEND_ROPE_ADD ;
660
+ if (opline -> opcode == ZEND_CASE
661
+ || opline -> opcode == ZEND_SWITCH_LONG
662
+ || opline -> opcode == ZEND_FETCH_LIST_R ) {
663
+ return 1 ;
664
+ }
665
+ ZEND_ASSERT (opline -> opcode != ZEND_SWITCH_STRING
666
+ && opline -> opcode != ZEND_FE_FETCH_R
667
+ && opline -> opcode != ZEND_FE_FETCH_RW
668
+ && opline -> opcode != ZEND_FETCH_LIST_W
669
+ && opline -> opcode != ZEND_VERIFY_RETURN_TYPE
670
+ && opline -> opcode != ZEND_BIND_LEXICAL
671
+ && opline -> opcode != ZEND_ROPE_ADD );
672
+ return 0 ;
670
673
}
671
674
672
675
/* Live ranges must be sorted by increasing start opline */
@@ -707,7 +710,7 @@ static void zend_calc_live_ranges(
707
710
* because there are multiple defining opcodes (e.g. JMPZ_EX and QM_ASSIGN), in
708
711
* which case the last one starts the live range. As such, we can simply ignore
709
712
* missing uses here. */
710
- if (last_use [var_num ] != (uint32_t ) -1 ) {
713
+ if (EXPECTED ( last_use [var_num ] != (uint32_t ) -1 ) ) {
711
714
/* Skip trivial live-range */
712
715
if (opnum + 1 != last_use [var_num ]) {
713
716
uint32_t num ;
@@ -726,16 +729,18 @@ static void zend_calc_live_ranges(
726
729
}
727
730
}
728
731
729
- if ((opline -> op1_type & (IS_TMP_VAR |IS_VAR )) && ! keeps_op1_alive ( opline ) ) {
732
+ if ((opline -> op1_type & (IS_TMP_VAR |IS_VAR ))) {
730
733
uint32_t var_num = EX_VAR_TO_NUM (opline -> op1 .var ) - var_offset ;
731
- if (last_use [var_num ] == (uint32_t ) -1 ) {
732
- /* OP_DATA is really part of the previous opcode. */
733
- last_use [var_num ] = opnum - (opline -> opcode == ZEND_OP_DATA );
734
+ if (EXPECTED (last_use [var_num ] == (uint32_t ) -1 )) {
735
+ if (EXPECTED (!keeps_op1_alive (opline ))) {
736
+ /* OP_DATA is really part of the previous opcode. */
737
+ last_use [var_num ] = opnum - (opline -> opcode == ZEND_OP_DATA );
738
+ }
734
739
}
735
740
}
736
741
if (opline -> op2_type & (IS_TMP_VAR |IS_VAR )) {
737
742
uint32_t var_num = EX_VAR_TO_NUM (opline -> op2 .var ) - var_offset ;
738
- if (last_use [var_num ] == (uint32_t ) -1 ) {
743
+ if (EXPECTED ( last_use [var_num ] == (uint32_t ) -1 ) ) {
739
744
#if 1
740
745
/* OP_DATA uses only op1 operand */
741
746
ZEND_ASSERT (opline -> opcode != ZEND_OP_DATA );
0 commit comments