Skip to content

Commit 6f950e8

Browse files
committed
Fix JMPZ+JMP => NOP+JMP optimization
1 parent 8c53c34 commit 6f950e8

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

ext/opcache/Optimizer/block_pass.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1462,7 +1462,9 @@ static void zend_jmp_optimization(zend_code_block *block, zend_op_array *op_arra
14621462
break;
14631463
}
14641464
}
1465-
if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) {
1465+
if (last_op->op1_type == IS_CV) {
1466+
break;
1467+
} else if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) {
14661468
last_op->opcode = ZEND_FREE;
14671469
last_op->op2.num = 0;
14681470
block->op2_to = NULL;

ext/opcache/Optimizer/pass2.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,14 @@ void zend_optimizer_pass2(zend_op_array *op_array)
156156
/* JMPNZ(X, L1), JMP(L2) => JMPZNZ(X, L2, L1) */
157157
if (ZEND_OP2(opline).opline_num == ZEND_OP1(opline + 1).opline_num) {
158158
/* JMPZ(X, L1), JMP(L1) => NOP, JMP(L1) */
159-
MAKE_NOP(opline);
159+
if (opline->op1_type == IS_CV) {
160+
break;
161+
} else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
162+
opline->opcode = ZEND_FREE;
163+
opline->op2.num = 0;
164+
} else {
165+
MAKE_NOP(opline);
166+
}
160167
} else {
161168
if (opline->opcode == ZEND_JMPZ) {
162169
opline->extended_value = ZEND_OP1(opline + 1).opline_num;

0 commit comments

Comments
 (0)