@@ -2164,6 +2164,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
21642164 && STACK_REG (parent_stack , i ) != ZREG_NONE
21652165 && STACK_REG (parent_stack , i ) < ZREG_NUM ) {
21662166 /* We will try to reuse register from parent trace */
2167+ flags [i ] = STACK_FLAGS (parent_stack , i );
21672168 count += 2 ;
21682169 } else {
21692170 flags [i ] = ZREG_LOAD ;
@@ -2888,7 +2889,8 @@ static int zend_jit_trace_stack_needs_deoptimization(zend_jit_trace_stack *stack
28882889 uint32_t i ;
28892890
28902891 for (i = 0 ; i < stack_size ; i ++ ) {
2891- if (STACK_REG (stack , i ) != ZREG_NONE ) {
2892+ if (STACK_REG (stack , i ) != ZREG_NONE
2893+ && !(STACK_FLAGS (stack , i ) & (ZREG_LOAD |ZREG_STORE ))) {
28922894 return 1 ;
28932895 }
28942896 }
@@ -2932,7 +2934,7 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst,
29322934 if (ra && ra [i ] && ra [i ]-> reg == reg ) {
29332935 /* register already loaded by parent trace */
29342936 if (stack ) {
2935- SET_STACK_REG (stack , i , reg );
2937+ SET_STACK_REG_EX (stack , i , reg , STACK_FLAGS ( parent_stack , i ) );
29362938 }
29372939 has_unsaved_vars = 1 ;
29382940 } else {
@@ -2941,7 +2943,8 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst,
29412943 if (stack ) {
29422944 SET_STACK_TYPE (stack , i , type , 1 );
29432945 }
2944- if (!zend_jit_store_var (Dst , 1 << type , i , reg ,
2946+ if (!(STACK_FLAGS (parent_stack , i ) & (ZREG_LOAD |ZREG_STORE ))
2947+ && !zend_jit_store_var (Dst , 1 << type , i , reg ,
29452948 STACK_MEM_TYPE (parent_stack , i ) != type )) {
29462949 return 0 ;
29472950 }
@@ -2967,7 +2970,8 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst,
29672970 if (stack ) {
29682971 SET_STACK_TYPE (stack , i , type , 1 );
29692972 }
2970- if (!zend_jit_store_var (Dst , 1 << type , i , reg ,
2973+ if (!(STACK_FLAGS (parent_stack , i ) & (ZREG_LOAD |ZREG_STORE ))
2974+ && !zend_jit_store_var (Dst , 1 << type , i , reg ,
29712975 STACK_MEM_TYPE (parent_stack , i ) != type )) {
29722976 return 0 ;
29732977 }
@@ -3331,7 +3335,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
33313335 && trace_buffer -> stop != ZEND_JIT_TRACE_STOP_RECURSIVE_RET ) {
33323336 for (i = 0 ; i < last_var ; i ++ ) {
33333337 if (ra [i ] && (ra [i ]-> flags & ZREG_LOAD ) != 0 ) {
3334- //SET_STACK_REG (stack, i, ra[i]->reg);
3338+ SET_STACK_REG_EX (stack , i , ra [i ]-> reg , ZREG_LOAD );
33353339 if (!zend_jit_load_var (& dasm_state , ssa -> var_info [i ].type , i , ra [i ]-> reg )) {
33363340 goto jit_failure ;
33373341 }
@@ -3356,12 +3360,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
33563360 if (ival -> flags & ZREG_LOAD ) {
33573361 ZEND_ASSERT (ival -> reg != ZREG_NONE );
33583362
3363+ SET_STACK_REG_EX (stack , phi -> var , ival -> reg , ZREG_LOAD );
33593364 if (!zend_jit_load_var (& dasm_state , ssa -> var_info [phi -> ssa_var ].type , ssa -> vars [phi -> ssa_var ].var , ival -> reg )) {
33603365 goto jit_failure ;
33613366 }
33623367 } else if (ival -> flags & ZREG_STORE ) {
33633368 ZEND_ASSERT (ival -> reg != ZREG_NONE );
33643369
3370+ SET_STACK_REG_EX (stack , phi -> var , ival -> reg , ZREG_STORE );
33653371 if (!zend_jit_store_var (& dasm_state , ssa -> var_info [phi -> ssa_var ].type , ssa -> vars [phi -> ssa_var ].var , ival -> reg ,
33663372 STACK_MEM_TYPE (stack , phi -> var ) != ssa -> var_info [phi -> ssa_var ].type )) {
33673373 goto jit_failure ;
@@ -3394,7 +3400,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
33943400 }
33953401 for (i = 0 ; i < last_var ; i ++ ) {
33963402 if (ra && ra [i ] && (ra [i ]-> flags & ZREG_LOAD ) != 0 ) {
3397- //SET_STACK_REG (stack, i, ra[i]->reg);
3403+ SET_STACK_REG_EX (stack , i , ra [i ]-> reg , ZREG_LOAD );
33983404 if (!zend_jit_load_var (& dasm_state , ssa -> var_info [i ].type , i , ra [i ]-> reg )) {
33993405 goto jit_failure ;
34003406 }
@@ -5294,7 +5300,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
52945300 } else if (ssa -> var_info [ssa_op -> result_def ].avoid_refcounting ) {
52955301 SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> result .var ), ZREG_ZVAL_TRY_ADDREF );
52965302 } else if (ra && ra [ssa_op -> result_def ]) {
5297- SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> result .var ), ra [ssa_op -> result_def ]-> reg );
5303+ SET_STACK_REG_EX (stack , EX_VAR_TO_NUM (opline -> result .var ), ra [ssa_op -> result_def ]-> reg ,
5304+ ra [ssa_op -> result_def ]-> flags & ZREG_STORE );
52985305 }
52995306 }
53005307 }
@@ -5328,7 +5335,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53285335 if (type != IS_UNKNOWN ) {
53295336 ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
53305337 if (ra && ra [ssa_op -> op1_def ]) {
5331- SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> op1 .var ), ra [ssa_op -> op1_def ]-> reg );
5338+ SET_STACK_REG_EX (stack , EX_VAR_TO_NUM (opline -> op1 .var ), ra [ssa_op -> op1_def ]-> reg ,
5339+ ra [ssa_op -> op1_def ]-> flags & ZREG_STORE );
53325340 }
53335341 }
53345342 }
@@ -5347,7 +5355,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53475355 if (type != IS_UNKNOWN ) {
53485356 ssa -> var_info [ssa_op -> op2_def ].type &= ~MAY_BE_GUARD ;
53495357 if (ra && ra [ssa_op -> op2_def ]) {
5350- SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> op2 .var ), ra [ssa_op -> op2_def ]-> reg );
5358+ SET_STACK_REG_EX (stack , EX_VAR_TO_NUM (opline -> op2 .var ), ra [ssa_op -> op2_def ]-> reg ,
5359+ ra [ssa_op -> op2_def ]-> flags & ZREG_STORE );
53515360 }
53525361 }
53535362 }
@@ -5381,7 +5390,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53815390 if (type != IS_UNKNOWN ) {
53825391 ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
53835392 if (ra && ra [ssa_op -> op1_def ]) {
5384- SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> op1 .var ), ra [ssa_op -> op1_def ]-> reg );
5393+ SET_STACK_REG_EX (stack , EX_VAR_TO_NUM (opline -> op1 .var ), ra [ssa_op -> op1_def ]-> reg ,
5394+ ra [ssa_op -> op1_def ]-> reg & ZREG_STORE );
53855395 }
53865396 }
53875397 }
@@ -5401,7 +5411,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
54015411 SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> result .var ), type ,
54025412 (!ra || !ra [ssa_op -> result_def ]));
54035413 if (ra && ra [ssa_op -> result_def ]) {
5404- SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> result .var ), ra [ssa_op -> result_def ]-> reg );
5414+ SET_STACK_REG_EX (stack , EX_VAR_TO_NUM (opline -> result .var ), ra [ssa_op -> result_def ]-> reg ,
5415+ ra [ssa_op -> result_def ]-> flags & ZREG_STORE );
54055416 }
54065417 }
54075418 ssa_op ++ ;
@@ -5422,7 +5433,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
54225433 SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ), type ,
54235434 (!ra || !ra [ssa_op -> op1_def ]));
54245435 if (ra && ra [ssa_op -> op1_def ]) {
5425- SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> op1 .var ), ra [ssa_op -> op1_def ]-> reg );
5436+ SET_STACK_REG_EX (stack , EX_VAR_TO_NUM (opline -> op1 .var ), ra [ssa_op -> op1_def ]-> reg ,
5437+ ra [ssa_op -> op1_def ]-> flags & ZREG_STORE );
54265438 }
54275439 }
54285440 ssa_op ++ ;
@@ -5495,7 +5507,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
54955507
54965508 for (i = 0 ; i < op_array -> last_var ; i ++ ,j ++ ) {
54975509 if (ra [j ] && (ra [j ]-> flags & ZREG_LOAD ) != 0 ) {
5498- //SET_STACK_REG (stack, i, ra[j]->reg);
5510+ SET_STACK_REG_EX (stack , i , ra [j ]-> reg , ZREG_LOAD );
54995511 if (!zend_jit_load_var (& dasm_state , ssa -> var_info [j ].type , i , ra [j ]-> reg )) {
55005512 goto jit_failure ;
55015513 }
@@ -5532,7 +5544,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
55325544 j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR (p -> info );
55335545 for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ , j ++ ) {
55345546 if (ra [j ] && (ra [j ]-> flags & ZREG_LOAD ) != 0 ) {
5535- //SET_STACK_REG (stack, i, ra[j]->reg);
5547+ SET_STACK_REG_EX (stack , i , ra [j ]-> reg , ZREG_LOAD );
55365548 if (!zend_jit_load_var (& dasm_state , ssa -> var_info [j ].type , i , ra [j ]-> reg )) {
55375549 goto jit_failure ;
55385550 }
0 commit comments