I am testing the following patch to avoid useless VRP range allocations when we just ask for varying on stmts we don't know how to handle. I think it should fix the PR where we end up assigning to the static const vr_const_varying returned by get_value_range in the early VRP context.
Eventually the VRP lattice needs to become sparse (or just growable, I have a patch for that as well). Not until early VRP gets some more capabilities though, it would be a waste otherwise. Bootstrap / regtest in progress on x86_64-unknown-linux-gnu. Richard. 2016-09-28 Richard Biener <rguent...@suse.de> * tree-vrp.c (set_defs_to_varying): New helper. (vrp_initialize): Call it. (vrp_visit_stmt): Likewise. (evrp_dom_walker::before_dom_children): Likewise. Index: gcc/tree-vrp.c =================================================================== --- gcc/tree-vrp.c (revision 240568) +++ gcc/tree-vrp.c (working copy) @@ -343,6 +343,24 @@ set_value_range_to_varying (value_range } +/* Set value-ranges of all SSA names defined by STMT to varying. */ + +static void +set_defs_to_varying (gimple *stmt) +{ + ssa_op_iter i; + tree def; + FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF) + { + unsigned ver = SSA_NAME_VERSION (def); + /* Avoid needlessly allocating value-ranges. */ + if (num_vr_values >= ver + && vr_value[ver]) + set_value_range_to_varying (vr_value[ver]); + } +} + + /* Set value range VR to {T, MIN, MAX, EQUIV}. */ static void @@ -7022,10 +7040,7 @@ vrp_initialize () prop_set_simulate_again (stmt, true); else if (!stmt_interesting_for_vrp (stmt)) { - ssa_op_iter i; - tree def; - FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); + set_defs_to_varying (stmt); prop_set_simulate_again (stmt, false); } else @@ -7901,8 +7916,6 @@ vrp_visit_stmt (gimple *stmt, edge *take { value_range vr = VR_INITIALIZER; tree lhs = gimple_get_lhs (stmt); - tree def; - ssa_op_iter iter; extract_range_from_stmt (stmt, taken_edge_p, output_p, &vr); if (*output_p) @@ -7997,8 +8010,7 @@ vrp_visit_stmt (gimple *stmt, edge *take /* All other statements produce nothing of interest for VRP, so mark their outputs varying and prevent further simulation. */ - FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); + set_defs_to_varying (stmt); return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING; } @@ -10726,12 +10738,7 @@ evrp_dom_walker::before_dom_children (ba && (vr.type == VR_RANGE || vr.type == VR_ANTI_RANGE)) update_value_range (output, &vr); else - { - tree def; - ssa_op_iter iter; - FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); - } + set_defs_to_varying (stmt); /* Try folding stmts with the VR discovered. */ bool did_replace @@ -10780,12 +10787,7 @@ evrp_dom_walker::before_dom_children (ba } } else - { - tree def; - ssa_op_iter iter; - FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); - } + set_defs_to_varying (stmt); } bb->flags |= BB_VISITED; return NULL;