Skip to content

Commit 0698bf7

Browse files
committed
Add helper for convertion to CHECK_VAR/FREE/NOP
This is a recurring pattern whenever an instruction with an operand is deleted.
1 parent 7d2f2a1 commit 0698bf7

File tree

5 files changed

+30
-59
lines changed

5 files changed

+30
-59
lines changed

Zend/Optimizer/block_pass.c

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,14 +1327,8 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr
13271327
follow_block = get_follow_block(cfg, block, 1, opt_count);
13281328
if (target_block == follow_block) {
13291329
/* L: JMP[N]Z(X, L+1) -> NOP or FREE(X) */
1330-
if (last_op->op1_type == IS_CV) {
1331-
last_op->opcode = ZEND_CHECK_VAR;
1332-
last_op->op2.num = 0;
1333-
} else if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) {
1334-
last_op->opcode = ZEND_FREE;
1335-
last_op->op2.num = 0;
1336-
} else {
1337-
MAKE_NOP(last_op);
1330+
zend_optimizer_convert_to_free_op1(op_array, last_op);
1331+
if (last_op->opcode == ZEND_NOP) {
13381332
block->len--;
13391333
}
13401334
block->successors_count = 1;
@@ -1344,14 +1338,8 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr
13441338
if (target->opcode == ZEND_JMP) {
13451339
if (block->successors[0] == follow_block->successors[0]) {
13461340
/* JMPZ(X,L1), JMP(L1) -> NOP, JMP(L1) */
1347-
if (last_op->op1_type == IS_CV) {
1348-
last_op->opcode = ZEND_CHECK_VAR;
1349-
last_op->op2.num = 0;
1350-
} else if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) {
1351-
last_op->opcode = ZEND_FREE;
1352-
last_op->op2.num = 0;
1353-
} else {
1354-
MAKE_NOP(last_op);
1341+
zend_optimizer_convert_to_free_op1(op_array, last_op);
1342+
if (last_op->opcode == ZEND_NOP) {
13551343
block->len--;
13561344
}
13571345
block->successors[0] = follow_block - cfg->blocks;
@@ -1704,18 +1692,7 @@ static void zend_t_usage(zend_cfg *cfg, zend_op_array *op_array, zend_bitset use
17041692
case ZEND_QM_ASSIGN:
17051693
case ZEND_BOOL:
17061694
case ZEND_BOOL_NOT:
1707-
if (opline->op1_type == IS_CV) {
1708-
opline->opcode = ZEND_CHECK_VAR;
1709-
SET_UNUSED(opline->result);
1710-
} else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
1711-
opline->opcode = ZEND_FREE;
1712-
SET_UNUSED(opline->result);
1713-
} else {
1714-
if (opline->op1_type == IS_CONST) {
1715-
literal_dtor(&ZEND_OP1_LITERAL(opline));
1716-
}
1717-
MAKE_NOP(opline);
1718-
}
1695+
zend_optimizer_convert_to_free_op1(op_array, opline);
17191696
break;
17201697
case ZEND_JMPZ_EX:
17211698
case ZEND_JMPNZ_EX:

Zend/Optimizer/optimize_func_calls.c

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ typedef struct _optimizer_call_info {
4343
uint32_t func_arg_num;
4444
} optimizer_call_info;
4545

46-
static void zend_delete_call_instructions(zend_op *opline)
46+
static void zend_delete_call_instructions(zend_op_array *op_array, zend_op *opline)
4747
{
4848
int call = 0;
4949

@@ -73,17 +73,7 @@ static void zend_delete_call_instructions(zend_op *opline)
7373
case ZEND_SEND_VAL:
7474
case ZEND_SEND_VAR:
7575
if (call == 0) {
76-
if (opline->op1_type == IS_CONST) {
77-
MAKE_NOP(opline);
78-
} else if (opline->op1_type == IS_CV) {
79-
opline->opcode = ZEND_CHECK_VAR;
80-
opline->extended_value = 0;
81-
opline->result.var = 0;
82-
} else {
83-
opline->opcode = ZEND_FREE;
84-
opline->extended_value = 0;
85-
opline->result.var = 0;
86-
}
76+
zend_optimizer_convert_to_free_op1(op_array, opline);
8777
}
8878
break;
8979
}
@@ -144,7 +134,7 @@ static void zend_try_inline_call(zend_op_array *op_array, zend_op *fcall, zend_o
144134
MAKE_NOP(opline);
145135
}
146136

147-
zend_delete_call_instructions(opline-1);
137+
zend_delete_call_instructions(op_array, opline-1);
148138
}
149139
}
150140
}

