From: Jan Hubicka Date: Tue, 1 Jun 2010 21:55:49 +0000 (+0200) Subject: ipa-pure-const.c (local_pure_const): Do NORETURN discovery. X-Git-Tag: releases/gcc-4.6.0~6848 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=73add7fe2951139ec8508968888c1f5b12eceae7;p=thirdparty%2Fgcc.git 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 --- 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; +}