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
This commit is contained in:
Richard Biener 2016-08-23 07:23:19 +00:00 committed by Richard Biener
parent e83421c08f
commit 1fd9f058f3
4 changed files with 27 additions and 8 deletions

View File

@ -1,3 +1,10 @@
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> 2016-08-23 Richard Biener <rguenther@suse.de>
PR middle-end/77305 PR middle-end/77305

View File

@ -1,3 +1,8 @@
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

View File

@ -0,0 +1,12 @@
/* { 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" } } */

View File

@ -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)
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)
/* 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;