Zend/Optimizer/pass3.c

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,7 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx)
116116
(opline-1)->opcode == ZEND_JMPNZ)) {
117117
if (ZEND_OP2_JMP_ADDR(opline-1) == target) {
118118
/* JMPZ(X,L1), JMP(L1) -> NOP, JMP(L1) */
119-
if ((opline-1)->op1_type == IS_CV) {
120-
(opline-1)->opcode = ZEND_CHECK_VAR;
121-
(opline-1)->op2.num = 0;
122-
} else if ((opline-1)->op1_type & (IS_TMP_VAR|IS_VAR)) {
123-
(opline-1)->opcode = ZEND_FREE;
124-
(opline-1)->op2.num = 0;
125-
} else {
126-
MAKE_NOP(opline-1);
127-
}
119+
zend_optimizer_convert_to_free_op1(op_array, opline - 1);
128120
} else {
129121
/* JMPZ(X,L1), JMP(L2) -> JMPZNZ(X,L1,L2) */
130122
if ((opline-1)->opcode == ZEND_JMPZ) {
@@ -194,15 +186,7 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx)
194186

195187
/* convert L: JMPZ L+1 to NOP */
196188
if (target == opline + 1) {
197-
if (opline->op1_type == IS_CV) {
198-
opline->opcode = ZEND_CHECK_VAR;
199-
opline->op2.num = 0;
200-
} else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
201-
opline->opcode = ZEND_FREE;
202-
opline->op2.num = 0;
203-
} else {
204-
MAKE_NOP(opline);
205-
}
189+
zend_optimizer_convert_to_free_op1(op_array, opline);
206190
}
207191
break;
208192

Zend/Optimizer/zend_optimizer.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,25 @@ bool zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zva
208208
return 0;
209209
}
210210

211+
void zend_optimizer_convert_to_free_op1(zend_op_array *op_array, zend_op *opline)
212+
{
213+
if (opline->op1_type == IS_CV) {
214+
opline->opcode = ZEND_CHECK_VAR;
215+
SET_UNUSED(opline->op2);
216+
SET_UNUSED(opline->result);
217+
opline->extended_value = 0;
218+
} else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
219+
opline->opcode = ZEND_FREE;
220+
SET_UNUSED(opline->op2);
221+
SET_UNUSED(opline->result);
222+
opline->extended_value = 0;
223+
} else {
224+
ZEND_ASSERT(opline->op1_type == IS_CONST);
225+
literal_dtor(&ZEND_OP1_LITERAL(opline));
226+
MAKE_NOP(opline);
227+
}
228+
}
229+
211230
int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv)
212231
{
213232
int i = op_array->last_literal;

Zend/Optimizer/zend_optimizer_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ static inline bool zend_optimizer_is_loop_var_free(const zend_op *opline) {
7676
|| (opline->opcode == ZEND_FREE && opline->extended_value == ZEND_FREE_SWITCH);
7777
}
7878

79+
void zend_optimizer_convert_to_free_op1(zend_op_array *op_array, zend_op *opline);
7980
int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv);
8081
bool zend_optimizer_get_persistent_constant(zend_string *name, zval *result, int copy);
8182
void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* value);

0 commit comments

Comments
 (0)