Skip to content

Commit 2ad96b8

Browse files
committed
Eliminate more dead type stores
1 parent e5830c4 commit 2ad96b8

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

ext/opcache/jit/zend_jit_internal.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,8 @@ typedef union _zend_jit_trace_stack {
334334
(_stack)[_slot].mem_type
335335
#define STACK_REG(_stack, _slot) \
336336
(_stack)[_slot].reg
337+
#define STACK_FLAGS(_stack, _slot) \
338+
(_stack)[_slot].flags
337339
#define SET_STACK_VAR(_stack, _slot, _ssa_var) do { \
338340
(_stack)[_slot].ssa_var = _ssa_var; \
339341
} while (0)
@@ -351,6 +353,11 @@ typedef union _zend_jit_trace_stack {
351353
} while (0)
352354
#define SET_STACK_REG(_stack, _slot, _reg) do { \
353355
(_stack)[_slot].reg = _reg; \
356+
(_stack)[_slot].flags = 0; \
357+
} while (0)
358+
#define SET_STACK_REG_EX(_stack, _slot, _reg, _flags) do { \
359+
(_stack)[_slot].reg = _reg; \
360+
(_stack)[_slot].flags = _flags; \
354361
} while (0)
355362

356363
/* trace info flags */

ext/opcache/jit/zend_jit_trace.c

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)