On 12/08/2015 07:27 AM, Richard Biener wrote:
I wonder if it makes more sense to integrate this with the
domwalker itself. Add a constructor flag to it and do everything
in itself. By letting the before_dom_children return a taken edge
(or NULL if unknown) it can drive the outgoing edge marking. And
the domwalk worker would simply not recurse to dom children for
unreachable blocks.
So interface-wise do
[ ... ]
Close :-)
If skip_unreachable_blocks is true, then we want the walker to
initialize EDGE_EXECUTABLE automatically. So we drop the member
initialization and constructor body from domwalk.h and instead have a
ctor in domwalk.c where we can initialize the private members and set
EDGE_EXECUTABLE as needed.
My first iteration let the clients clear EDGE_EXECUTABLE as they found
conditionals that could be optimized. That was pretty clean and
localized in sccvn & dom.
If we have the before_dom_children return the taken edge, then we have
to twiddle all the clients due to the api change in before_dom_children.
. There's ~18 in total, so it's not too bad.
2 of the 18 clearly need to use the skip_unreachable_blocks capability
(dom and sccvn). 2 others might be able to use it (tree-ssa-pre.c and
tree-ssa-propagate.c) I converted dom and sccvn, but not pre and the
generic propagation engine.
I can submit the iteration which lets clients clear EDGE_EXECUTABLE, or
the iteration where the clients return the taken edge (or NULL) from the
before_dom_children callback.
Either is fine with me, so if you have a preference, let me know.
jeff