]> granicus.if.org Git - php/commitdiff
Skip "useless" SSA variables for INIT_ARRAY, ADD_ARRAY_ELEMENT, FE_RESET_R
authorDmitry Stogov <dmitry@zend.com>
Tue, 22 Dec 2015 14:35:08 +0000 (17:35 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 22 Dec 2015 14:35:08 +0000 (17:35 +0300)
ext/opcache/Optimizer/zend_inference.c
ext/opcache/Optimizer/zend_ssa.c

index 272d62b51c0d051891dcb6961dac5a31039c67e9..3793ea488429a7b6f59edce2828b886d70d58b24 100644 (file)
@@ -3246,7 +3246,7 @@ static void zend_update_type_info(const zend_op_array *op_array,
                        break;
                case ZEND_INIT_ARRAY:
                case ZEND_ADD_ARRAY_ELEMENT:
-                       if (opline->op1_type == IS_CV) {
+                       if (opline->op1_type == IS_CV && ssa_ops[i].op1_def >= 0) {
                                if (opline->extended_value & ZEND_ARRAY_ELEMENT_REF) {
                                        tmp = (MAY_BE_REF | t1) & ~(MAY_BE_UNDEF|MAY_BE_RC1|MAY_BE_RCN);
                                        if (t1 & MAY_BE_UNDEF) {
@@ -3320,7 +3320,7 @@ static void zend_update_type_info(const zend_op_array *op_array,
 //                     break;
                case ZEND_FE_RESET_R:
                case ZEND_FE_RESET_RW:
-                       if (ssa_ops[i].op1_def) {
+                       if (ssa_ops[i].op1_def >= 0) {
                                tmp = t1;
                                if (t1 & MAY_BE_RCN) {
                                        tmp |= MAY_BE_RC1;
index 27f80f19f237ce928bc5a5c2fcda65409a047b14..1860c7bdd1c31c62d1c8b8c23cbfe88d58633fd9 100644 (file)
@@ -278,7 +278,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
                                case ZEND_ADD_ARRAY_ELEMENT:
                                        ssa_ops[k].result_use = var[EX_VAR_TO_NUM(opline->result.var)];
                                case ZEND_INIT_ARRAY:
-                                       if (opline->op1_type == IS_CV) {
+                                       if ((build_flags & ZEND_SSA_RC_INFERENCE) && opline->op1_type == IS_CV) {
                                                ssa_ops[k].op1_def = ssa_vars_count;
                                                var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count;
                                                ssa_vars_count++;
@@ -288,7 +288,6 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
                                case ZEND_SEND_VAR_NO_REF:
                                case ZEND_SEND_VAR_EX:
                                case ZEND_SEND_REF:
-                               case ZEND_FE_RESET_R:
                                case ZEND_FE_RESET_RW:
 //TODO: ???
                                        if (opline->op1_type == IS_CV) {
@@ -298,6 +297,14 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
                                                //NEW_SSA_VAR(opline->op1.var)
                                        }
                                        break;
+                               case ZEND_FE_RESET_R:
+                                       if ((build_flags & ZEND_SSA_RC_INFERENCE) && opline->op1_type == IS_CV) {
+                                               ssa_ops[k].op1_def = ssa_vars_count;
+                                               var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count;
+                                               ssa_vars_count++;
+                                               //NEW_SSA_VAR(opline->op1.var)
+                                       }
+                                       break;
                                case ZEND_ASSIGN_ADD:
                                case ZEND_ASSIGN_SUB:
                                case ZEND_ASSIGN_MUL: