]> granicus.if.org Git - php/commitdiff
Fix phi placement for pi targets
authorNikita Popov <nikic@php.net>
Thu, 12 May 2016 19:57:19 +0000 (21:57 +0200)
committerNikita Popov <nikic@php.net>
Thu, 12 May 2016 20:08:28 +0000 (22:08 +0200)
If the pi target has multiple predecessors, we need to place a
phi there. However it's not possible to express this in terms of
dominance frontiers, so we need to explicitly add it to the phi
set.

This does not yet solve the problem of non-minimal SSA for the
case where the target has multiple predecessors, but dominates
all predecessors (apart from the one creating the pi) -- but
that's an existing issue.

ext/opcache/Optimizer/zend_ssa.c

index 3b5e45b31557b52998df42e2c6b17057f27ef9a0..a008e1029bb9163dbdc93539ccd4787b84c78bfb 100644 (file)
@@ -95,6 +95,13 @@ static zend_ssa_phi *add_pi(
         * If there is a back-edge to "to" this may result in non-minimal SSA form. */
        DFG_SET(dfg->def, dfg->size, to, var);
 
+       /* If there are multiple predecessors in the target block, we need to place a phi there.
+        * However this can (generally) not be expressed in terms of dominance frontiers, so place it
+        * explicitly. dfg->use here really is dfg->phi, we're reusing the set. */
+       if (ssa->cfg.blocks[to].predecessors_count > 1) {
+               DFG_SET(dfg->use, dfg->size, to, var);
+       }
+
        return phi;
 }
 /* }}} */