@@ -3499,9 +3499,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3499
3499
op1_addr = OP1_REG_ADDR ();
3500
3500
if (orig_op1_type != IS_UNKNOWN
3501
3501
&& (orig_op1_type & IS_TRACE_REFERENCE )) {
3502
- if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr , 1 )) {
3502
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
3503
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 1 )) {
3503
3504
goto jit_failure ;
3504
3505
}
3506
+ if (opline -> op1_type == IS_CV
3507
+ && !zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
3508
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
3509
+ }
3505
3510
} else {
3506
3511
CHECK_OP1_TRACE_TYPE ();
3507
3512
}
@@ -3525,9 +3530,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3525
3530
op1_addr = OP1_REG_ADDR ();
3526
3531
if (orig_op1_type != IS_UNKNOWN
3527
3532
&& (orig_op1_type & IS_TRACE_REFERENCE )) {
3528
- if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr , 1 )) {
3533
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
3534
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 1 )) {
3529
3535
goto jit_failure ;
3530
3536
}
3537
+ if (opline -> op1_type == IS_CV
3538
+ && !zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
3539
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
3540
+ }
3531
3541
} else {
3532
3542
CHECK_OP1_TRACE_TYPE ();
3533
3543
}
@@ -3568,9 +3578,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3568
3578
op1_def_addr = OP1_DEF_REG_ADDR ();
3569
3579
if (orig_op1_type != IS_UNKNOWN ) {
3570
3580
if (orig_op1_type & IS_TRACE_REFERENCE ) {
3571
- if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr , 0 )) {
3581
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
3582
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 0 )) {
3572
3583
goto jit_failure ;
3573
3584
}
3585
+ if (opline -> op1_type == IS_CV
3586
+ && !zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
3587
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
3588
+ }
3574
3589
if (!zend_jit_assign_to_typed_ref (& dasm_state , opline , opline -> op2_type , op2_addr , 1 )) {
3575
3590
goto jit_failure ;
3576
3591
}
@@ -4009,9 +4024,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4009
4024
op1_addr = OP1_REG_ADDR ();
4010
4025
if (orig_op1_type != IS_UNKNOWN
4011
4026
&& (orig_op1_type & IS_TRACE_REFERENCE )) {
4012
- if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr , 1 )) {
4027
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
4028
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 1 )) {
4013
4029
goto jit_failure ;
4014
4030
}
4031
+ if (opline -> op1_type == IS_CV
4032
+ && !zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4033
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4034
+ }
4015
4035
} else {
4016
4036
CHECK_OP1_TRACE_TYPE ();
4017
4037
}
@@ -4049,9 +4069,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4049
4069
op1_addr = OP1_REG_ADDR ();
4050
4070
if (orig_op1_type != IS_UNKNOWN
4051
4071
&& (orig_op1_type & IS_TRACE_REFERENCE )) {
4052
- if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr , 1 )) {
4072
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
4073
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 1 )) {
4053
4074
goto jit_failure ;
4054
4075
}
4076
+ if (opline -> op1_type == IS_CV
4077
+ && !zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4078
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4079
+ }
4055
4080
} else {
4056
4081
CHECK_OP1_TRACE_TYPE ();
4057
4082
}
@@ -4091,9 +4116,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4091
4116
op1_addr = OP1_REG_ADDR ();
4092
4117
if (orig_op1_type != IS_UNKNOWN
4093
4118
&& (orig_op1_type & IS_TRACE_REFERENCE )) {
4094
- if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr , 1 )) {
4119
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
4120
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 1 )) {
4095
4121
goto jit_failure ;
4096
4122
}
4123
+ if (opline -> op1_type == IS_CV
4124
+ && !zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4125
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4126
+ }
4097
4127
} else {
4098
4128
CHECK_OP1_TRACE_TYPE ();
4099
4129
}
@@ -4187,9 +4217,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4187
4217
}
4188
4218
if (orig_op1_type != IS_UNKNOWN
4189
4219
&& (orig_op1_type & IS_TRACE_REFERENCE )) {
4190
- if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr , 1 )) {
4220
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
4221
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 1 )) {
4191
4222
goto jit_failure ;
4192
4223
}
4224
+ if (opline -> op1_type == IS_CV
4225
+ && !zend_jit_var_may_be_modified_indirectly (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var ))) {
4226
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
4227
+ }
4193
4228
} else {
4194
4229
CHECK_OP1_TRACE_TYPE ();
4195
4230
}
0 commit comments