@@ -5022,6 +5022,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50225022 zend_may_throw_ex (opline , ssa_op , op_array , ssa , op1_info , op2_info ))) {
50235023 goto jit_failure ;
50245024 }
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+ }
50255040 if (opline -> op2_type == IS_CV
50265041 && ssa_op -> op2_def >= 0
50275042 && 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
50585073 res_use_info , res_info , res_addr )) {
50595074 goto jit_failure ;
50605075 }
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+ }
50615091 if (opline -> op1_type == IS_CV
50625092 && ssa_op -> op1_def >= 0
50635093 && 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
51405170 op1_info , op1_addr , op1_def_addr )) {
51415171 goto jit_failure ;
51425172 }
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+ }
51435188 if (opline -> op1_type == IS_CV
51445189 && ssa_op -> op1_def >= 0
51455190 && 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
68726917 }
68736918 } else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
68746919 || 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+ }
68786944 }
68796945 if (p -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
68806946 const void * timeout_exit_addr = NULL ;
0 commit comments