@@ -2105,9 +2105,25 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2105
2105
&& !zend_ssa_is_no_val_use (opline , ssa_op , ssa_op -> op1_use )) {
2106
2106
if (support_opline ) {
2107
2107
zend_jit_trace_use_var (idx , ssa_op -> op1_use , ssa_op -> op1_def , ssa_op -> op1_use_chain , start , end , flags , ssa , ssa_opcodes , op_array , op_array_ssa );
2108
- if (opline -> opcode == ZEND_CASE && opline -> op1_type != IS_CV ) {
2109
- /* The value may be used outside of the trace */
2110
- flags [ssa_op -> op1_use ] |= ZREG_STORE ;
2108
+ if (opline -> op1_type != IS_CV ) {
2109
+ if (opline -> opcode == ZEND_CASE
2110
+ || opline -> opcode == ZEND_CASE_STRICT
2111
+ || opline -> opcode == ZEND_SWITCH_LONG
2112
+ || opline -> opcode == ZEND_MATCH
2113
+ || opline -> opcode == ZEND_FETCH_LIST_R
2114
+ || opline -> opcode == ZEND_COPY_TMP
2115
+ || opline -> opcode == ZEND_SWITCH_STRING
2116
+ || opline -> opcode == ZEND_FE_FETCH_R
2117
+ || opline -> opcode == ZEND_FE_FETCH_RW
2118
+ || opline -> opcode == ZEND_FETCH_LIST_W
2119
+ || opline -> opcode == ZEND_VERIFY_RETURN_TYPE
2120
+ || opline -> opcode == ZEND_BIND_LEXICAL
2121
+ || opline -> opcode == ZEND_ROPE_ADD ) {
2122
+ /* The value is kept alive and may be used outside of the trace */
2123
+ flags [ssa_op -> op1_use ] |= ZREG_STORE ;
2124
+ } else {
2125
+ flags [ssa_op -> op1_use ] |= ZREG_LAST_USE ;
2126
+ }
2111
2127
}
2112
2128
} else {
2113
2129
start [ssa_op -> op1_use ] = -1 ;
@@ -2121,6 +2137,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2121
2137
&& !zend_ssa_is_no_val_use (opline , ssa_op , ssa_op -> op2_use )) {
2122
2138
if (support_opline ) {
2123
2139
zend_jit_trace_use_var (idx , ssa_op -> op2_use , ssa_op -> op2_def , ssa_op -> op2_use_chain , start , end , flags , ssa , ssa_opcodes , op_array , op_array_ssa );
2140
+ if (opline -> op2_type != IS_CV ) {
2141
+ flags [ssa_op -> op2_use ] |= ZREG_LAST_USE ;
2142
+ }
2124
2143
} else {
2125
2144
start [ssa_op -> op2_use ] = -1 ;
2126
2145
end [ssa_op -> op2_use ] = -1 ;
@@ -2215,6 +2234,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2215
2234
&& !zend_ssa_is_no_val_use (opline , ssa_op , ssa_op -> op1_use )) {
2216
2235
if (support_opline ) {
2217
2236
zend_jit_trace_use_var (idx , ssa_op -> op1_use , ssa_op -> op1_def , ssa_op -> op1_use_chain , start , end , flags , ssa , ssa_opcodes , op_array , op_array_ssa );
2237
+ if (opline -> op1_type != IS_CV ) {
2238
+ flags [ssa_op -> op1_use ] |= ZREG_LAST_USE ;
2239
+ }
2218
2240
} else {
2219
2241
start [ssa_op -> op1_use ] = -1 ;
2220
2242
end [ssa_op -> op1_use ] = -1 ;
0 commit comments