On 12/21/15 14:45, Jeff Law wrote:
With some kind of comment in decl_in_symtab_p indicating why we need to check and filter on !DECL_IN_CONSTANT_POOL this is OK.
Done, thanks. (I half guessed HPPA might be such a port :) nathan
2015-12-23 Nathan Sidwell <nat...@acm.org> 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. Index: alias.c =================================================================== --- alias.c (revision 231927) +++ alias.c (working copy) @@ -2038,13 +2038,12 @@ compare_base_decls (tree base1, tree bas 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: cgraph.h =================================================================== --- cgraph.h (revision 231927) +++ cgraph.h (working copy) @@ -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: testsuite/gcc.dg/alias-15.c =================================================================== --- testsuite/gcc.dg/alias-15.c (revision 0) +++ testsuite/gcc.dg/alias-15.c (working copy) @@ -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" } } */