diff --git a/Zend/Optimizer/dce.c b/Zend/Optimizer/dce.c index 3fec874a722..1af15452036 100644 --- a/Zend/Optimizer/dce.c +++ b/Zend/Optimizer/dce.c @@ -464,13 +464,19 @@ static inline int get_common_phi_source(zend_ssa *ssa, zend_ssa_phi *phi) { int common_source = -1; int source; FOREACH_PHI_SOURCE(phi, source) { + if (source == phi->ssa_var) { + continue; + } if (common_source == -1) { common_source = source; - } else if (common_source != source && source != phi->ssa_var) { + } else if (common_source != source) { return -1; } } FOREACH_PHI_SOURCE_END(); - ZEND_ASSERT(common_source != -1); + + /* If all sources are phi->ssa_var this phi must be in an unreachable cycle. + * We can't easily drop the phi in that case, as we don't have something to replace it with. + * Ideally SCCP would eliminate the whole cycle. */ return common_source; } diff --git a/Zend/tests/unreachable_phi_cycle.phpt b/Zend/tests/unreachable_phi_cycle.phpt new file mode 100644 index 00000000000..84bfec214bb --- /dev/null +++ b/Zend/tests/unreachable_phi_cycle.phpt @@ -0,0 +1,15 @@ +--TEST-- +Unreachable phi cycle +--FILE-- + +--EXPECTF-- +Warning: Undefined variable $i in %s on line %d