From: Dmitry Stogov Date: Wed, 23 Dec 2015 00:52:38 +0000 (+0300) Subject: Fixed SSA construction for CFG with unreachable BB X-Git-Tag: php-7.1.0alpha1~617^2~160 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=28a016a6dca22566a6126b2b995fddcb8125c5e5;p=php Fixed SSA construction for CFG with unreachable BB --- diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index 46c3928106..d9e85165d9 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -495,7 +495,7 @@ int zend_build_ssa(zend_arena **arena, const zend_op_array *op_array, uint32_t b zend_bitset_copy(tmp, gen + (j * set_size), set_size); for (k = 0; k < blocks[j].predecessors_count; k++) { i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k]; - while (i != blocks[j].idom) { + while (i != -1 && i != blocks[j].idom) { zend_bitset_union_with_intersection(tmp, tmp, gen + (i * set_size), in + (j * set_size), set_size); i = blocks[i].idom; } @@ -530,7 +530,7 @@ int zend_build_ssa(zend_arena **arena, const zend_op_array *op_array, uint32_t b } else { for (k = 0; k < blocks[j].predecessors_count; k++) { i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k]; - while (i != blocks[j].idom) { + while (i != -1 && i != blocks[j].idom) { zend_bitset_union_with_intersection(tmp, tmp, gen + (i * set_size), in + (j * set_size), set_size); i = blocks[i].idom; } @@ -802,7 +802,7 @@ int zend_build_ssa(zend_arena **arena, const zend_op_array *op_array, uint32_t b } else { for (k = 0; k < blocks[j].predecessors_count; k++) { i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k]; - while (i != blocks[j].idom) { + while (i != -1 && i != blocks[j].idom) { zend_ssa_phi *p = ssa_blocks[i].phis; while (p) { if (p) { diff --git a/ext/opcache/tests/ssa_bug_001.phpt b/ext/opcache/tests/ssa_bug_001.phpt new file mode 100644 index 0000000000..56757f56a4 --- /dev/null +++ b/ext/opcache/tests/ssa_bug_001.phpt @@ -0,0 +1,19 @@ +--TEST-- +SSA constrution for CFG with unreachable basic blocks +--FILE-- + +OK +--EXPECT-- +OK