@@ -1848,7 +1848,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1848
1848
if (!(orig_op1_type & IS_TRACE_PACKED )) {
1849
1849
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1850
1850
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 ) {
1852
1853
info -> type |= MAY_BE_PACKED_GUARD ;
1853
1854
info -> type &= ~MAY_BE_ARRAY_PACKED ;
1854
1855
}
@@ -1857,7 +1858,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1857
1858
&& val_type != IS_UNDEF ) {
1858
1859
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1859
1860
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 ) {
1861
1863
info -> type |= MAY_BE_PACKED_GUARD ;
1862
1864
info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
1863
1865
}
@@ -1941,7 +1943,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1941
1943
1942
1944
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1943
1945
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 ) {
1945
1948
info -> type |= MAY_BE_PACKED_GUARD ;
1946
1949
if (orig_op1_type & IS_TRACE_PACKED ) {
1947
1950
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
2043
2046
2044
2047
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
2045
2048
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 ) {
2047
2051
info -> type |= MAY_BE_PACKED_GUARD ;
2048
2052
if (orig_op1_type & IS_TRACE_PACKED ) {
2049
2053
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
2073
2077
2074
2078
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
2075
2079
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 ) {
2077
2082
info -> type |= MAY_BE_PACKED_GUARD ;
2078
2083
info -> type &= ~MAY_BE_ARRAY_PACKED ;
2079
2084
}
@@ -4212,10 +4217,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4212
4217
if ((info & MAY_BE_PACKED_GUARD ) != 0
4213
4218
&& (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_LOOP
4214
4219
|| 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 ))
4216
4222
&& (ssa -> vars [i ].use_chain != -1
4217
4223
|| (ssa -> vars [i ].phi_use_chain
4218
4224
&& !(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
+
4219
4227
if (!zend_jit_packed_guard (& ctx , opline , EX_NUM_TO_VAR (i ), info )) {
4220
4228
goto jit_failure ;
4221
4229
}
0 commit comments