]> granicus.if.org Git - php/commitdiff
Fix reachability detection if live ranges aren't split
authorNikita Popov <nikic@php.net>
Sat, 21 May 2016 18:17:09 +0000 (20:17 +0200)
committerNikita Popov <nikic@php.net>
Sat, 21 May 2016 18:17:09 +0000 (20:17 +0200)
Even if we don't split, we still want to keep the same logic for
reachibility detection.

ext/opcache/Optimizer/zend_cfg.c

index 4ea738730436b2f75179ae275d9f12fd080118b5..c675da1116170ec89f8c38f2c8c6fb77e52580ba 100644 (file)
@@ -92,35 +92,33 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg *
                do {
                        changed = 0;
 
-                       if (cfg->split_at_live_ranges) {
-                               /* Add live range paths */
-                               for (j = 0; j < op_array->last_live_range; j++) {
-                                       if (op_array->live_range[j].var == (uint32_t)-1) {
-                                               /* this live range already removed */
+                       /* Add live range paths */
+                       for (j = 0; j < op_array->last_live_range; j++) {
+                               if (op_array->live_range[j].var == (uint32_t)-1) {
+                                       /* this live range already removed */
+                                       continue;
+                               }
+                               b = blocks + block_map[op_array->live_range[j].start];
+                               if (b->flags & ZEND_BB_REACHABLE) {
+                                       while (op_array->opcodes[b->start].opcode == ZEND_NOP && b->start != b->end) {
+                                               b->start++;
+                                       }
+                                       if (op_array->opcodes[b->start].opcode == ZEND_NOP &&
+                                               b->start == b->end &&
+                                               b->successors[0] == block_map[op_array->live_range[j].end]) {
+                                               /* mark as removed (empty live range) */
+                                               op_array->live_range[j].var = (uint32_t)-1;
                                                continue;
                                        }
-                                       b = blocks + block_map[op_array->live_range[j].start];
-                                       if (b->flags & ZEND_BB_REACHABLE) {
-                                               while (op_array->opcodes[b->start].opcode == ZEND_NOP && b->start != b->end) {
-                                                       b->start++;
-                                               }
-                                               if (op_array->opcodes[b->start].opcode == ZEND_NOP &&
-                                                       b->start == b->end &&
-                                                       b->successors[0] == block_map[op_array->live_range[j].end]) {
-                                                       /* mark as removed (empty live range) */
-                                                       op_array->live_range[j].var = (uint32_t)-1;
-                                                       continue;
-                                               }
-                                               b->flags |= ZEND_BB_GEN_VAR;
-                                               b = blocks + block_map[op_array->live_range[j].end];
-                                               b->flags |= ZEND_BB_KILL_VAR;
-                                               if (!(b->flags & ZEND_BB_REACHABLE)) {
-                                                       changed = 1;
-                                                       zend_mark_reachable(op_array->opcodes, blocks, b);
-                                               }
-                                       } else {
-                                               ZEND_ASSERT(!(blocks[block_map[op_array->live_range[j].end]].flags & ZEND_BB_REACHABLE));
+                                       b->flags |= ZEND_BB_GEN_VAR;
+                                       b = blocks + block_map[op_array->live_range[j].end];
+                                       b->flags |= ZEND_BB_KILL_VAR;
+                                       if (!(b->flags & ZEND_BB_REACHABLE)) {
+                                               changed = 1;
+                                               zend_mark_reachable(op_array->opcodes, blocks, b);
                                        }
+                               } else {
+                                       ZEND_ASSERT(!(blocks[block_map[op_array->live_range[j].end]].flags & ZEND_BB_REACHABLE));
                                }
                        }
 
@@ -445,10 +443,8 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                        blocks[blocks_count].level = -1;
                        blocks[blocks_count].children = -1;
                        blocks[blocks_count].next_child = -1;
-                       block_map[i] = blocks_count;
-               } else {
-                       block_map[i] = (uint32_t)-1;
                }
+               block_map[i] = blocks_count;
        }
 
        blocks[blocks_count].end = i - 1;