@@ -1745,7 +1745,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1745
1745
if (!(orig_op1_type & IS_TRACE_PACKED )) {
1746
1746
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1747
1747
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 ) {
1749
1750
info -> type |= MAY_BE_PACKED_GUARD ;
1750
1751
info -> type &= ~MAY_BE_ARRAY_PACKED ;
1751
1752
}
@@ -1754,7 +1755,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1754
1755
&& val_type != IS_UNDEF ) {
1755
1756
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1756
1757
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 ) {
1758
1760
info -> type |= MAY_BE_PACKED_GUARD ;
1759
1761
info -> type &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
1760
1762
}
@@ -1833,7 +1835,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1833
1835
1834
1836
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1835
1837
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 ) {
1837
1840
info -> type |= MAY_BE_PACKED_GUARD ;
1838
1841
if (orig_op1_type & IS_TRACE_PACKED ) {
1839
1842
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
1935
1938
1936
1939
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1937
1940
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 ) {
1939
1943
info -> type |= MAY_BE_PACKED_GUARD ;
1940
1944
if (orig_op1_type & IS_TRACE_PACKED ) {
1941
1945
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
1965
1969
1966
1970
zend_ssa_var_info * info = & tssa -> var_info [tssa -> ops [idx ].op1_use ];
1967
1971
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 ) {
1969
1974
info -> type |= MAY_BE_PACKED_GUARD ;
1970
1975
info -> type &= ~MAY_BE_ARRAY_PACKED ;
1971
1976
}
@@ -4164,10 +4169,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4164
4169
if ((info & MAY_BE_PACKED_GUARD ) != 0
4165
4170
&& (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_LOOP
4166
4171
|| 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 ))
4168
4175
&& (ssa -> vars [i ].use_chain != -1
4169
4176
|| (ssa -> vars [i ].phi_use_chain
4170
4177
&& !(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
+
4171
4180
if (!zend_jit_packed_guard (& dasm_state , opline , EX_NUM_TO_VAR (i ), info )) {
4172
4181
goto jit_failure ;
4173
4182
}
0 commit comments