@@ -1872,7 +1872,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18721872 if (!(orig_op1_type & IS_TRACE_PACKED )) {
18731873 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
18741874
1875- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1875+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1876+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
18761877 info -> type |= MAY_BE_PACKED_GUARD ;
18771878 info -> type &= ~MAY_BE_ARRAY_PACKED ;
18781879 }
@@ -1881,7 +1882,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18811882 && val_type != IS_UNDEF ) {
18821883 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
18831884
1884- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1885+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1886+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
18851887 info -> type |= MAY_BE_PACKED_GUARD ;
18861888 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
18871889 }
@@ -1965,7 +1967,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
19651967
19661968 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
19671969
1968- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
1970+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
1971+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
19691972 info -> type |= MAY_BE_PACKED_GUARD ;
19701973 if (orig_op1_type & IS_TRACE_PACKED ) {
19711974 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
@@ -2067,7 +2070,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
20672070
20682071 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
20692072
2070- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
2073+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
2074+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
20712075 info -> type |= MAY_BE_PACKED_GUARD ;
20722076 if (orig_op1_type & IS_TRACE_PACKED ) {
20732077 info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
@@ -2097,7 +2101,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
20972101
20982102 zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
20992103
2100- if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )) {
2104+ if (MAY_BE_PACKED (info -> type ) && MAY_BE_HASH (info -> type )
2105+ && (info -> type & (MAY_BE_ANY |MAY_BE_UNDEF )) == MAY_BE_ARRAY ) {
21012106 info -> type |= MAY_BE_PACKED_GUARD ;
21022107 info -> type &= ~MAY_BE_ARRAY_PACKED ;
21032108 }
@@ -4236,10 +4241,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
42364241 if ((info & MAY_BE_PACKED_GUARD ) != 0
42374242 && (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_LOOP
42384243 || trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_CALL
4239- || trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET )
4244+ || (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET
4245+ && EX_VAR_TO_NUM ((opline - 1 )-> result .var ) == i ))
42404246 && (ssa -> vars [i ].use_chain != -1
42414247 || (ssa -> vars [i ].phi_use_chain
42424248 && !(ssa -> var_info [ssa -> vars [i ].phi_use_chain -> ssa_var ].type & MAY_BE_PACKED_GUARD )))) {
4249+ ZEND_ASSERT (STACK_TYPE (stack , i ) == IS_ARRAY );
4250+
42434251 if (!zend_jit_packed_guard (& ctx , opline , EX_NUM_TO_VAR (i ), info )) {
42444252 goto jit_failure ;
42454253 }
0 commit comments