com php-src: Optimize code generated for "while" and "for" loops. Eliminate one JMP opcode for each loop iteration.: Zend/zend_compile. c

From: Date: Mon, 19 Jan 2015 10:27:44 +0000
Subject: com php-src: Optimize code generated for "while" and "for" loops. Eliminate one JMP opcode for each loop iteration.: Zend/zend_compile. c
Groups: php.cvs 
Request: Send a blank email to [email protected] to get a copy of this message
Commit:    2efa53649e50ea180e3214a608e8777e80777e9f
Author:    Dmitry Stogov <[email protected]>         Mon, 19 Jan 2015 13:27:44 +0300
Parents:   b33629f21253b106157e8a3f24b376a4aadd92f0
Branches:  master

Link:       http://git.php.net/?p=php-src.git;a=commitdiff;h=2efa53649e50ea180e3214a608e8777e80777e9f

Log:
Optimize code generated for "while" and "for" loops.
Eliminate one JMP opcode for each loop iteration.

Changed paths:
  M  Zend/zend_compile.c


Diff:
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 1a7f4d0..7b2ac28 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);
 }



Thread (1 message)

  • Dmitry Stogov
« previous php.cvs (#84173) next »