From 5de8da9b685658bc6132ef052ecbd06fe7163128 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Sat, 9 Jan 2010 14:40:59 +0000 Subject: [PATCH] re PR middle-end/42363 (ICE: verify_flow_info failed for gcc.c-torture/compile/pr37913.c -O1 -g) gcc/ChangeLog: PR middle-end/42363 * gimplify.c (gimplify_modify_expr): Drop lhs on noreturn calls. * tree-cfg.c (is_ctrl_altering_stmt): Don't compute flags twice. (verify_gimple_call): Reject LHS in noreturn calls. gcc/testsuite/ChangeLog: PR middle-end/42363 * gcc.dg/torture/pr42363.c: New. From-SVN: r155762 --- gcc/ChangeLog | 7 +++ gcc/gimplify.c | 3 +- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.dg/torture/pr42363.c | 84 ++++++++++++++++++++++++++ gcc/tree-cfg.c | 8 ++- 5 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr42363.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5c240789f7f..2e66d7e72d84 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-09 Alexandre Oliva + + PR middle-end/42363 + * gimplify.c (gimplify_modify_expr): Drop lhs on noreturn calls. + * tree-cfg.c (is_ctrl_altering_stmt): Don't compute flags twice. + (verify_gimple_call): Reject LHS in noreturn calls. + 2010-01-09 Alexandre Oliva PR debug/42604 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index a3c6834beff7..e09cb3e429be 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -4407,7 +4407,8 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, /* Since the RHS is a CALL_EXPR, we need to create a GIMPLE_CALL instead of a GIMPLE_ASSIGN. */ assign = gimple_build_call_from_tree (*from_p); - gimple_call_set_lhs (assign, *to_p); + if (!gimple_call_noreturn_p (assign)) + gimple_call_set_lhs (assign, *to_p); } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 08c6bffc6fe4..83535c06b0e3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-09 Alexandre Oliva + + PR middle-end/42363 + * gcc.dg/torture/pr42363.c: New. + 2010-01-09 Alexandre Oliva PR debug/42604 diff --git a/gcc/testsuite/gcc.dg/torture/pr42363.c b/gcc/testsuite/gcc.dg/torture/pr42363.c new file mode 100644 index 000000000000..9c9da1373dd4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr42363.c @@ -0,0 +1,84 @@ +/* PR middle-end/pr42363, extended from the test for PR middle-end/37913. */ +/* { dg-do compile } */ +/* { dg-options "-g" } */ + +void foo (void) __attribute__ ((noreturn)); + +static int __attribute__ ((noreturn)) +bar (void) +{ + foo (); +} + +int +baz (void) +{ + int i = bar (); + return i + 1; +} + +int fooz (void) __attribute__ ((noreturn)); + +static int __attribute__ ((noreturn)) +bart (void) +{ + return fooz (); /* { dg-warning "noreturn" } */ +} + +int bazr (void) +{ + int i = bart (); + return i + 1; +} + +static inline int +bard (void) +{ + return fooz (); +} + +int bizr (void) +{ + int i, j; + + i = j = bard (); + + return i + 1; +} + +/* This might be regarded as pure and folded, rather than inlined. + It's pure evil. */ +static int __attribute__ ((pure, const, noreturn)) +barf (void) +{ +} /* { dg-warning "does return" } */ + +static int __attribute__ ((pure, const)) +bark (void) +{ + barf (); +} + +int buzr (void) +{ + int i, j; + + i = j = bark () + bark (); + + return i + 1; +} + +int buzt (void) +{ + int i, j; + + i = j = barf () + barf (); + + return i + 1; +} + +void bust (void) +{ + while (barf ()) + ; +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 36e518c98820..b6e9006072c1 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -2230,7 +2230,7 @@ is_ctrl_altering_stmt (gimple t) return true; /* A call also alters control flow if it does not return. */ - if (gimple_call_flags (t) & ECF_NORETURN) + if (flags & ECF_NORETURN) return true; } break; @@ -2963,6 +2963,12 @@ verify_gimple_call (gimple stmt) return true; } + if (gimple_call_lhs (stmt) && gimple_call_noreturn_p (stmt)) + { + error ("LHS in noreturn call"); + return true; + } + fntype = TREE_TYPE (TREE_TYPE (fn)); if (gimple_call_lhs (stmt) && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)), -- 2.47.3