@@ -5033,6 +5033,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50335033 zend_may_throw_ex (opline , ssa_op , op_array , ssa , op1_info , op2_info ))) {
50345034 goto jit_failure ;
50355035 }
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+ }
50365051 if (opline -> op2_type == IS_CV
50375052 && ssa_op -> op2_def >= 0
50385053 && 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
50695084 res_use_info , res_info , res_addr )) {
50705085 goto jit_failure ;
50715086 }
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+ }
50725102 if (opline -> op1_type == IS_CV
50735103 && ssa_op -> op1_def >= 0
50745104 && 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
51515181 op1_info , op1_addr , op1_def_addr )) {
51525182 goto jit_failure ;
51535183 }
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+ }
51545199 if (opline -> op1_type == IS_CV
51555200 && ssa_op -> op1_def >= 0
51565201 && 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
68616906 }
68626907 } else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
68636908 || 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+ }
68676933 }
68686934 if (p -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
68696935 const void * timeout_exit_addr = NULL ;
0 commit comments