On Thu, Jan 23, 2014 at 02:22:35PM -0700, Jeff Law wrote: > --- a/gcc/tree-vrp.c > +++ b/gcc/tree-vrp.c > @@ -5891,8 +5891,13 @@ find_assert_locations_1 (basic_block bb, sbitmap live) > } > } > > - register_new_assert_for (op, op, comp_code, value, bb, NULL, si); > - need_assert = true; > + /* Do not register any assertions for a non-returning call. */ > + if (!is_gimple_call (stmt) || !gimple_call_noreturn_p (stmt)) > + { > + register_new_assert_for (op, op, comp_code, > + value, bb, NULL, si); > + need_assert = true; > + } > } > }
I'd say this belongs into infer_value_range instead. It has: /* If STMT is the last statement of a basic block with no successors, there is no point inferring anything about any of its operands. We would not be able to find a proper insertion point for the assertion, anyway. */ if (stmt_ends_bb_p (stmt) && EDGE_COUNT (gimple_bb (stmt)->succs) == 0) return false; so I'd say it should instead do: if (stmt_ends_bb_p (stmt)) { edge_iterator ei; edge e; FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs) if (!(e->flags & EDGE_ABNORMAL)) break; if (e == NULL) return false; } Because, there are e.g. two register_new_assert_for calls with non-NULL bb and NULL e, so you'd need to handle this for both, etc. Jakub