Commit 1fd9f058 by Richard Biener Committed by Richard Biener

re PR middle-end/27336 (delete null checks in callers to nonnull functions)

2016-08-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/27336
	* tree-vrp.c (infer_value_range): Handle stmts that can throw
	by looking for a non-EH edge.
	(process_assert_insertions_for): Likewise.

	* c-c++-common/pr27336.c: New testcase.

From-SVN: r239684
parent e83421c0
2016-08-23 Richard Biener <rguenther@suse.de> 2016-08-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/27336
* tree-vrp.c (infer_value_range): Handle stmts that can throw
by looking for a non-EH edge.
(process_assert_insertions_for): Likewise.
2016-08-23 Richard Biener <rguenther@suse.de>
PR middle-end/77305 PR middle-end/77305
* statistics.c (statistics_counter_event): Robustify against * statistics.c (statistics_counter_event): Robustify against
NULL current_pass. NULL current_pass.
......
2016-08-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/27336
* c-c++-common/pr27336.c: New testcase.
2016-08-22 Marek Polacek <polacek@redhat.com> 2016-08-22 Marek Polacek <polacek@redhat.com>
PR c++/77321 PR c++/77321
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp1" } */
struct B { int x; };
extern void g3(struct B *that) __attribute__((nonnull));
int f3(struct B *a)
{
g3(a);
return a != (void *)0;
}
/* { dg-final { scan-tree-dump "return 1;" "vrp1" } } */
...@@ -4782,11 +4782,6 @@ infer_value_range (gimple *stmt, tree op, tree_code *comp_code_p, tree *val_p) ...@@ -4782,11 +4782,6 @@ infer_value_range (gimple *stmt, tree op, tree_code *comp_code_p, tree *val_p)
if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op)) if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
return false; return false;
/* Similarly, don't infer anything from statements that may throw
exceptions. ??? Relax this requirement? */
if (stmt_could_throw_p (stmt))
return false;
/* If STMT is the last statement of a basic block with no normal /* If STMT is the last statement of a basic block with no normal
successors, there is no point inferring anything about any of its successors, there is no point inferring anything about any of its
operands. We would not be able to find a proper insertion point operands. We would not be able to find a proper insertion point
...@@ -4797,7 +4792,7 @@ infer_value_range (gimple *stmt, tree op, tree_code *comp_code_p, tree *val_p) ...@@ -4797,7 +4792,7 @@ infer_value_range (gimple *stmt, tree op, tree_code *comp_code_p, tree *val_p)
edge e; edge e;
FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs) FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
if (!(e->flags & EDGE_ABNORMAL)) if (!(e->flags & (EDGE_ABNORMAL|EDGE_EH)))
break; break;
if (e == NULL) if (e == NULL)
return false; return false;
...@@ -6370,10 +6365,10 @@ process_assert_insertions_for (tree name, assert_locus *loc) ...@@ -6370,10 +6365,10 @@ process_assert_insertions_for (tree name, assert_locus *loc)
/* If STMT must be the last statement in BB, we can only insert new /* If STMT must be the last statement in BB, we can only insert new
assertions on the non-abnormal edge out of BB. Note that since assertions on the non-abnormal edge out of BB. Note that since
STMT is not control flow, there may only be one non-abnormal edge STMT is not control flow, there may only be one non-abnormal/eh edge
out of BB. */ out of BB. */
FOR_EACH_EDGE (e, ei, loc->bb->succs) FOR_EACH_EDGE (e, ei, loc->bb->succs)
if (!(e->flags & EDGE_ABNORMAL)) if (!(e->flags & (EDGE_ABNORMAL|EDGE_EH)))
{ {
gsi_insert_on_edge (e, assert_stmt); gsi_insert_on_edge (e, assert_stmt);
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment