@@ -5037,6 +5037,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5037
5037
zend_may_throw_ex (opline , ssa_op , op_array , ssa , op1_info , op2_info ))) {
5038
5038
goto jit_failure ;
5039
5039
}
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
+ }
5040
5055
if (opline -> op2_type == IS_CV
5041
5056
&& ssa_op -> op2_def >= 0
5042
5057
&& 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
5073
5088
res_use_info , res_info , res_addr )) {
5074
5089
goto jit_failure ;
5075
5090
}
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
+ }
5076
5106
if (opline -> op1_type == IS_CV
5077
5107
&& ssa_op -> op1_def >= 0
5078
5108
&& 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
5155
5185
op1_info , op1_addr , op1_def_addr )) {
5156
5186
goto jit_failure ;
5157
5187
}
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
+ }
5158
5203
if (opline -> op1_type == IS_CV
5159
5204
&& ssa_op -> op1_def >= 0
5160
5205
&& 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
6875
6920
}
6876
6921
} else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
6877
6922
|| 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
+ }
6881
6947
}
6882
6948
if (p -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
6883
6949
const void * timeout_exit_addr = NULL ;
0 commit comments