]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.0' into PHP-7.1
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 10 Apr 2017 20:11:47 +0000 (22:11 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 10 Apr 2017 20:11:47 +0000 (22:11 +0200)
1  2 
ext/opcache/Optimizer/block_pass.c
ext/opcache/Optimizer/pass2.c

index 38c2ecb12440850ce63fd4c206f3b15ce9c67779,acce8b70d051db2b60829565e9a78f476f410e8b..bf411f4e77b4f3e0f34174808e32eadd2237d04c
@@@ -1173,16 -1445,33 +1173,19 @@@ static void zend_jmp_optimization(zend_
                                break;
                        }
  
 -                      if (block->op2_to == block->follow_to) {
 -                              /* L: JMPZ(X, L+1) -> NOP or FREE(X) */
 -
 -                              if (last_op->op1_type == IS_VAR) {
 -                                      zend_op **Tsource = cfg->Tsource;
 -                                      zend_op *src = VAR_SOURCE(last_op->op1);
 +                      if (block->successors[0] == block->successors[1]) {
 +                              /* L: JMP[N]Z(X, L+1) -> NOP or FREE(X) */
  
-                               if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) {
 -                                      if (src &&
 -                                          src->opcode != ZEND_FETCH_R &&
 -                                          src->opcode != ZEND_FETCH_DIM_R &&
 -                                          src->opcode != ZEND_FETCH_OBJ_R) {
 -                                              ZEND_RESULT_TYPE(src) |= EXT_TYPE_UNUSED;
 -                                              MAKE_NOP(last_op);
 -                                              block->op2_to = NULL;
 -                                              break;
 -                                      }
 -                              }
+                               if (last_op->op1_type == IS_CV) {
 -                                      break;
++                                      last_op->opcode = ZEND_CHECK_VAR;
++                                      last_op->op2.num = 0;
+                               } 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;
                                } else {
                                        MAKE_NOP(last_op);
 -                                      block->op2_to = NULL;
                                }
 +                              block->successors[1] = -1;
                                break;
                        }
  
index 41ab7c60457a4a9771e77b4298b8895c7ea005f5,098be5146bbd7d3700bd70c0ba5b8cb6444c47a6..d592938256d6137c63686e7ad7863041663651d3
@@@ -174,15 -154,22 +174,23 @@@ void zend_optimizer_pass2(zend_op_arra
                                if ((opline + 1)->opcode == ZEND_JMP) {
                                        /* JMPZ(X, L1), JMP(L2) => JMPZNZ(X, L1, L2) */
                                        /* JMPNZ(X, L1), JMP(L2) => JMPZNZ(X, L2, L1) */
 -                                      if (ZEND_OP2(opline).opline_num == ZEND_OP1(opline + 1).opline_num) {
 +                                      if (ZEND_OP2_JMP_ADDR(opline) == ZEND_OP1_JMP_ADDR(opline + 1)) {
                                                /* JMPZ(X, L1), JMP(L1) => NOP, JMP(L1) */
-                                               MAKE_NOP(opline);
+                                               if (opline->op1_type == IS_CV) {
 -                                                      break;
++                                                      opline->opcode = ZEND_CHECK_VAR;
++                                                      opline->op2.num = 0;
+                                               } 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;
 +                                                      opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, ZEND_OP1_JMP_ADDR(opline + 1));
                                                } else {
 -                                                      opline->extended_value = ZEND_OP2(opline).opline_num;
 -                                                      COPY_NODE(opline->op2, (opline + 1)->op1);
 +                                                      opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, ZEND_OP2_JMP_ADDR(opline));
 +                                                      ZEND_SET_OP_JMP_ADDR(opline, opline->op2, ZEND_OP1_JMP_ADDR(opline + 1));
                                                }
                                                opline->opcode = ZEND_JMPZNZ;
                                        }