From: Jeff Law Date: Fri, 24 Jan 2014 20:51:22 +0000 (-0700) Subject: re PR tree-optimization/59919 (ICE in process_assert_insertions_for, at tree-vrp... X-Git-Tag: releases/gcc-4.9.0~1375 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3d75049621434125a972a3fc738437d33d35ca8a;p=thirdparty%2Fgcc.git re PR tree-optimization/59919 (ICE in process_assert_insertions_for, at tree-vrp.c:6096) PR tree-optimization/59919 * tree-vrp.c (find_assert_locations_1): Do not register asserts for non-returning calls. PR tree-optimization/59919 * gcc.c-torture/compile/pr59919.c: New test. From-SVN: r207061 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index baf3bd693545..f49d6bb95ecf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-01-24 Jeff Law + + PR tree-optimization/59919 + * tree-vrp.c (find_assert_locations_1): Do not register asserts + for non-returning calls. + 2014-01-24 James Greenhalgh * common/config/aarch64/aarch64-common.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 445815ee4ebc..8a44033f7de9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-01-24 Jeff Law + + PR tree-optimization/59919 + * gcc.c-torture/compile/pr59919.c: New test. + 2014-01-24 Paolo Carlini PR c++/57524 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr59919.c b/gcc/testsuite/gcc.c-torture/compile/pr59919.c new file mode 100644 index 000000000000..6809caaf9f3a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr59919.c @@ -0,0 +1,18 @@ +typedef int jmp_buf[10]; +struct S +{ + int i; + jmp_buf buf; +}; + +void setjmp (jmp_buf); +void foo (int *); +__attribute__ ((__noreturn__, __nonnull__)) void bar (struct S *); + +void +baz (struct S *p) +{ + bar (p); + setjmp (p->buf); + foo (&p->i); +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index f6da19252c67..7aa732ddbb99 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4534,12 +4534,21 @@ infer_value_range (gimple stmt, tree op, enum tree_code *comp_code_p, tree *val_ if (stmt_could_throw_p (stmt)) return false; - /* If STMT is the last statement of a basic block with no + /* If STMT is the last statement of a basic block with no normal 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; + 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; + } if (infer_nonnull_range (stmt, op, true, true)) {