diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-01-17 16:07:17 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-01-21 11:47:27 +0100 |
commit | 3269e884686ada59407e14db812bfb42d59d2f1c (patch) | |
tree | 340b3f09b122a3e1c676f02f0f729bae40c450fd /ext/opcache/Optimizer/dce.c | |
parent | 276d3a7d159964d225c8e7ff75debdd9c359eee2 (diff) | |
download | php-git-3269e884686ada59407e14db812bfb42d59d2f1c.tar.gz |
Implement single-pass live range calculation
Instead of interleaving creation of live-ranges with the main
compiler code, compute them in a separate pass over the opcodes
as part of pass_two. Additionally, do not keep live ranges
synchronized during optimization in opcache and instead use the
same mechanism to recompute them after optimization.
Diffstat (limited to 'ext/opcache/Optimizer/dce.c')
-rw-r--r-- | ext/opcache/Optimizer/dce.c | 77 |
1 files changed, 0 insertions, 77 deletions
diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index 95755d559f..a633e9ddf6 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -478,79 +478,6 @@ static inline zend_bool may_break_varargs(const zend_op_array *op_array, const z return 0; } -static void dce_live_ranges(context *ctx, zend_op_array *op_array, zend_ssa *ssa) -{ - int i = 0; - int j = 0; - zend_live_range *live_range = op_array->live_range; - - while (i < op_array->last_live_range) { - if ((live_range->var & ZEND_LIVE_MASK) != ZEND_LIVE_TMPVAR) { - /* keep */ - j++; - } else { - uint32_t var = live_range->var & ~ZEND_LIVE_MASK; - uint32_t def = live_range->start - 1; - - if ((op_array->opcodes[def].result_type == IS_UNUSED) && - (UNEXPECTED(op_array->opcodes[def].opcode == ZEND_EXT_STMT) || - UNEXPECTED(op_array->opcodes[def].opcode == ZEND_EXT_FCALL_END))) { - def--; - } - - if (op_array->opcodes[def].result_type == IS_UNUSED) { - if (op_array->opcodes[def].opcode == ZEND_DO_FCALL) { - /* constructor call */ - do { - def--; - if ((op_array->opcodes[def].result_type & (IS_TMP_VAR|IS_VAR)) - && op_array->opcodes[def].result.var == var) { - ZEND_ASSERT(op_array->opcodes[def].opcode == ZEND_NEW); - break; - } - } while (def > 0); - } else if (op_array->opcodes[def].opcode == ZEND_OP_DATA) { - def--; - } - } - -#if ZEND_DEBUG - ZEND_ASSERT(op_array->opcodes[def].result_type & (IS_TMP_VAR|IS_VAR)); - ZEND_ASSERT(op_array->opcodes[def].result.var == var); - ZEND_ASSERT(ssa->ops[def].result_def >= 0); -#else - if (!(op_array->opcodes[def].result_type & (IS_TMP_VAR|IS_VAR)) - || op_array->opcodes[def].result.var != var - || ssa->ops[def].result_def < 0) { - /* TODO: Some wrong live-range? keep it. */ - j++; - live_range++; - i++; - continue; - } -#endif - - var = ssa->ops[def].result_def; - - if ((ssa->var_info[var].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) - && !is_var_dead(ctx, var)) { - /* keep */ - j++; - } else if (i != j) { - op_array->live_range[j] = *live_range; - } - } - - live_range++; - i++; - } - op_array->last_live_range = j; - if (op_array->last_live_range == 0) { - efree(op_array->live_range); - op_array->live_range = NULL; - } -} - int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects) { int i; zend_ssa_phi *phi; @@ -648,10 +575,6 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reor } } - if (op_array->live_range) { - dce_live_ranges(&ctx, op_array, ssa); - } - /* Eliminate dead instructions */ ZEND_BITSET_FOREACH(ctx.instr_dead, ctx.instr_worklist_len, i) { removed_ops += dce_instr(&ctx, &op_array->opcodes[i], &ssa->ops[i]); |