]> granicus.if.org Git - php/commitdiff
Fix JMPZ+JMP => NOP+JMP optimization
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 10 Apr 2017 20:09:34 +0000 (22:09 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 10 Apr 2017 20:09:34 +0000 (22:09 +0200)
ext/opcache/Optimizer/block_pass.c
ext/opcache/Optimizer/pass2.c

index 413b8b10e2cb582f83495fa19dca4609c6461ef9..acce8b70d051db2b60829565e9a78f476f410e8b 100644 (file)
@@ -1462,7 +1462,9 @@ static void zend_jmp_optimization(zend_code_block *block, zend_op_array *op_arra
                                                break;
                                        }
                                }
-                               if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) {
+                               if (last_op->op1_type == IS_CV) {
+                                       break;
+                               } else if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) {
                                        last_op->opcode = ZEND_FREE;
                                        last_op->op2.num = 0;
                                        block->op2_to = NULL;
index 4abaa30fbc03ccd57660e073c2e261b2606d3fcd..098be5146bbd7d3700bd70c0ba5b8cb6444c47a6 100644 (file)
@@ -156,7 +156,14 @@ void zend_optimizer_pass2(zend_op_array *op_array)
                                        /* JMPNZ(X, L1), JMP(L2) => JMPZNZ(X, L2, L1) */
                                        if (ZEND_OP2(opline).opline_num == ZEND_OP1(opline + 1).opline_num) {
                                                /* JMPZ(X, L1), JMP(L1) => NOP, JMP(L1) */
-                                               MAKE_NOP(opline);
+                                               if (opline->op1_type == IS_CV) {
+                                                       break;
+                                               } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+                                                       opline->opcode = ZEND_FREE;
+                                                       opline->op2.num = 0;
+                                               } else {
+                                                       MAKE_NOP(opline);
+                                               }
                                        } else {
                                                if (opline->opcode == ZEND_JMPZ) {
                                                        opline->extended_value = ZEND_OP1(opline + 1).opline_num;