mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
Extract common replacement login in pass1
The replace const or replace with QM_ASSIGN pattern is common to all constant folding, extract it into a function.
This commit is contained in:
parent
28287572a1
commit
f6dce4a8ca
1 changed files with 28 additions and 103 deletions
|
@ -35,6 +35,17 @@
|
||||||
#include "zend_execute.h"
|
#include "zend_execute.h"
|
||||||
#include "zend_vm.h"
|
#include "zend_vm.h"
|
||||||
|
|
||||||
|
static void replace_by_const_or_qm_assign(zend_op_array *op_array, zend_op *opline, zval *result) {
|
||||||
|
if (zend_optimizer_replace_by_const(op_array, opline + 1, opline->result_type, opline->result.var, result)) {
|
||||||
|
MAKE_NOP(opline);
|
||||||
|
} else {
|
||||||
|
opline->opcode = ZEND_QM_ASSIGN;
|
||||||
|
opline->extended_value = 0;
|
||||||
|
SET_UNUSED(opline->op2);
|
||||||
|
zend_optimizer_update_op1_const(op_array, opline, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
||||||
{
|
{
|
||||||
zend_op *opline = op_array->opcodes;
|
zend_op *opline = op_array->opcodes;
|
||||||
|
@ -46,21 +57,13 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
||||||
switch (opline->opcode) {
|
switch (opline->opcode) {
|
||||||
case ZEND_CONCAT:
|
case ZEND_CONCAT:
|
||||||
case ZEND_FAST_CONCAT:
|
case ZEND_FAST_CONCAT:
|
||||||
if (opline->op1_type == IS_CONST) {
|
if (opline->op1_type == IS_CONST && Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_STRING) {
|
||||||
if (Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_STRING) {
|
convert_to_string(&ZEND_OP1_LITERAL(opline));
|
||||||
convert_to_string(&ZEND_OP1_LITERAL(opline));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (opline->op2_type == IS_CONST) {
|
if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) {
|
||||||
if (Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) {
|
convert_to_string(&ZEND_OP2_LITERAL(opline));
|
||||||
convert_to_string(&ZEND_OP2_LITERAL(opline));
|
|
||||||
}
|
|
||||||
if (opline->op1_type == IS_CONST) {
|
|
||||||
goto constant_binary_op;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
ZEND_FALLTHROUGH;
|
||||||
|
|
||||||
case ZEND_ADD:
|
case ZEND_ADD:
|
||||||
case ZEND_SUB:
|
case ZEND_SUB:
|
||||||
case ZEND_MUL:
|
case ZEND_MUL:
|
||||||
|
@ -87,17 +90,10 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
||||||
/* binary operation with constant operands */
|
/* binary operation with constant operands */
|
||||||
zval result;
|
zval result;
|
||||||
|
|
||||||
constant_binary_op:
|
|
||||||
if (zend_optimizer_eval_binary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) {
|
if (zend_optimizer_eval_binary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) {
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
||||||
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &result)) {
|
replace_by_const_or_qm_assign(op_array, opline, &result);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -116,13 +112,7 @@ constant_binary_op:
|
||||||
|
|
||||||
if (zend_optimizer_eval_cast(&result, opline->extended_value, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
|
if (zend_optimizer_eval_cast(&result, opline->extended_value, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, opline->result_type, opline->result.var, &result)) {
|
replace_by_const_or_qm_assign(op_array, opline, &result);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &result);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,12 +126,7 @@ constant_binary_op:
|
||||||
|
|
||||||
if (zend_optimizer_eval_unary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
|
if (zend_optimizer_eval_unary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &result)) {
|
replace_by_const_or_qm_assign(op_array, opline, &result);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -161,14 +146,7 @@ constant_binary_op:
|
||||||
if ((offset = zend_get_constant_str("__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1)) != NULL) {
|
if ((offset = zend_get_constant_str("__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1)) != NULL) {
|
||||||
|
|
||||||
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, offset)) {
|
replace_by_const_or_qm_assign(op_array, opline, offset);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, offset);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EG(current_execute_data) = orig_execute_data;
|
EG(current_execute_data) = orig_execute_data;
|
||||||
break;
|
break;
|
||||||
|
@ -188,14 +166,7 @@ constant_binary_op:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &c)) {
|
replace_by_const_or_qm_assign(op_array, opline, &c);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -258,15 +229,7 @@ constant_binary_op:
|
||||||
MAKE_NOP((opline - 1));
|
MAKE_NOP((opline - 1));
|
||||||
}
|
}
|
||||||
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
literal_dtor(&ZEND_OP2_LITERAL(opline));
|
||||||
|
replace_by_const_or_qm_assign(op_array, opline, &t);
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &t)) {
|
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,14 +330,7 @@ constant_binary_op:
|
||||||
MAKE_NOP(init_opline);
|
MAKE_NOP(init_opline);
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
||||||
MAKE_NOP(send1_opline);
|
MAKE_NOP(send1_opline);
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) {
|
replace_by_const_or_qm_assign(op_array, opline, &t);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
zend_string_release_ex(lc_name, 0);
|
zend_string_release_ex(lc_name, 0);
|
||||||
break;
|
break;
|
||||||
|
@ -408,14 +364,7 @@ constant_binary_op:
|
||||||
MAKE_NOP(init_opline);
|
MAKE_NOP(init_opline);
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
||||||
MAKE_NOP(send1_opline);
|
MAKE_NOP(send1_opline);
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) {
|
replace_by_const_or_qm_assign(op_array, opline, &t);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &t);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
} else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "constant")) {
|
} else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "constant")) {
|
||||||
zval t;
|
zval t;
|
||||||
|
@ -425,14 +374,7 @@ constant_binary_op:
|
||||||
MAKE_NOP(init_opline);
|
MAKE_NOP(init_opline);
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
||||||
MAKE_NOP(send1_opline);
|
MAKE_NOP(send1_opline);
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) {
|
replace_by_const_or_qm_assign(op_array, opline, &t);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */
|
/* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */
|
||||||
|
@ -448,14 +390,7 @@ constant_binary_op:
|
||||||
MAKE_NOP(init_opline);
|
MAKE_NOP(init_opline);
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
literal_dtor(&ZEND_OP1_LITERAL(send1_opline));
|
||||||
MAKE_NOP(send1_opline);
|
MAKE_NOP(send1_opline);
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) {
|
replace_by_const_or_qm_assign(op_array, opline, &t);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
opline->extended_value = 0;
|
|
||||||
SET_UNUSED(opline->op2);
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &t);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
zend_string_release_ex(dirname, 0);
|
zend_string_release_ex(dirname, 0);
|
||||||
}
|
}
|
||||||
|
@ -472,12 +407,7 @@ constant_binary_op:
|
||||||
|
|
||||||
if (zend_optimizer_eval_strlen(&t, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
|
if (zend_optimizer_eval_strlen(&t, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &t)) {
|
replace_by_const_or_qm_assign(op_array, opline, &t);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -489,12 +419,7 @@ constant_binary_op:
|
||||||
}
|
}
|
||||||
ZVAL_TRUE(&c);
|
ZVAL_TRUE(&c);
|
||||||
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
||||||
if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &c)) {
|
replace_by_const_or_qm_assign(op_array, opline, &c);
|
||||||
MAKE_NOP(opline);
|
|
||||||
} else {
|
|
||||||
opline->opcode = ZEND_QM_ASSIGN;
|
|
||||||
zend_optimizer_update_op1_const(op_array, opline, &c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ZEND_DECLARE_CONST:
|
case ZEND_DECLARE_CONST:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue