From 7ec4f3438cd3fc7a83a32d6c9b910b26a220376e Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 23 Dec 2015 14:47:39 +0000 Subject: [PATCH] alias.c (compare_base_decls): Simplify in-symtab check. 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 | 5 +++++ gcc/alias.c | 7 +++---- gcc/cgraph.h | 8 +++++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/alias-15.c | 15 +++++++++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/alias-15.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d01894a58dd..e789c11c8ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-12-23 Nathan Sidwell + + * 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 * config/s390/predicates.md ("larl_operand"): Remove now superfluous diff --git a/gcc/alias.c b/gcc/alias.c index 1ab96008743..42a974a5970 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -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) diff --git a/gcc/cgraph.h b/gcc/cgraph.h index ba14215ed6f..fe7c1940c4e 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -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)))); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1924c24002e..79a1827e665 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-12-23 Nathan Sidwell + + * gcc.dg/alias-15.c: New. + 2015-12-23 Thomas Schwinge * 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 index 00000000000..0a8e69b61ec --- /dev/null +++ b/gcc/testsuite/gcc.dg/alias-15.c @@ -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" } } */ -- 2.30.2