From 73add7fe2951139ec8508968888c1f5b12eceae7 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 1 Jun 2010 23:55:49 +0200 Subject: [PATCH] ipa-pure-const.c (local_pure_const): Do NORETURN discovery. * ipa-pure-const.c (local_pure_const): Do NORETURN discovery. * testsuite/gcc.dg/noreturn-8.c: New testcase. From-SVN: r160124 --- gcc/ChangeLog | 4 ++++ gcc/ipa-pure-const.c | 21 +++++++++++++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/noreturn-8.c | 16 ++++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/noreturn-8.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 513b318..a87a41d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2010-06-01 Jan Hubicka + * ipa-pure-const.c (local_pure_const): Do NORETURN discovery. + +2010-06-01 Jan Hubicka + * tree-cfgcleanup.c (fixup_noreturn_call): Break out from ...; remove return value. (split_bbs_on_noreturn_calls) .... here. diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index df2f8c8..d785389 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -1362,6 +1362,27 @@ local_pure_const (void) && !warn_suggest_attribute_pure && skip) return 0; + + /* First do NORETURN discovery. */ + if (!skip && !TREE_THIS_VOLATILE (current_function_decl) + && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0) + { + if (warn_missing_noreturn + && !lang_hooks.missing_noreturn_ok_p (cfun->decl)) + warning_at (DECL_SOURCE_LOCATION (cfun->decl), OPT_Wmissing_noreturn, + "function might be possible candidate " + "for attribute %"); + if (dump_file) + fprintf (dump_file, "Function found to be noreturn: %s\n", + lang_hooks.decl_printable_name (current_function_decl, 2)); + + /* Update declaration and reduce profile to executed once. */ + TREE_THIS_VOLATILE (current_function_decl) = 1; + if (node->frequency > NODE_FREQUENCY_EXECUTED_ONCE) + node->frequency = NODE_FREQUENCY_EXECUTED_ONCE; + + changed = true; + } l = analyze_function (node, false); switch (l->pure_const_state) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index efbec90..cd4fdc3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2010-05-31 Jan Hubicka + * testsuite/gcc.dg/noreturn-8.c: New testcase. + +2010-05-31 Jan Hubicka + * testsuite/gcc.dg/lto/noreturn-1_1.c: Remove dg-do annotations. * testsuite/gcc.dg/lto/noreturn-1_0.c: Move it here. diff --git a/gcc/testsuite/gcc.dg/noreturn-8.c b/gcc/testsuite/gcc.dg/noreturn-8.c new file mode 100644 index 0000000..50765da --- /dev/null +++ b/gcc/testsuite/gcc.dg/noreturn-8.c @@ -0,0 +1,16 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +void exit (int); +void noreturn_autodetection_failed (); +__attribute__ ((noinline)) +detect_noreturn () +{ + exit (0); +} +int +main (void) +{ + detect_noreturn (); + noreturn_autodetection_failed (); + return 0; +} -- 2.7.4