@@ -5037,6 +5037,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50375037 zend_may_throw_ex (opline , ssa_op , op_array , ssa , op1_info , op2_info ))) {
50385038 goto jit_failure ;
50395039 }
5040+ if (ssa_op -> op2_def > 0
5041+ && Z_MODE (op2_addr ) == IS_REG
5042+ && ssa -> vars [ssa_op -> op2_def ].no_val ) {
5043+ uint8_t type = (op2_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5044+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op2 .var );
5045+
5046+ if (STACK_MEM_TYPE (stack , var_num ) != type
5047+ && ssa -> vars [ssa_op -> op2_def ].use_chain < 0
5048+ && !ssa -> vars [ssa_op -> op2_def ].phi_use_chain ) {
5049+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5050+ return 0 ;
5051+ }
5052+ SET_STACK_TYPE (stack , var_num , type , 1 );
5053+ }
5054+ }
50405055 if (opline -> op2_type == IS_CV
50415056 && ssa_op -> op2_def >= 0
50425057 && ssa -> vars [ssa_op -> op2_def ].alias == NO_ALIAS ) {
@@ -5073,6 +5088,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50735088 res_use_info , res_info , res_addr )) {
50745089 goto jit_failure ;
50755090 }
5091+ if (ssa_op -> op1_def > 0
5092+ && Z_MODE (op1_addr ) == IS_REG
5093+ && ssa -> vars [ssa_op -> op1_def ].no_val ) {
5094+ uint8_t type = (op1_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5095+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op1 .var );
5096+
5097+ if (STACK_MEM_TYPE (stack , var_num ) != type
5098+ && ssa -> vars [ssa_op -> op1_def ].use_chain < 0
5099+ && !ssa -> vars [ssa_op -> op1_def ].phi_use_chain ) {
5100+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5101+ return 0 ;
5102+ }
5103+ SET_STACK_TYPE (stack , var_num , type , 1 );
5104+ }
5105+ }
50765106 if (opline -> op1_type == IS_CV
50775107 && ssa_op -> op1_def >= 0
50785108 && ssa -> vars [ssa_op -> op1_def ].alias == NO_ALIAS ) {
@@ -5155,6 +5185,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
51555185 op1_info , op1_addr , op1_def_addr )) {
51565186 goto jit_failure ;
51575187 }
5188+ if (ssa_op -> op1_def > 0
5189+ && Z_MODE (op1_addr ) == IS_REG
5190+ && ssa -> vars [ssa_op -> op1_def ].no_val ) {
5191+ uint8_t type = (op1_info & MAY_BE_LONG ) ? IS_LONG : IS_DOUBLE ;
5192+ uint32_t var_num = EX_VAR_TO_NUM (opline -> op1 .var );
5193+
5194+ if (STACK_MEM_TYPE (stack , var_num ) != type
5195+ && ssa -> vars [ssa_op -> op1_def ].use_chain < 0
5196+ && !ssa -> vars [ssa_op -> op1_def ].phi_use_chain ) {
5197+ if (!zend_jit_store_var_type (& dasm_state , var_num , type )) {
5198+ return 0 ;
5199+ }
5200+ SET_STACK_TYPE (stack , var_num , type , 1 );
5201+ }
5202+ }
51585203 if (opline -> op1_type == IS_CV
51595204 && ssa_op -> op1_def >= 0
51605205 && ssa -> vars [ssa_op -> op1_def ].alias == NO_ALIAS ) {
@@ -6875,9 +6920,30 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
68756920 }
68766921 } else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
68776922 || p -> stop == ZEND_JIT_TRACE_STOP_INTERPRETER ) {
6878- if (!zend_jit_trace_deoptimization (& dasm_state , 0 , NULL ,
6879- stack , op_array -> last_var + op_array -> T , NULL , NULL , NULL , 0 )) {
6880- goto jit_failure ;
6923+ if (ra
6924+ && (p - 1 )-> op != ZEND_JIT_TRACE_ENTER
6925+ && (p - 1 )-> op != ZEND_JIT_TRACE_BACK
6926+ && opline -> opcode != ZEND_DO_UCALL
6927+ && opline -> opcode != ZEND_DO_FCALL
6928+ && opline -> opcode != ZEND_DO_FCALL_BY_NAME
6929+ && opline -> opcode != ZEND_INCLUDE_OR_EVAL ) {
6930+ if (!zend_jit_trace_deoptimization (& dasm_state , 0 , NULL ,
6931+ stack , op_array -> last_var + op_array -> T , NULL , NULL , NULL , 0 )) {
6932+ goto jit_failure ;
6933+ }
6934+ for (i = 0 ; i < op_array -> last_var ; i ++ ) {
6935+ int8_t reg = STACK_REG (stack , i );
6936+ uint8_t type = STACK_TYPE (stack , i );
6937+
6938+ if (reg == ZREG_NONE
6939+ && type != IS_UNKNOWN
6940+ && type != STACK_MEM_TYPE (stack , i )) {
6941+ if (!zend_jit_store_var_type (& dasm_state , i , type )) {
6942+ return 0 ;
6943+ }
6944+ SET_STACK_TYPE (stack , i , type , 1 );
6945+ }
6946+ }
68816947 }
68826948 if (p -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
68836949 const void * timeout_exit_addr = NULL ;
0 commit comments