@@ -360,6 +360,26 @@ static zend_bool opline_supports_assign_contraction(
360360 return 1 ;
361361}
362362
363+ static bool variable_redefined_in_range (zend_ssa * ssa , int var , int start , int end )
364+ {
365+ while (start < end ) {
366+ if (ssa -> ops [start ].op1_def >= 0
367+ && ssa -> vars [ssa -> ops [start ].op1_def ].var == var ) {
368+ return 1 ;
369+ }
370+ if (ssa -> ops [start ].op2_def >= 0
371+ && ssa -> vars [ssa -> ops [start ].op2_def ].var == var ) {
372+ return 1 ;
373+ }
374+ if (ssa -> ops [start ].result_def >= 0
375+ && ssa -> vars [ssa -> ops [start ].result_def ].var == var ) {
376+ return 1 ;
377+ }
378+ start ++ ;
379+ }
380+ return 0 ;
381+ }
382+
363383int zend_dfa_optimize_calls (zend_op_array * op_array , zend_ssa * ssa )
364384{
365385 zend_func_info * func_info = ZEND_FUNC_INFO (op_array );
@@ -1290,6 +1310,8 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
12901310 && opline_supports_assign_contraction (
12911311 ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
12921312 src_var , opline -> result .var )
1313+ && !variable_redefined_in_range (ssa , EX_VAR_TO_NUM (opline -> result .var ),
1314+ ssa -> vars [src_var ].definition + 1 , op_1 )
12931315 ) {
12941316
12951317 int orig_var = ssa -> ops [op_1 ].result_use ;
@@ -1445,6 +1467,8 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
14451467 && opline_supports_assign_contraction (
14461468 ssa , & op_array -> opcodes [ssa -> vars [src_var ].definition ],
14471469 src_var , opline -> op1 .var )
1470+ && !variable_redefined_in_range (ssa , EX_VAR_TO_NUM (opline -> op1 .var ),
1471+ ssa -> vars [src_var ].definition + 1 , op_1 )
14481472 ) {
14491473
14501474 int op_2 = ssa -> vars [src_var ].definition ;
0 commit comments