@@ -7556,25 +7556,23 @@ void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */
75567556 /* Free DUPed expressions if there are any */
75577557 if (need_frees ) {
75587558 uint32_t jump_opnum = zend_emit_jump (0 );
7559+ uint32_t start_opnum = get_next_op_number ();
75597560 zend_update_jump_target_to_next (coalesce_opnum );
75607561 ZEND_HASH_FOREACH_PTR (CG (memoized_exprs ), node ) {
7561- /* Find existing live range for this variable */
7562- uint32_t i ;
7563- zend_live_range * live_range ;
7564- for ( i = 0 ; i < CG ( active_op_array ) -> last_live_range ; i ++ ) {
7565- live_range = & CG ( active_op_array ) -> live_range [ i ];
7566- if ( live_range -> var / sizeof ( zval ) == node -> u . op . var ) {
7567- break ;
7562+ if ( node -> op_type == IS_TMP_VAR || node -> op_type == IS_VAR ) {
7563+ /* Add additional live range for this variable, from the start of the current
7564+ * block to the FREE opcode. */
7565+ uint32_t free_opnum = get_next_op_number ();
7566+ if ( start_opnum != free_opnum ) {
7567+ uint32_t live_range = zend_start_live_range ( start_opnum );
7568+ zend_end_live_range ( live_range , free_opnum , ZEND_LIVE_TMPVAR , node -> u . op . var ) ;
75687569 }
7569- }
75707570
7571- /* Adjust live range to end at newly inserted FREE opcode.
7572- * We don't use emit_op here because we're manually manging live ranges. */
7573- live_range -> end = get_next_op_number ();
7574- live_range -> var |= ZEND_LIVE_COPY ;
7575- opline = get_next_op ();
7576- opline -> opcode = ZEND_FREE ;
7577- SET_NODE (opline -> op1 , node );
7571+ /* We don't use emit_op here because we're manually manging live ranges. */
7572+ opline = get_next_op ();
7573+ opline -> opcode = ZEND_FREE ;
7574+ SET_NODE (opline -> op1 , node );
7575+ }
75787576 } ZEND_HASH_FOREACH_END ();
75797577 zend_update_jump_target_to_next (jump_opnum );
75807578 } else {
0 commit comments