Jan Hubicka
2014-10-05 04:54:14 UTC
Hi,
this patch is in mainline for a while, but apparently I forgot to attach
PR info to it, so it did not make it to the release branch.
Bootstrapped/regtested x86_64-linux, comitted.
Honza
PR ipa/61144
* varpool.c (ctor_for_folding): Do not fold WEAK symbols.
* gcc.dg/tree-ssa/pr61144.c: New testcase.
Index: varpool.c
===================================================================
--- varpool.c (revision 215895)
+++ varpool.c (working copy)
@@ -329,8 +329,16 @@ ctor_for_folding (tree decl)
/* Variables declared 'const' without an initializer
have zero as the initializer if they may not be
- overridden at link or run time. */
- if (!DECL_INITIAL (real_decl)
+ overridden at link or run time.
+
+ It is actually requirement for C++ compiler to optimize const variables
+ consistently. As a GNU extension, do not enfore this rule for user defined
+ weak variables, so we support interposition on:
+ static const int dummy = 0;
+ extern const int foo __attribute__((__weak__, __alias__("dummy")));
+ */
+ if ((!DECL_INITIAL (real_decl)
+ || (DECL_WEAK (decl) && !DECL_COMDAT (decl)))
&& (DECL_EXTERNAL (decl) || decl_replaceable_p (decl)))
return error_mark_node;
Index: testsuite/gcc.dg/tree-ssa/pr61144.c
===================================================================
--- testsuite/gcc.dg/tree-ssa/pr61144.c (revision 0)
+++ testsuite/gcc.dg/tree-ssa/pr61144.c (revision 0)
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-require-weak "" } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+static int dummy = 0;
+extern int foo __attribute__((__weak__, __alias__("dummy")));
+int bar() { if (foo) return 1; return 0; }
+/* { dg-final { scan-tree-dump-not "return 0" "optimized"} } */
this patch is in mainline for a while, but apparently I forgot to attach
PR info to it, so it did not make it to the release branch.
Bootstrapped/regtested x86_64-linux, comitted.
Honza
PR ipa/61144
* varpool.c (ctor_for_folding): Do not fold WEAK symbols.
* gcc.dg/tree-ssa/pr61144.c: New testcase.
Index: varpool.c
===================================================================
--- varpool.c (revision 215895)
+++ varpool.c (working copy)
@@ -329,8 +329,16 @@ ctor_for_folding (tree decl)
/* Variables declared 'const' without an initializer
have zero as the initializer if they may not be
- overridden at link or run time. */
- if (!DECL_INITIAL (real_decl)
+ overridden at link or run time.
+
+ It is actually requirement for C++ compiler to optimize const variables
+ consistently. As a GNU extension, do not enfore this rule for user defined
+ weak variables, so we support interposition on:
+ static const int dummy = 0;
+ extern const int foo __attribute__((__weak__, __alias__("dummy")));
+ */
+ if ((!DECL_INITIAL (real_decl)
+ || (DECL_WEAK (decl) && !DECL_COMDAT (decl)))
&& (DECL_EXTERNAL (decl) || decl_replaceable_p (decl)))
return error_mark_node;
Index: testsuite/gcc.dg/tree-ssa/pr61144.c
===================================================================
--- testsuite/gcc.dg/tree-ssa/pr61144.c (revision 0)
+++ testsuite/gcc.dg/tree-ssa/pr61144.c (revision 0)
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-require-weak "" } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+static int dummy = 0;
+extern int foo __attribute__((__weak__, __alias__("dummy")));
+int bar() { if (foo) return 1; return 0; }
+/* { dg-final { scan-tree-dump-not "return 0" "optimized"} } */