@@ -5022,6 +5022,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5022
5022
zend_may_throw_ex (opline , ssa_op , op_array , ssa , op1_info , op2_info ))) {
5023
5023
goto jit_failure ;
5024
5024
}
5025
+ if (ssa_op -> op2_def > 0
5026
+ && Z_MODE (op2_addr ) == IS_REG
5027
+ && ssa -> vars [ssa_op -> op2_def ].no_val ) {
5028
+ uint8_t type = (op2_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5029
+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op2 .var );
5030
+
5031
+ if (STACK_MEM_TYPE (stack , var_num ) != type
5032
+ && ssa -> vars [ssa_op -> op2_def ].use_chain < 0
5033
+ && !ssa -> vars [ssa_op -> op2_def ].phi_use_chain ) {
5034
+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5035
+ return 0 ;
5036
+ }
5037
+ SET_STACK_TYPE (stack , var_num , type , 1 );
5038
+ }
5039
+ }
5025
5040
if (opline -> op2_type == IS_CV
5026
5041
&& ssa_op -> op2_def >= 0
5027
5042
&& ssa -> vars [ssa_op -> op2_def ].alias == NO_ALIAS ) {
@@ -5058,6 +5073,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5058
5073
res_use_info , res_info , res_addr )) {
5059
5074
goto jit_failure ;
5060
5075
}
5076
+ if (ssa_op -> op1_def > 0
5077
+ && Z_MODE (op1_addr ) == IS_REG
5078
+ && ssa -> vars [ssa_op -> op1_def ].no_val ) {
5079
+ uint8_t type = (op1_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5080
+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op1 .var );
5081
+
5082
+ if (STACK_MEM_TYPE (stack , var_num ) != type
5083
+ && ssa -> vars [ssa_op -> op1_def ].use_chain < 0
5084
+ && !ssa -> vars [ssa_op -> op1_def ].phi_use_chain ) {
5085
+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5086
+ return 0 ;
5087
+ }
5088
+ SET_STACK_TYPE (stack , var_num , type , 1 );
5089
+ }
5090
+ }
5061
5091
if (opline -> op1_type == IS_CV
5062
5092
&& ssa_op -> op1_def >= 0
5063
5093
&& ssa -> vars [ssa_op -> op1_def ].alias == NO_ALIAS ) {
@@ -5140,6 +5170,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5140
5170
op1_info , op1_addr , op1_def_addr )) {
5141
5171
goto jit_failure ;
5142
5172
}
5173
+ if (ssa_op -> op1_def > 0
5174
+ && Z_MODE (op1_addr ) == IS_REG
5175
+ && ssa -> vars [ssa_op -> op1_def ].no_val ) {
5176
+ uint8_t type = (op1_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5177
+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op1 .var );
5178
+
5179
+ if (STACK_MEM_TYPE (stack , var_num ) != type
5180
+ && ssa -> vars [ssa_op -> op1_def ].use_chain < 0
5181
+ && !ssa -> vars [ssa_op -> op1_def ].phi_use_chain ) {
5182
+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5183
+ return 0 ;
5184
+ }
5185
+ SET_STACK_TYPE (stack , var_num , type , 1 );
5186
+ }
5187
+ }
5143
5188
if (opline -> op1_type == IS_CV
5144
5189
&& ssa_op -> op1_def >= 0
5145
5190
&& ssa -> vars [ssa_op -> op1_def ].alias == NO_ALIAS ) {
@@ -6872,9 +6917,30 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6872
6917
}
6873
6918
} else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
6874
6919
|| p -> stop == ZEND_JIT_TRACE_STOP_INTERPRETER ) {
6875
- if (!zend_jit_trace_deoptimization (& dasm_state , 0 , NULL ,
6876
- stack , op_array -> last_var + op_array -> T , NULL , NULL , NULL , 0 )) {
6877
- goto jit_failure ;
6920
+ if (ra
6921
+ && (p - 1 )-> op != ZEND_JIT_TRACE_ENTER
6922
+ && (p - 1 )-> op != ZEND_JIT_TRACE_BACK
6923
+ && opline -> opcode != ZEND_DO_UCALL
6924
+ && opline -> opcode != ZEND_DO_FCALL
6925
+ && opline -> opcode != ZEND_DO_FCALL_BY_NAME
6926
+ && opline -> opcode != ZEND_INCLUDE_OR_EVAL ) {
6927
+ if (!zend_jit_trace_deoptimization (& dasm_state , 0 , NULL ,
6928
+ stack , op_array -> last_var + op_array -> T , NULL , NULL , NULL , 0 )) {
6929
+ goto jit_failure ;
6930
+ }
6931
+ for (i = 0 ; i < op_array -> last_var ; i ++ ) {
6932
+ int8_t reg = STACK_REG (stack , i );
6933
+ uint8_t type = STACK_TYPE (stack , i );
6934
+
6935
+ if (reg == ZREG_NONE
6936
+ && type != IS_UNKNOWN
6937
+ && type != STACK_MEM_TYPE (stack , i )) {
6938
+ if (!zend_jit_store_var_type (& dasm_state , i , type )) {
6939
+ return 0 ;
6940
+ }
6941
+ SET_STACK_TYPE (stack , i , type , 1 );
6942
+ }
6943
+ }
6878
6944
}
6879
6945
if (p -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
6880
6946
const void * timeout_exit_addr = NULL ;
0 commit comments