[PATCH][4/n] Remove GENERIC stmt combining from SCCVN
Richard Biener
rguenther@suse.de
Mon Jul 13 07:55:00 GMT 2015
On Sun, 12 Jul 2015, Jeff Law wrote:
> On 06/29/2015 01:58 AM, Richard Biener wrote:
> >
> > In principle the following works for the testcase (even w/o fixing
> > the VRP part).
> >
> > Index: gcc/tree-ssa-dom.c
> > ===================================================================
> > --- gcc/tree-ssa-dom.c (revision 225007)
> > +++ gcc/tree-ssa-dom.c (working copy)
> > @@ -1409,6 +1409,14 @@ simplify_stmt_for_jump_threading (gimple
> > return lookup_avail_expr (stmt, false);
> > }
> >
> > +static tree
> > +dom_valueize (tree t)
> > +{
> > + if (TREE_CODE (t) == SSA_NAME)
> > + return SSA_NAME_VALUE (t);
> > + return t;
> > +}
> > +
> > /* Record into the equivalence tables any equivalences implied by
> > traversing edge E (which are cached in E->aux).
> >
> > @@ -1429,7 +1437,33 @@ record_temporary_equivalences (edge e)
> >
> > /* If we have a simple NAME = VALUE equivalence, record it. */
> > if (lhs && TREE_CODE (lhs) == SSA_NAME)
> > - const_and_copies->record_const_or_copy (lhs, rhs);
> > + {
> > + gimple use_stmt;
> > + imm_use_iterator iter;
> > + const_and_copies->record_const_or_copy (lhs, rhs);
> > + FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
> > + {
> > + /* Only bother to record more equivalences for lhs that
> > + can be directly used by e->dest.
> > + ??? If the code gets re-organized to a worklist to
> > + catch more indirect opportunities and it is made to
> > + handle PHIs then this should only consider use_stmts
> > + in basic-blocks we have already visited. */
> > + if (!dominated_by_p (CDI_DOMINATORS,
> > + e->dest, gimple_bb (use_stmt)))
> > + continue;
> > + tree lhs = gimple_get_lhs (use_stmt);
> > + if (lhs && TREE_CODE (lhs) == SSA_NAME)
> > + {
> > + tree res = gimple_fold_stmt_to_constant_1 (use_stmt,
> > + dom_valueize,
> > +
> > no_follow_ssa_edges);
> > + if (TREE_CODE (res) == SSA_NAME
> > + || is_gimple_min_invariant (res))
> > + const_and_copies->record_const_or_copy (lhs, res);
> > + }
> > + }
> > + }
> >
> > /* If we have 0 = COND or 1 = COND equivalences, record them
> > into our expression hash tables. */
> >
> >
> > it's not using DOMs own stmt visiting machinery as that always modifies
> > stmts in-place. As stated in the comment it doesn't catch secondary
> > opportunities. That would be possible by using a work-list seeded
> > by LHS we recorded new const/copies for and re-visiting their uses.
> > You can get extra fancy here by properly handling PHIs and
> > conditionals. But it's a question of cost here, of course.
> Right, the code you're modifying is only used by jump threading to record
> temporary equivalences, particularly equivalences that are specific to a path.
>
>
> >
> > Note that I think this isn't really "backward propagation" but
> > just context sensitive value-numbering.
> I think that's because we're looking at the problem differently. It's
> certainly not backward propagation in the traditional dataflow sense, so I'm
> probably being too loose with terminology here.
>
> When we discover something about X by means other than the definition of X, we
> can look at how X was set and possibly discover a value for source operands of
> that statement. Similarly we can look at uses of X and possibly discover a
> value for the destination of those statement(s). In both cases we're going
> backwards from an order-of-execution point of view and recording additional
> equivalences.
>
> The existing code did the former (look at X's defining statement and try to
> discover an equivalence for a source operand in that statement). What we need
> to optimize this case is the latter.
>
> I *think* these are closely enough related that some code can be factored out
> a bit and reused in both r_e_f_i_e and r_t_e to discover both types of
> equivalences for DOM and for jump threading.
Indeed - the odd thing here is that one function uses
const_and_copies->record_const_or_copy directly while the other one
record_equality (this function is _solely_ used by
record_equivalences_from_incoming_edge). I didn't want to introduce
a callback to commonize the code (though in principle we could use
a template function with a function template parameter...)
That said, I don't see that record_equality does sth not suitable
if called from record_temporary_equivalences. So if we make
use of that function we could simply call record_temporary_equivalences
from record_equivalences_from_incoming_edge.
Richard.
> Jeff
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Dilip Upmanyu, Graham Norton, HRB 21284 (AG Nuernberg)
More information about the Gcc-patches
mailing list