From dde5572937e8165abac5fbaa2c4fbb85d7e391b2 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 10 Dec 2020 14:45:54 +0300 Subject: [PATCH] Eliminate some repeatable IS_REFERENCE checks --- ext/opcache/jit/zend_jit_trace.c | 62 ++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 145388088d6..ad4ce03a048 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -4134,8 +4134,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4196,8 +4196,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4268,8 +4268,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4334,8 +4334,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4358,6 +4358,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } + if ((opline+1)->op1_type == IS_CV + && (ssa_op+1)->op1_def >= 0 + && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { + ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_reference; + } goto done; case ZEND_ASSIGN_DIM: op1_info = OP1_INFO(); @@ -4381,8 +4386,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4396,6 +4401,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { goto jit_failure; } + if ((opline+1)->op1_type == IS_CV + && (ssa_op+1)->op1_def >= 0 + && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { + ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_reference; + } goto done; case ZEND_ASSIGN: if (opline->op1_type != IS_CV) { @@ -4422,8 +4432,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } if (!zend_jit_assign_to_typed_ref(&dasm_state, opline, opline->op2_type, op2_addr, 1)) { goto jit_failure; @@ -4488,6 +4498,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { goto jit_failure; } + if (opline->op2_type == IS_CV + && ssa_op->op2_def >= 0 + && ssa->vars[ssa_op->op2_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op2_def].guarded_reference = ssa->var_info[ssa_op->op2_use].guarded_reference; + } goto done; case ZEND_CAST: if (opline->extended_value != op1_type) { @@ -4518,6 +4533,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par res_use_info, res_info, RES_REG_ADDR())) { goto jit_failure; } + if (opline->op1_type == IS_CV + && ssa_op->op1_def >= 0 + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_reference; + } goto done; case ZEND_INIT_FCALL: case ZEND_INIT_FCALL_BY_NAME: @@ -4566,6 +4586,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, 0)) { goto jit_failure; } + if (opline->op1_type == IS_CV + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; + } goto done; case ZEND_SEND_VAR: case ZEND_SEND_VAR_EX: @@ -4595,6 +4619,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, op1_addr, op1_def_addr)) { goto jit_failure; } + if (opline->op1_type == IS_CV + && ssa_op->op1_def >= 0 + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_reference; + } if (frame->call && frame->call->func && frame->call->func->type == ZEND_USER_FUNCTION) { @@ -5096,8 +5125,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -5251,7 +5280,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } if (opline->op1_type == IS_CV && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + ssa->var_info[ssa_op->op1_def >= 0 ? ssa_op->op1_def : ssa_op->op1_use].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -5289,6 +5318,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } else { op1_info = OP1_INFO(); } + if (ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; + } if (!zend_jit_bind_global(&dasm_state, opline, op1_info)) { goto jit_failure; }