From: Dmitry Stogov Date: Mon, 19 Jan 2015 10:27:44 +0000 (+0300) Subject: Optimize code generated for "while" and "for" loops. X-Git-Tag: PRE_PHP7_REMOVALS~25^2~92 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2efa53649e50ea180e3214a608e8777e80777e9f;p=php Optimize code generated for "while" and "for" loops. Eliminate one JMP opcode for each loop iteration. --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1a7f4d0bc9..7b2ac281f3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3251,23 +3251,23 @@ void zend_compile_while(zend_ast *ast) /* {{{ */ { zend_ast *cond_ast = ast->child[0]; zend_ast *stmt_ast = ast->child[1]; - znode cond_node; - uint32_t opnum_start, opnum_jmpz; + uint32_t opnum_start, opnum_jmp, opnum_cond; - opnum_start = get_next_op_number(CG(active_op_array)); - zend_compile_expr(&cond_node, cond_ast); + opnum_jmp = zend_emit_jump(0); - opnum_jmpz = zend_emit_cond_jump(ZEND_JMPZ, &cond_node, 0); zend_begin_loop(); + opnum_start = get_next_op_number(CG(active_op_array)); zend_compile_stmt(stmt_ast); - zend_emit_jump(opnum_start); + opnum_cond = get_next_op_number(CG(active_op_array)); + zend_update_jump_target(opnum_jmp, opnum_cond); + zend_compile_expr(&cond_node, cond_ast); - zend_update_jump_target_to_next(opnum_jmpz); + zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, opnum_start); - zend_end_loop(opnum_start, 0); + zend_end_loop(opnum_cond, 0); } /* }}} */ @@ -3323,27 +3323,27 @@ void zend_compile_for(zend_ast *ast) /* {{{ */ zend_ast *stmt_ast = ast->child[3]; znode result; - uint32_t opnum_cond, opnum_jmpz, opnum_loop; + uint32_t opnum_start, opnum_cond, opnum_jmp, opnum_loop; zend_compile_expr_list(&result, init_ast); zend_do_free(&result); - opnum_cond = get_next_op_number(CG(active_op_array)); - zend_compile_expr_list(&result, cond_ast); - zend_do_extended_info(); + opnum_jmp = zend_emit_jump(0); - opnum_jmpz = zend_emit_cond_jump(ZEND_JMPZ, &result, 0); zend_begin_loop(); + opnum_start = get_next_op_number(CG(active_op_array)); zend_compile_stmt(stmt_ast); opnum_loop = get_next_op_number(CG(active_op_array)); zend_compile_expr_list(&result, loop_ast); zend_do_free(&result); - zend_emit_jump(opnum_cond); + zend_update_jump_target_to_next(opnum_jmp); + zend_compile_expr_list(&result, cond_ast); + zend_do_extended_info(); - zend_update_jump_target_to_next(opnum_jmpz); + zend_emit_cond_jump(ZEND_JMPNZ, &result, opnum_start); zend_end_loop(opnum_loop, 0); }