diff options
author | Dmitry Stogov <dmitry@zend.com> | 2015-11-17 07:15:35 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2015-11-17 07:15:35 +0300 |
commit | 843c1657358e7dab48fb8fa66574b48eb870989b (patch) | |
tree | 54c517fc59624ab5bfde989f1ab4f232706a4d4d /ext/opcache/Optimizer/nop_removal.c | |
parent | e4173bd15c0860a2d9f6a6b0c4844e939b98d523 (diff) | |
download | php-git-843c1657358e7dab48fb8fa66574b48eb870989b.tar.gz |
Don't undo/redo "pass two" for jump targets in opcache optimizer.
Diffstat (limited to 'ext/opcache/Optimizer/nop_removal.c')
-rw-r--r-- | ext/opcache/Optimizer/nop_removal.c | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/ext/opcache/Optimizer/nop_removal.c b/ext/opcache/Optimizer/nop_removal.c index 75e84c7644..52967d16fd 100644 --- a/ext/opcache/Optimizer/nop_removal.c +++ b/ext/opcache/Optimizer/nop_removal.c @@ -45,9 +45,9 @@ void zend_optimizer_nop_removal(zend_op_array *op_array) for (opline = op_array->opcodes; opline < end; opline++) { /* Kill JMP-over-NOP-s */ - if (opline->opcode == ZEND_JMP && ZEND_OP1(opline).opline_num > i) { + if (opline->opcode == ZEND_JMP && ZEND_OP1_JMP_ADDR(opline) > op_array->opcodes + i) { /* check if there are only NOPs under the branch */ - zend_op *target = op_array->opcodes + ZEND_OP1(opline).opline_num - 1; + zend_op *target = ZEND_OP1_JMP_ADDR(opline) - 1; while (target->opcode == ZEND_NOP) { target--; @@ -63,7 +63,37 @@ void zend_optimizer_nop_removal(zend_op_array *op_array) shift++; } else { if (shift) { - op_array->opcodes[new_count] = *opline; + zend_op *new_opline = op_array->opcodes + new_count; + + *new_opline = *opline; + switch (new_opline->opcode) { + case ZEND_JMP: + case ZEND_FAST_CALL: + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: + ZEND_SET_OP_JMP_ADDR(new_opline, new_opline->op1, ZEND_OP1_JMP_ADDR(opline)); + break; + case ZEND_JMPZNZ: + new_opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, new_opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)); + /* break missing intentionally */ + case ZEND_JMPZ: + case ZEND_JMPNZ: + case ZEND_JMPZ_EX: + case ZEND_JMPNZ_EX: + case ZEND_FE_RESET_R: + case ZEND_FE_RESET_RW: + case ZEND_NEW: + case ZEND_JMP_SET: + case ZEND_COALESCE: + case ZEND_ASSERT_CHECK: + ZEND_SET_OP_JMP_ADDR(new_opline, new_opline->op2, ZEND_OP2_JMP_ADDR(opline)); + break; + case ZEND_FE_FETCH_R: + case ZEND_FE_FETCH_RW: + case ZEND_CATCH: + new_opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, new_opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)); + break; + } } new_count++; } @@ -80,8 +110,11 @@ void zend_optimizer_nop_removal(zend_op_array *op_array) case ZEND_FAST_CALL: case ZEND_DECLARE_ANON_CLASS: case ZEND_DECLARE_ANON_INHERITED_CLASS: - ZEND_OP1(opline).opline_num -= shiftlist[ZEND_OP1(opline).opline_num]; + ZEND_SET_OP_JMP_ADDR(opline, opline->op1, ZEND_OP1_JMP_ADDR(opline) - shiftlist[ZEND_OP1_JMP_ADDR(opline) - op_array->opcodes]); break; + case ZEND_JMPZNZ: + opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) - shiftlist[ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)]); + /* break missing intentionally */ case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -92,18 +125,12 @@ void zend_optimizer_nop_removal(zend_op_array *op_array) case ZEND_JMP_SET: case ZEND_COALESCE: case ZEND_ASSERT_CHECK: - ZEND_OP2(opline).opline_num -= shiftlist[ZEND_OP2(opline).opline_num]; + ZEND_SET_OP_JMP_ADDR(opline, opline->op2, ZEND_OP2_JMP_ADDR(opline) - shiftlist[ZEND_OP2_JMP_ADDR(opline) - op_array->opcodes]); break; case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: - opline->extended_value -= shiftlist[opline->extended_value]; - break; - case ZEND_JMPZNZ: - ZEND_OP2(opline).opline_num -= shiftlist[ZEND_OP2(opline).opline_num]; - opline->extended_value -= shiftlist[opline->extended_value]; - break; case ZEND_CATCH: - opline->extended_value -= shiftlist[opline->extended_value]; + opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) - shiftlist[ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)]); break; } } |