]> granicus.if.org Git - php/commitdiff
Don't reuse SSA var in UNSET_VAR
authorNikita Popov <nikic@php.net>
Sat, 26 Dec 2015 22:06:56 +0000 (23:06 +0100)
committerNikita Popov <nikic@php.net>
Sat, 26 Dec 2015 22:33:58 +0000 (23:33 +0100)
Instead use the SSA var that UNSET_VAR actually defines. Otherwise
we get issues trying to DCE unsets.

ext/opcache/Optimizer/zend_dfg.c
ext/opcache/Optimizer/zend_inference.c
ext/opcache/Optimizer/zend_ssa.c

index d4fb28378696951830c8e8a411bfc1225bc670fd..7c3e80db1fc4a2c5762d396ccccfdc200342cc7c 100644 (file)
@@ -106,6 +106,9 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg
                                                }
                                                DFG_SET(gen, set_size, j, EX_VAR_TO_NUM(opline->op1.var));
                                                break;
+                                       case ZEND_UNSET_VAR:
+                                               ZEND_ASSERT(opline->extended_value & ZEND_QUICK_SET);
+                                               /* break missing intentionally */
                                        case ZEND_ASSIGN_ADD:
                                        case ZEND_ASSIGN_SUB:
                                        case ZEND_ASSIGN_MUL:
index 730f60343ab5c0ea4a20a963648c599f95dfeab3..8fa9bfdbb5bdd120259ff2b9bba024e50a2f5cb5 100644 (file)
@@ -3299,9 +3299,13 @@ static void zend_update_type_info(const zend_op_array *op_array,
                        }
                        break;
                case ZEND_UNSET_VAR:
-                       if (opline->extended_value & ZEND_QUICK_SET) {
-                               UPDATE_SSA_TYPE((MAY_BE_UNDEF|MAY_BE_RCN), ssa_ops[i].op1_def);
+                       ZEND_ASSERT(opline->extended_value & ZEND_QUICK_SET);
+                       tmp = MAY_BE_UNDEF|MAY_BE_RCN;
+                       if (!op_array->function_name) {
+                               /* In global scope, we know nothing */
+                               tmp |= MAY_BE_REF;
                        }
+                       UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
                        break;
                case ZEND_UNSET_DIM:
                case ZEND_UNSET_OBJ:
index d9e85165d90cd83251906dfe162e98a202365a55..505c0b978fa0ea434f04f184685359768aa21ff4 100644 (file)
@@ -333,7 +333,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
                                case ZEND_UNSET_VAR:
                                        if (opline->extended_value & ZEND_QUICK_SET) {
                                                ssa_ops[k].op1_def = ssa_vars_count;
-                                               var[EX_VAR_TO_NUM(opline->op1.var)] = EX_VAR_TO_NUM(opline->op1.var);
+                                               var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count;
                                                ssa_vars_count++;
                                        }
                                        break;