summaryrefslogtreecommitdiff
path: root/ext/opcache/Optimizer/dce.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-01-17 16:07:17 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-01-21 11:47:27 +0100
commit3269e884686ada59407e14db812bfb42d59d2f1c (patch)
tree340b3f09b122a3e1c676f02f0f729bae40c450fd /ext/opcache/Optimizer/dce.c
parent276d3a7d159964d225c8e7ff75debdd9c359eee2 (diff)
downloadphp-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.c77
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]);