@@ -1343,9 +1343,38 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr
1343
1343
break ;
1344
1344
}
1345
1345
}
1346
- /* JMPZ(X,L1), JMP(L2) -> JMPZNZ(X,L1,L2) */
1346
+
1347
1347
if (target -> opcode == ZEND_JMP &&
1348
1348
!(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) */
1349
1378
DEL_SOURCE (block , block -> successors [1 ]);
1350
1379
if (last_op -> opcode == ZEND_JMPZ ) {
1351
1380
block -> successors [1 ] = target_block -> successors [0 ];
0 commit comments