@@ -1848,7 +1848,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18481848 if (!(orig_op1_type & IS_TRACE_PACKED )) {
18491849 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
18501850
1851- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1851+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1852+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
18521853 info -> type |= MAY_BE_PACKED_GUARD ;
18531854 info -> type &= ~MAY_BE_ARRAY_PACKED ;
18541855 }
@@ -1857,7 +1858,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18571858 && val_type != IS_UNDEF ) {
18581859 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
18591860
1860- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1861+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1862+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
18611863 info -> type |= MAY_BE_PACKED_GUARD ;
18621864 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
18631865 }
@@ -1941,7 +1943,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
19411943
19421944 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
19431945
1944- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1946+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1947+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
19451948 info -> type |= MAY_BE_PACKED_GUARD ;
19461949 if (orig_op1_type & IS_TRACE_PACKED ) {
19471950 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
@@ -2043,7 +2046,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
20432046
20442047 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
20452048
2046- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
2049+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
2050+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
20472051 info -> type |= MAY_BE_PACKED_GUARD ;
20482052 if (orig_op1_type & IS_TRACE_PACKED ) {
20492053 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
@@ -2073,7 +2077,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
20732077
20742078 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
20752079
2076- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
2080+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
2081+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
20772082 info -> type |= MAY_BE_PACKED_GUARD ;
20782083 info -> type &= ~MAY_BE_ARRAY_PACKED ;
20792084 }
@@ -4212,10 +4217,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
42124217 if ((info & MAY_BE_PACKED_GUARD ) != 0
42134218 && (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_LOOP
42144219 || trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_CALL
4215- || trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET )
4220+ || (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET
4221+ && EX_VAR_TO_NUM ((opline - 1 )-> result .var ) == i ))
42164222 && (ssa -> vars [i ].use_chain != -1
42174223 || (ssa -> vars [i ].phi_use_chain
42184224 && !(ssa -> var_info [ssa -> vars [i ].phi_use_chain -> ssa_var ].type & MAY_BE_PACKED_GUARD )))) {
4225+ ZEND_ASSERT (STACK_TYPE (stack , i ) == IS_ARRAY );
4226+
42194227 if (!zend_jit_packed_guard (& ctx , opline , EX_NUM_TO_VAR (i ), info )) {
42204228 goto jit_failure ;
42214229 }
0 commit comments