On Thu, 13 Sep 2012, Steven Bosscher wrote: > On Wed, Sep 12, 2012 at 4:52 PM, Steven Bosscher wrote: > > On Wed, Sep 12, 2012 at 4:02 PM, Richard Guenther wrote: > >> for a followup (and I bet sth else than PRE blows up at -O2 as well). > > > > Actually, the only thing that really blows up is that enemy of scalability, > > VRP. > > FWIW, this appears to be due to the well-known problem with the equiv > set, but also due to the liveness computations that tree-vrp performs, > since your commit in r139263. > > Any reason why you didn't just re-use the tree-ssa-live machinery?
Probably I didn't know about it or didn't want to keep the full life problem life (it tries to free things as soon as possible). > And any reason why you don't let a DEF kill a live SSA name? AFAICT > you're exposing all SSA names up without ever killing a USE :-) Eh ;) We also should traverse blocks backward I suppose. Also the RPO traversal suffers from the same issue I noticed in PRE and for what I invented my_rev_post_order_compute ... (pre_and_rev_post_order_compute doesn't compute an optimal reverse post order). Patch fixing the liveness below, untested sofar, apart from on tree-ssa.exp where it seems to regress gcc.dg/tree-ssa/pr21086.c :/ As for the equiv sets - yes, that's known. I wanted to investigate at some point what happens if we instead record the SSA name we registered the assert for (thus look up a chain of lattice values instead of recording all relevant entries in a bitmap). ISTR there were some correctness issues, but if we restrict the chaining maybe we cat get a good compromise here. Richard. Index: gcc/tree-vrp.c =================================================================== --- gcc/tree-vrp.c (revision 191289) +++ gcc/tree-vrp.c (working copy) @@ -5439,7 +5439,6 @@ find_assert_locations_1 (basic_block bb, { gimple_stmt_iterator si; gimple last; - gimple phi; bool need_assert; need_assert = false; @@ -5462,7 +5461,7 @@ find_assert_locations_1 (basic_block bb, /* Traverse all the statements in BB marking used names and looking for statements that may infer assertions for their used operands. */ - for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) + for (si = gsi_last_bb (bb); !gsi_end_p (si); gsi_prev (&si)) { gimple stmt; tree op; @@ -5531,6 +5530,9 @@ find_assert_locations_1 (basic_block bb, } } } + + FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF) + RESET_BIT (live, SSA_NAME_VERSION (op)); } /* Traverse all PHI nodes in BB marking used operands. */ @@ -5538,7 +5540,11 @@ find_assert_locations_1 (basic_block bb, { use_operand_p arg_p; ssa_op_iter i; - phi = gsi_stmt (si); + gimple phi = gsi_stmt (si); + tree res = gimple_phi_result (phi); + + if (virtual_operand_p (res)) + continue; FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE) { @@ -5546,6 +5552,8 @@ find_assert_locations_1 (basic_block bb, if (TREE_CODE (arg) == SSA_NAME) SET_BIT (live, SSA_NAME_VERSION (arg)); } + + RESET_BIT (live, SSA_NAME_VERSION (res)); } return need_assert;