re PR c/44024 (missed optimization)
authorRichard Guenther <rguenther@suse.de>
Sun, 9 May 2010 18:17:33 +0000 (18:17 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sun, 9 May 2010 18:17:33 +0000 (18:17 +0000)
2010-05-09  Richard Guenther  <rguenther@suse.de>

PR middle-end/44024
* fold-const.c (tree_single_nonzero_warnv_p): Properly
handle &FUNCTION_DECL.

* gcc.dg/pr44024.c: New testcase.

From-SVN: r159205

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr44024.c [new file with mode: 0644]

index 8879737b91cd4d740a248ae9d3ed07916f9fafcc..6551ac0ca53e67cc0a3f817482e63cee6d326f21 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-09  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/44024
+       * fold-const.c (tree_single_nonzero_warnv_p): Properly
+       handle &FUNCTION_DECL.
+
 2010-05-09  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/4784
index ffd9d30ef2e0a873bef76a4c7347d0bece934773..17a753692d5059fbef91ac54e061130f53f1861b 100644 (file)
@@ -14917,7 +14917,9 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
 
     case ADDR_EXPR:
       {
-       tree base = get_base_address (TREE_OPERAND (t, 0));
+       tree base = TREE_OPERAND (t, 0);
+       if (!DECL_P (base))
+         base = get_base_address (base);
 
        if (!base)
          return false;
@@ -14927,7 +14929,9 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
           allocated on the stack.  */
        if (DECL_P (base)
            && (flag_delete_null_pointer_checks
-               || (TREE_CODE (base) == VAR_DECL && !TREE_STATIC (base))))
+               || (DECL_CONTEXT (base)
+                   && TREE_CODE (DECL_CONTEXT (base)) == FUNCTION_DECL
+                   && auto_var_in_fn_p (base, DECL_CONTEXT (base)))))
          return !VAR_OR_FUNCTION_DECL_P (base) || !DECL_WEAK (base);
 
        /* Constants are never weak.  */
index cf4140d7691b6e388c75e19fae98c0bde97b9866..f0a10bba3919f1dc71c44cfd3e47f79b4fee0445 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-09  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/44024
+       * gcc.dg/pr44024.c: New testcase.
+
 2010-05-09  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/4784
diff --git a/gcc/testsuite/gcc.dg/pr44024.c b/gcc/testsuite/gcc.dg/pr44024.c
new file mode 100644 (file)
index 0000000..38f4153
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do link } */
+/* { dg-options "-fdelete-null-pointer-checks -fdump-tree-original" } */
+
+void foo();
+
+int main()
+{
+  if (foo == (void *)0)
+    link_error ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "foo" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */