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

Reply via email to