@@ -5033,6 +5033,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5033
5033
zend_may_throw_ex (opline , ssa_op , op_array , ssa , op1_info , op2_info ))) {
5034
5034
goto jit_failure ;
5035
5035
}
5036
+ if (ssa_op -> op2_def > 0
5037
+ && Z_MODE (op2_addr ) == IS_REG
5038
+ && ssa -> vars [ssa_op -> op2_def ].no_val ) {
5039
+ uint8_t type = (op2_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5040
+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op2 .var );
5041
+
5042
+ if (STACK_MEM_TYPE (stack , var_num ) != type
5043
+ && ssa -> vars [ssa_op -> op2_def ].use_chain < 0
5044
+ && !ssa -> vars [ssa_op -> op2_def ].phi_use_chain ) {
5045
+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5046
+ return 0 ;
5047
+ }
5048
+ SET_STACK_TYPE (stack , var_num , type , 1 );
5049
+ }
5050
+ }
5036
5051
if (opline -> op2_type == IS_CV
5037
5052
&& ssa_op -> op2_def >= 0
5038
5053
&& ssa -> vars [ssa_op -> op2_def ].alias == NO_ALIAS ) {
@@ -5069,6 +5084,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5069
5084
res_use_info , res_info , res_addr )) {
5070
5085
goto jit_failure ;
5071
5086
}
5087
+ if (ssa_op -> op1_def > 0
5088
+ && Z_MODE (op1_addr ) == IS_REG
5089
+ && ssa -> vars [ssa_op -> op1_def ].no_val ) {
5090
+ uint8_t type = (op1_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5091
+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op1 .var );
5092
+
5093
+ if (STACK_MEM_TYPE (stack , var_num ) != type
5094
+ && ssa -> vars [ssa_op -> op1_def ].use_chain < 0
5095
+ && !ssa -> vars [ssa_op -> op1_def ].phi_use_chain ) {
5096
+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5097
+ return 0 ;
5098
+ }
5099
+ SET_STACK_TYPE (stack , var_num , type , 1 );
5100
+ }
5101
+ }
5072
5102
if (opline -> op1_type == IS_CV
5073
5103
&& ssa_op -> op1_def >= 0
5074
5104
&& ssa -> vars [ssa_op -> op1_def ].alias == NO_ALIAS ) {
@@ -5151,6 +5181,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5151
5181
op1_info , op1_addr , op1_def_addr )) {
5152
5182
goto jit_failure ;
5153
5183
}
5184
+ if (ssa_op -> op1_def > 0
5185
+ && Z_MODE (op1_addr ) == IS_REG
5186
+ && ssa -> vars [ssa_op -> op1_def ].no_val ) {
5187
+ uint8_t type = (op1_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5188
+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op1 .var );
5189
+
5190
+ if (STACK_MEM_TYPE (stack , var_num ) != type
5191
+ && ssa -> vars [ssa_op -> op1_def ].use_chain < 0
5192
+ && !ssa -> vars [ssa_op -> op1_def ].phi_use_chain ) {
5193
+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5194
+ return 0 ;
5195
+ }
5196
+ SET_STACK_TYPE (stack , var_num , type , 1 );
5197
+ }
5198
+ }
5154
5199
if (opline -> op1_type == IS_CV
5155
5200
&& ssa_op -> op1_def >= 0
5156
5201
&& ssa -> vars [ssa_op -> op1_def ].alias == NO_ALIAS ) {
@@ -6861,9 +6906,30 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6861
6906
}
6862
6907
} else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
6863
6908
|| p -> stop == ZEND_JIT_TRACE_STOP_INTERPRETER ) {
6864
- if (!zend_jit_trace_deoptimization (& dasm_state , 0 , NULL ,
6865
- stack , op_array -> last_var + op_array -> T , NULL , NULL , NULL , 0 )) {
6866
- goto jit_failure ;
6909
+ if (ra
6910
+ && (p - 1 )-> op != ZEND_JIT_TRACE_ENTER
6911
+ && (p - 1 )-> op != ZEND_JIT_TRACE_BACK
6912
+ && opline -> opcode != ZEND_DO_UCALL
6913
+ && opline -> opcode != ZEND_DO_FCALL
6914
+ && opline -> opcode != ZEND_DO_FCALL_BY_NAME
6915
+ && opline -> opcode != ZEND_INCLUDE_OR_EVAL ) {
6916
+ if (!zend_jit_trace_deoptimization (& dasm_state , 0 , NULL ,
6917
+ stack , op_array -> last_var + op_array -> T , NULL , NULL , NULL , 0 )) {
6918
+ goto jit_failure ;
6919
+ }
6920
+ for (i = 0 ; i < op_array -> last_var ; i ++ ) {
6921
+ int8_t reg = STACK_REG (stack , i );
6922
+ uint8_t type = STACK_TYPE (stack , i );
6923
+
6924
+ if (reg == ZREG_NONE
6925
+ && type != IS_UNKNOWN
6926
+ && type != STACK_MEM_TYPE (stack , i )) {
6927
+ if (!zend_jit_store_var_type (& dasm_state , i , type )) {
6928
+ return 0 ;
6929
+ }
6930
+ SET_STACK_TYPE (stack , i , type , 1 );
6931
+ }
6932
+ }
6867
6933
}
6868
6934
if (p -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
6869
6935
const void * timeout_exit_addr = NULL ;
0 commit comments