From: hubicka Date: Tue, 1 Jun 2010 21:55:49 +0000 (+0000) Subject: * ipa-pure-const.c (local_pure_const): Do NORETURN discovery. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e093314183374e29dac0d4a73c296deb782c18f8;p=thirdparty%2Fgcc.git * ipa-pure-const.c (local_pure_const): Do NORETURN discovery. * testsuite/gcc.dg/noreturn-8.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160124 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 513b3181ac60..a87a41da66ab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +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 ...; diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index df2f8c85312d..d785389191a8 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 efbec90be930..cd4fdc359fc3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +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. diff --git a/gcc/testsuite/gcc.dg/noreturn-8.c b/gcc/testsuite/gcc.dg/noreturn-8.c new file mode 100644 index 000000000000..50765da37ef4 --- /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; +}