Skip to content

Commit dc3c8c7

Browse files
committed
Prefer optimization without JMPZNZ instruction
1 parent d44cf9b commit dc3c8c7

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

ext/opcache/Optimizer/block_pass.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1343,9 +1343,38 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr
13431343
break;
13441344
}
13451345
}
1346-
/* JMPZ(X,L1), JMP(L2) -> JMPZNZ(X,L1,L2) */
1346+
13471347
if (target->opcode == ZEND_JMP &&
13481348
!(target_block->flags & ZEND_BB_PROTECTED)) {
1349+
1350+
if (!(target_block->flags & ZEND_BB_TARGET)) {
1351+
int next = (target_block - blocks) + 1;
1352+
1353+
while (next < cfg->blocks_count && !(blocks[next].flags & ZEND_BB_REACHABLE)) {
1354+
/* find used one */
1355+
next++;
1356+
}
1357+
if (next < cfg->blocks_count &&
1358+
block->successors[0] == next) {
1359+
/* JMPZ(X,L1) JMP(L2) L1: -> JMPNZ(X,L2) NOP*/
1360+
1361+
last_op->opcode = INV_COND(last_op->opcode);
1362+
1363+
DEL_SOURCE(block, block->successors[1]);
1364+
block->successors[0] = target_block->successors[0];
1365+
block->successors[1] = next;
1366+
ADD_SOURCE(block, block->successors[1]);
1367+
1368+
target_block->flags &= ~ZEND_BB_REACHABLE;
1369+
MAKE_NOP(target);
1370+
1371+
blocks[next].flags |= ZEND_BB_FOLLOW;
1372+
1373+
break;
1374+
}
1375+
}
1376+
1377+
/* JMPZ(X,L1), JMP(L2) -> JMPZNZ(X,L1,L2) */
13491378
DEL_SOURCE(block, block->successors[1]);
13501379
if (last_op->opcode == ZEND_JMPZ) {
13511380
block->successors[1] = target_block->successors[0];

0 commit comments

Comments
 (0)