alias.c (compare_base_decls): Simplify in-symtab check.
authorNathan Sidwell <nathan@acm.org>
Wed, 23 Dec 2015 14:47:39 +0000 (14:47 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 23 Dec 2015 14:47:39 +0000 (14:47 +0000)
gcc/
* alias.c (compare_base_decls): Simplify in-symtab check.
* cgraph.h (decl_in_symtab_p): Check DECL_IN_CONSTANT_POOL.

testsuite/
* gcc.dg/alias-15.c: New.

From-SVN: r231928

gcc/ChangeLog
gcc/alias.c
gcc/cgraph.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/alias-15.c [new file with mode: 0644]

index d01894a58ddf585e926acbf8fffaaf29c49c63d2..e789c11c8ece61ff0498d60b07bfc5d4c320f5e9 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-23  Nathan Sidwell  <nathan@acm.org>
+
+       * alias.c (compare_base_decls): Simplify in-symtab check.
+       * cgraph.h (decl_in_symtab_p): Check DECL_IN_CONSTANT_POOL.
+
 2015-12-23  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
        * config/s390/predicates.md ("larl_operand"): Remove now superfluous
index 1ab96008743902f5b05e1ab1ebd483a25fe6adbb..42a974a5970e4dbf7a93351e0e468500ff7623b3 100644 (file)
@@ -2038,13 +2038,12 @@ compare_base_decls (tree base1, tree base2)
   if (base1 == base2)
     return 1;
 
-  bool in_symtab1 = decl_in_symtab_p (base1);
-  bool in_symtab2 = decl_in_symtab_p (base2);
-
   /* Declarations of non-automatic variables may have aliases.  All other
      decls are unique.  */
-  if (in_symtab1 != in_symtab2 || !in_symtab1)
+  if (!decl_in_symtab_p (base1)
+      || !decl_in_symtab_p (base2))
     return 0;
+
   ret = symtab_node::get_create (base1)->equal_address_to
                 (symtab_node::get_create (base2), true);
   if (ret == 2)
index ba14215ed6f1b0e88b004c12c851534be9704a2a..fe7c1940c4e1d86126270f9bf4cb7998aad7198c 100644 (file)
@@ -2294,13 +2294,19 @@ symtab_node::real_symbol_p (void)
 }
 
 /* Return true if DECL should have entry in symbol table if used.
-   Those are functions and static & external veriables*/
+   Those are functions and static & external non-constpool variables.
+   We do not expect constant pool variables in the varpool, as they're
+   not related to other variables, and simply lazily inserting them
+   using the regular interface results in varpool thinking they are
+   externally provided -- which results in erroneous assembly emission
+   as an undefined decl.  */
 
 static inline bool
 decl_in_symtab_p (const_tree decl)
 {
   return (TREE_CODE (decl) == FUNCTION_DECL
           || (TREE_CODE (decl) == VAR_DECL
+             && !DECL_IN_CONSTANT_POOL (decl)
              && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))));
 }
 
index 1924c24002e1b40c59939a334352d97a5f7c928a..79a1827e66562eea20f767ea7cd504bbb1bd9d73 100644 (file)
@@ -1,3 +1,7 @@
+2015-12-23  Nathan Sidwell  <nathan@acm.org>
+
+       * gcc.dg/alias-15.c: New. 
+
 2015-12-23  Thomas Schwinge  <thomas@codesourcery.com>
 
        * g++.dg/dg.exp (tests): Prune "goacc/*" and "goacc-gomp/*" files.
diff --git a/gcc/testsuite/gcc.dg/alias-15.c b/gcc/testsuite/gcc.dg/alias-15.c
new file mode 100644 (file)
index 0000000..0a8e69b
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-additional-options  "-O2 -fdump-ipa-cgraph" } */
+
+/* RTL-level CSE shouldn't introduce LCO (for the string) into varpool */
+char *p;
+
+void foo ()
+{
+  p = "abc\n";
+
+  while (*p != '\n')
+    p++;
+}
+
+/* { dg-final { scan-ipa-dump-not "LC0" "cgraph" } } */