1
0
mirror of https://github.com/php/php-src.git synced 2026-04-20 14:31:06 +02:00

JIT: Add option to disable SSA checks

This commit is contained in:
Nikita Popov
2019-10-22 15:32:57 +02:00
parent fe6c420b02
commit ae46df0cb9

View File

@@ -132,6 +132,13 @@ static size_t tsrm_tls_index;
static size_t tsrm_tls_offset;
#endif
/* By default avoid JITing inline handlers if it does not seem profitable due to lack of
* type information. Disabling this option allows testing some JIT handlers in the
* presence of try/catch blocks, which prevent SSA construction. */
#ifndef PROFITABILITY_CHECKS
# define PROFITABILITY_CHECKS 1
#endif
|.type EX, zend_execute_data, FP
|.type OP, zend_op
|.type ZVAL, zval
@@ -3482,7 +3489,7 @@ static int zend_jit_math(dasm_State **Dst, const zend_op *opline, int *opnum, co
uint32_t op1_info, op2_info, res_use_info;
zend_jit_addr op1_addr, op2_addr, res_addr;
if (!ssa->ops || !ssa->var_info) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
@@ -3815,12 +3822,16 @@ static int zend_jit_long_math(dasm_State **Dst, const zend_op *opline, int *opnu
zend_jit_addr op1_addr, op2_addr, res_addr;
int op1_ssa_var, op2_ssa_var;
if (!ssa->ops || !ssa->var_info) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
op1_ssa_var = ssa->ops[opline - op_array->opcodes].op1_use;
op2_ssa_var = ssa->ops[opline - op_array->opcodes].op2_use;
if (ssa->ops) {
op1_ssa_var = ssa->ops[opline - op_array->opcodes].op1_use;
op2_ssa_var = ssa->ops[opline - op_array->opcodes].op2_use;
} else {
op1_ssa_var = op2_ssa_var = -1;
}
op1_info = OP1_INFO();
op2_info = OP2_INFO();
res_use_info = RES_USE_INFO();
@@ -3852,7 +3863,7 @@ static int zend_jit_long_math(dasm_State **Dst, const zend_op *opline, int *opnu
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_RX, (opline+1)->result.var);
res_use_info = -1;
} else {
res_addr = zend_jit_decode_op(op_array, opline->result_type, opline->result, opline, ra, ssa->ops[opline - op_array->opcodes].result_def);
res_addr = zend_jit_decode_op(op_array, opline->result_type, opline->result, opline, ra, ra ? ssa->ops[opline - op_array->opcodes].result_def : -1);
}
if (!zend_jit_long_math_helper(Dst, opline, opline->opcode, op_array, ssa, opline->op1_type, opline->op1, op1_addr, op1_info, op1_ssa_var, opline->op2_type, opline->op2, op2_addr, op2_info, op2_ssa_var, opline->result.var, res_addr, RES_INFO(), res_use_info)) {
@@ -3960,7 +3971,7 @@ static int zend_jit_concat(dasm_State **Dst, const zend_op *opline, int *opnum,
uint32_t op1_info, op2_info;
zend_jit_addr op1_addr, op2_addr, res_addr;
if (!ssa->ops || !ssa->var_info) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
@@ -4591,7 +4602,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, const ze
goto fallback;
}
if (!ssa->ops || !ssa->var_info) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
@@ -4822,11 +4833,11 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, const
goto fallback;
}
if (!ssa->ops || !ssa->var_info) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
op3_ssa_var = ssa->ops[opline - op_array->opcodes + 1].op1_use;
op3_ssa_var = ssa->ops ? ssa->ops[opline - op_array->opcodes + 1].op1_use : -1;
op1_info = OP1_INFO();
op2_info = OP2_INFO();
@@ -5052,12 +5063,16 @@ static int zend_jit_assign_op(dasm_State **Dst, const zend_op *opline, const zen
goto fallback;
}
if (!ssa->ops || !ssa->var_info) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
op1_ssa_var = ssa->ops[opline - op_array->opcodes].op1_use;
op2_ssa_var = ssa->ops[opline - op_array->opcodes].op2_use;
if (ssa->ops) {
op1_ssa_var = ssa->ops[opline - op_array->opcodes].op1_use;
op2_ssa_var = ssa->ops[opline - op_array->opcodes].op2_use;
} else {
op1_ssa_var = op2_ssa_var = -1;
}
op1_info = OP1_INFO();
op2_info = OP2_INFO();
@@ -6772,7 +6787,11 @@ static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_o
uint32_t op1_info, op2_info;
zend_jit_addr op1_addr, op2_addr, res_addr;
if (opline->op1_type != IS_CV || !ssa->ops || !ssa->var_info) {
if (opline->op1_type != IS_CV) {
goto fallback;
}
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
@@ -8383,11 +8402,15 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
uint32_t op1_info;
zend_jit_addr op1_addr, ret_addr;
if (op_array->type == ZEND_EVAL_CODE || !op_array->function_name || !ssa->ops || !ssa->var_info) {
if (op_array->type == ZEND_EVAL_CODE || !op_array->function_name) {
// TODO: support for top-level code
return zend_jit_tail_handler(Dst, opline);
}
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
return zend_jit_tail_handler(Dst, opline);
}
op1_info = OP1_INFO();
op1_addr = zend_jit_decode_op(op_array, opline->op1_type, opline->op1, opline, ra, ra ? ssa->ops[opline - op_array->opcodes].op1_use : -1);
if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) {
@@ -8511,7 +8534,7 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, cons
uint32_t op1_info, op2_info, res_info;
zend_jit_addr op1_addr, orig_op1_addr, op2_addr, res_addr;
if (!ssa->ops || !ssa->var_info) {
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
@@ -8702,11 +8725,15 @@ static int zend_jit_isset_isempty_dim(dasm_State **Dst, const zend_op *opline, i
uint32_t op1_info, op2_info;
zend_jit_addr op1_addr, op2_addr, res_addr;
if (!ssa->ops || !ssa->var_info || (opline->extended_value & ZEND_ISEMPTY)) {
if ((opline->extended_value & ZEND_ISEMPTY)) {
// TODO: support for empty() ???
goto fallback;
}
if (PROFITABILITY_CHECKS && (!ssa->ops || !ssa->var_info)) {
goto fallback;
}
op1_info = OP1_INFO();
op2_info = OP2_INFO();
if (((opline+1)->opcode == ZEND_JMPZ ||