@@ -608,24 +608,28 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
608
608
609
609
// op_1: ASSIGN #orig_var.CV [undef,scalar] -> #v.CV, CONST|TMPVAR => QM_ASSIGN v.CV, CONST|TMPVAR
610
610
611
- if (zend_ssa_unlink_use_chain (ssa , op_1 , orig_var )) {
612
- /* Reconstruct SSA */
613
- ssa -> ops [op_1 ].result_def = v ;
614
- ssa -> ops [op_1 ].op1_def = -1 ;
615
- ssa -> ops [op_1 ].op1_use = ssa -> ops [op_1 ].op2_use ;
616
- ssa -> ops [op_1 ].op1_use_chain = ssa -> ops [op_1 ].op2_use_chain ;
617
- ssa -> ops [op_1 ].op2_use = -1 ;
618
- ssa -> ops [op_1 ].op2_use_chain = -1 ;
619
-
620
- /* Update opcode */
621
- opline -> result_type = opline -> op1_type ;
622
- opline -> result .var = opline -> op1 .var ;
623
- opline -> op1_type = opline -> op2_type ;
624
- opline -> op1 .var = opline -> op2 .var ;
625
- opline -> op2_type = IS_UNUSED ;
626
- opline -> op2 .var = 0 ;
627
- opline -> opcode = ZEND_QM_ASSIGN ;
611
+ if (ssa -> ops [op_1 ].op1_use != ssa -> ops [op_1 ].op2_use ) {
612
+ ZEND_ASSERT (zend_ssa_unlink_use_chain (ssa , op_1 , orig_var ));
613
+ } else {
614
+ ssa -> ops [op_1 ].op2_use_chain = ssa -> ops [op_1 ].op1_use_chain ;
628
615
}
616
+
617
+ /* Reconstruct SSA */
618
+ ssa -> ops [op_1 ].result_def = v ;
619
+ ssa -> ops [op_1 ].op1_def = -1 ;
620
+ ssa -> ops [op_1 ].op1_use = ssa -> ops [op_1 ].op2_use ;
621
+ ssa -> ops [op_1 ].op1_use_chain = ssa -> ops [op_1 ].op2_use_chain ;
622
+ ssa -> ops [op_1 ].op2_use = -1 ;
623
+ ssa -> ops [op_1 ].op2_use_chain = -1 ;
624
+
625
+ /* Update opcode */
626
+ opline -> result_type = opline -> op1_type ;
627
+ opline -> result .var = opline -> op1 .var ;
628
+ opline -> op1_type = opline -> op2_type ;
629
+ opline -> op1 .var = opline -> op2 .var ;
630
+ opline -> op2_type = IS_UNUSED ;
631
+ opline -> op2 .var = 0 ;
632
+ opline -> opcode = ZEND_QM_ASSIGN ;
629
633
}
630
634
}
631
635
0 commit comments