OSDN Git Service

* ipa-pure-const.c (local_pure_const): Do NORETURN discovery.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Jun 2010 21:55:49 +0000 (21:55 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Jun 2010 21:55:49 +0000 (21:55 +0000)
* 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

gcc/ChangeLog
gcc/ipa-pure-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/noreturn-8.c [new file with mode: 0644]

index 513b318..a87a41d 100644 (file)
@@ -1,5 +1,9 @@
 2010-06-01  Jan Hubicka  <jh@suse.cz>
 
+       * ipa-pure-const.c (local_pure_const): Do NORETURN discovery.
+
+2010-06-01  Jan Hubicka  <jh@suse.cz>
+
        * tree-cfgcleanup.c (fixup_noreturn_call): Break out from ...;
        remove return value.
        (split_bbs_on_noreturn_calls) .... here.
index df2f8c8..d785389 100644 (file)
@@ -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 %<noreturn%>");
+      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)
index efbec90..cd4fdc3 100644 (file)
@@ -1,5 +1,9 @@
 2010-05-31 Jan Hubicka  <jh@suse.cz>
 
+       * testsuite/gcc.dg/noreturn-8.c: New testcase.
+
+2010-05-31 Jan Hubicka  <jh@suse.cz>
+
        * 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 (file)
index 0000000..50765da
--- /dev/null
@@ -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;
+}