@@ -1745,7 +1745,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
17451745 if (!(orig_op1_type & IS_TRACE_PACKED )) {
17461746 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
17471747
1748- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1748+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1749+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
17491750 info -> type |= MAY_BE_PACKED_GUARD ;
17501751 info -> type &= ~MAY_BE_ARRAY_PACKED ;
17511752 }
@@ -1754,7 +1755,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
17541755 && val_type != IS_UNDEF ) {
17551756 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
17561757
1757- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1758+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1759+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
17581760 info -> type |= MAY_BE_PACKED_GUARD ;
17591761 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
17601762 }
@@ -1833,7 +1835,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18331835
18341836 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
18351837
1836- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1838+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1839+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
18371840 info -> type |= MAY_BE_PACKED_GUARD ;
18381841 if (orig_op1_type & IS_TRACE_PACKED ) {
18391842 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
@@ -1935,7 +1938,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
19351938
19361939 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
19371940
1938- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1941+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1942+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
19391943 info -> type |= MAY_BE_PACKED_GUARD ;
19401944 if (orig_op1_type & IS_TRACE_PACKED ) {
19411945 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
@@ -1965,7 +1969,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
19651969
19661970 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
19671971
1968- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1972+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1973+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
19691974 info -> type |= MAY_BE_PACKED_GUARD ;
19701975 info -> type &= ~MAY_BE_ARRAY_PACKED ;
19711976 }
@@ -4164,10 +4169,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
41644169 if ((info & MAY_BE_PACKED_GUARD ) != 0
41654170 && (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_LOOP
41664171 || trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_CALL
4167- || trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET )
4172+ || (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET
4173+ && (opline - 1 )-> result_type == IS_VAR
4174+ && EX_VAR_TO_NUM ((opline - 1 )-> result .var ) == i ))
41684175 && (ssa -> vars [i ].use_chain != -1
41694176 || (ssa -> vars [i ].phi_use_chain
41704177 && !(ssa -> var_info [ssa -> vars [i ].phi_use_chain -> ssa_var ].type & MAY_BE_PACKED_GUARD )))) {
4178+ ZEND_ASSERT (STACK_TYPE (stack , i ) == IS_ARRAY );
4179+
41714180 if (!zend_jit_packed_guard (& dasm_state , opline , EX_NUM_TO_VAR (i ), info )) {
41724181 goto jit_failure ;
41734182 }
0 commit comments