@@ -2164,6 +2164,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2164
2164
&& STACK_REG (parent_stack , i ) != ZREG_NONE
2165
2165
&& STACK_REG (parent_stack , i ) < ZREG_NUM ) {
2166
2166
/* We will try to reuse register from parent trace */
2167
+ flags [i ] = STACK_FLAGS (parent_stack , i );
2167
2168
count += 2 ;
2168
2169
} else {
2169
2170
flags [i ] = ZREG_LOAD ;
@@ -2888,7 +2889,8 @@ static int zend_jit_trace_stack_needs_deoptimization(zend_jit_trace_stack *stack
2888
2889
uint32_t i ;
2889
2890
2890
2891
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 ))) {
2892
2894
return 1 ;
2893
2895
}
2894
2896
}
@@ -2932,7 +2934,7 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst,
2932
2934
if (ra && ra [i ] && ra [i ]-> reg == reg ) {
2933
2935
/* register already loaded by parent trace */
2934
2936
if (stack ) {
2935
- SET_STACK_REG (stack , i , reg );
2937
+ SET_STACK_REG_EX (stack , i , reg , STACK_FLAGS ( parent_stack , i ) );
2936
2938
}
2937
2939
has_unsaved_vars = 1 ;
2938
2940
} else {
@@ -2941,7 +2943,8 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst,
2941
2943
if (stack ) {
2942
2944
SET_STACK_TYPE (stack , i , type , 1 );
2943
2945
}
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 ,
2945
2948
STACK_MEM_TYPE (parent_stack , i ) != type )) {
2946
2949
return 0 ;
2947
2950
}
@@ -2967,7 +2970,8 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst,
2967
2970
if (stack ) {
2968
2971
SET_STACK_TYPE (stack , i , type , 1 );
2969
2972
}
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 ,
2971
2975
STACK_MEM_TYPE (parent_stack , i ) != type )) {
2972
2976
return 0 ;
2973
2977
}
@@ -3331,7 +3335,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3331
3335
&& trace_buffer -> stop != ZEND_JIT_TRACE_STOP_RECURSIVE_RET ) {
3332
3336
for (i = 0 ; i < last_var ; i ++ ) {
3333
3337
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 );
3335
3339
if (!zend_jit_load_var (& dasm_state , ssa -> var_info [i ].type , i , ra [i ]-> reg )) {
3336
3340
goto jit_failure ;
3337
3341
}
@@ -3356,12 +3360,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3356
3360
if (ival -> flags & ZREG_LOAD ) {
3357
3361
ZEND_ASSERT (ival -> reg != ZREG_NONE );
3358
3362
3363
+ SET_STACK_REG_EX (stack , phi -> var , ival -> reg , ZREG_LOAD );
3359
3364
if (!zend_jit_load_var (& dasm_state , ssa -> var_info [phi -> ssa_var ].type , ssa -> vars [phi -> ssa_var ].var , ival -> reg )) {
3360
3365
goto jit_failure ;
3361
3366
}
3362
3367
} else if (ival -> flags & ZREG_STORE ) {
3363
3368
ZEND_ASSERT (ival -> reg != ZREG_NONE );
3364
3369
3370
+ SET_STACK_REG_EX (stack , phi -> var , ival -> reg , ZREG_STORE );
3365
3371
if (!zend_jit_store_var (& dasm_state , ssa -> var_info [phi -> ssa_var ].type , ssa -> vars [phi -> ssa_var ].var , ival -> reg ,
3366
3372
STACK_MEM_TYPE (stack , phi -> var ) != ssa -> var_info [phi -> ssa_var ].type )) {
3367
3373
goto jit_failure ;
@@ -3394,7 +3400,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3394
3400
}
3395
3401
for (i = 0 ; i < last_var ; i ++ ) {
3396
3402
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 );
3398
3404
if (!zend_jit_load_var (& dasm_state , ssa -> var_info [i ].type , i , ra [i ]-> reg )) {
3399
3405
goto jit_failure ;
3400
3406
}
@@ -5294,7 +5300,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5294
5300
} else if (ssa -> var_info [ssa_op -> result_def ].avoid_refcounting ) {
5295
5301
SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> result .var ), ZREG_ZVAL_TRY_ADDREF );
5296
5302
} 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 );
5298
5305
}
5299
5306
}
5300
5307
}
@@ -5328,7 +5335,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5328
5335
if (type != IS_UNKNOWN ) {
5329
5336
ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
5330
5337
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 );
5332
5340
}
5333
5341
}
5334
5342
}
@@ -5347,7 +5355,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5347
5355
if (type != IS_UNKNOWN ) {
5348
5356
ssa -> var_info [ssa_op -> op2_def ].type &= ~MAY_BE_GUARD ;
5349
5357
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 );
5351
5360
}
5352
5361
}
5353
5362
}
@@ -5381,7 +5390,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5381
5390
if (type != IS_UNKNOWN ) {
5382
5391
ssa -> var_info [ssa_op -> op1_def ].type &= ~MAY_BE_GUARD ;
5383
5392
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 );
5385
5395
}
5386
5396
}
5387
5397
}
@@ -5401,7 +5411,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5401
5411
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> result .var ), type ,
5402
5412
(!ra || !ra [ssa_op -> result_def ]));
5403
5413
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 );
5405
5416
}
5406
5417
}
5407
5418
ssa_op ++ ;
@@ -5422,7 +5433,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5422
5433
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> op1 .var ), type ,
5423
5434
(!ra || !ra [ssa_op -> op1_def ]));
5424
5435
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 );
5426
5438
}
5427
5439
}
5428
5440
ssa_op ++ ;
@@ -5495,7 +5507,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5495
5507
5496
5508
for (i = 0 ; i < op_array -> last_var ; i ++ ,j ++ ) {
5497
5509
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 );
5499
5511
if (!zend_jit_load_var (& dasm_state , ssa -> var_info [j ].type , i , ra [j ]-> reg )) {
5500
5512
goto jit_failure ;
5501
5513
}
@@ -5532,7 +5544,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5532
5544
j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR (p -> info );
5533
5545
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ , j ++ ) {
5534
5546
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 );
5536
5548
if (!zend_jit_load_var (& dasm_state , ssa -> var_info [j ].type , i , ra [j ]-> reg )) {
5537
5549
goto jit_failure ;
5538
5550
}
0 commit comments