@@ -1520,6 +1520,11 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
15201520 /* break missing intentionally */
15211521 case ZEND_ASSIGN_DIM :
15221522 if (opline -> op1_type == IS_CV ) {
1523+ if ((opline + 1 )-> op1_type == IS_CV
1524+ && (opline + 1 )-> op1 .var == opline -> op1 .var ) {
1525+ /* skip $a[x] = $a; */
1526+ break ;
1527+ }
15231528 ADD_OP1_DATA_TRACE_GUARD ();
15241529 ADD_OP2_TRACE_GUARD ();
15251530 ADD_OP1_TRACE_GUARD ();
@@ -1553,6 +1558,12 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
15531558 break ;
15541559 }
15551560 if (opline -> opcode == ZEND_ASSIGN_OBJ_OP ) {
1561+ if (opline -> op1_type == IS_CV
1562+ && (opline + 1 )-> op1_type == IS_CV
1563+ && (opline + 1 )-> op1 .var == opline -> op1 .var ) {
1564+ /* skip $a->prop += $a; */
1565+ break ;
1566+ }
15561567 ADD_OP1_DATA_TRACE_GUARD ();
15571568 }
15581569 ADD_OP1_TRACE_GUARD ();
@@ -4219,6 +4230,12 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
42194230 opline -> extended_value , MAY_BE_ANY , OP1_DATA_INFO ())) {
42204231 break ;
42214232 }
4233+ if (opline -> op1_type == IS_CV
4234+ && (opline + 1 )-> op1_type == IS_CV
4235+ && (opline + 1 )-> op1 .var == opline -> op1 .var ) {
4236+ /* skip $a[x] += $a; */
4237+ break ;
4238+ }
42224239 op1_info = OP1_INFO ();
42234240 op1_addr = OP1_REG_ADDR ();
42244241 if (opline -> op1_type == IS_VAR ) {
@@ -4336,6 +4353,12 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
43364353 || Z_STRVAL_P (RT_CONSTANT (opline , opline -> op2 ))[0 ] == '\0' ) {
43374354 break ;
43384355 }
4356+ if (opline -> op1_type == IS_CV
4357+ && (opline + 1 )-> op1_type == IS_CV
4358+ && (opline + 1 )-> op1 .var == opline -> op1 .var ) {
4359+ /* skip $a->prop += $a; */
4360+ break ;
4361+ }
43394362 if (!zend_jit_supported_binary_op (
43404363 opline -> extended_value , MAY_BE_ANY , OP1_DATA_INFO ())) {
43414364 break ;
@@ -4480,6 +4503,12 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
44804503 case ZEND_ASSIGN_DIM :
44814504 op1_info = OP1_INFO ();
44824505 op1_addr = OP1_REG_ADDR ();
4506+ if (opline -> op1_type == IS_CV
4507+ && (opline + 1 )-> op1_type == IS_CV
4508+ && (opline + 1 )-> op1 .var == opline -> op1 .var ) {
4509+ /* skip $a[x] = $a; */
4510+ break ;
4511+ }
44834512 if (opline -> op1_type == IS_VAR ) {
44844513 if (orig_op1_type != IS_UNKNOWN
44854514 && (orig_op1_type & IS_TRACE_INDIRECT )
0 commit comments