diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1c15a1eba54..2ef225e192b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2014-03-05 Jakub Jelinek <jakub@redhat.com> + + PR lto/60404 + * cfgexpand.c (expand_used_vars): Do not assume all SSA_NAMEs + of PARM/RESULT_DECLs must be coalesced with optimize && in_lto_p. + * tree-ssa-coalesce.c (coalesce_ssa_name): Use MUST_COALESCE_COST - 1 + cost for in_lto_p. + 2014-03-04 Heiher <r@hev.cc> * config/mips/mips-cpus.def (loongson3a): Mark as a MIPS64r2 processor. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 5c23b72ee7d..dd163a5f8c5 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1652,10 +1652,12 @@ expand_used_vars (void) debug info, there is no need to do so if optimization is disabled because all the SSA_NAMEs based on these DECLs have been coalesced into a single partition, which is thus assigned the canonical RTL - location of the DECLs. */ + location of the DECLs. If in_lto_p, we can't rely on optimize, + a function could be compiled with -O1 -flto first and only the + link performed at -O0. */ if (TREE_CODE (SSA_NAME_VAR (var)) == VAR_DECL) expand_one_var (var, true, true); - else if (DECL_IGNORED_P (SSA_NAME_VAR (var)) || optimize) + else if (DECL_IGNORED_P (SSA_NAME_VAR (var)) || optimize || in_lto_p) { /* This is a PARM_DECL or RESULT_DECL. For those partitions that contain the default def (representing the parm or result itself) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f9fa2b9deef..e9258f3da83 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2014-03-05 Jakub Jelinek <jakub@redhat.com> + + PR lto/60404 + * gcc.dg/lto/pr60404_0.c: New test. + * gcc.dg/lto/pr60404_1.c: New file. + * gcc.dg/lto/pr60404_2.c: New file. + 2014-03-04 Bill Schmidt <wschmidt@linux.vnet.ibm.com> * gcc.dg/vmx/extract-vsx.c: Replace "vector long" with "vector diff --git a/gcc/testsuite/gcc.dg/lto/pr60404_0.c b/gcc/testsuite/gcc.dg/lto/pr60404_0.c new file mode 100644 index 00000000000..a22216db207 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr60404_0.c @@ -0,0 +1,15 @@ +/* { dg-lto-do run } */ +/* { dg-lto-options { { -O1 -flto } } } */ +/* { dg-extra-ld-options { -O0 } } */ + +extern void fn2 (int); +int a[1], b; + +int +main () +{ + fn2 (0); + if (b != 0 || a[b] != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/lto/pr60404_1.c b/gcc/testsuite/gcc.dg/lto/pr60404_1.c new file mode 100644 index 00000000000..8c1259803f5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr60404_1.c @@ -0,0 +1,4 @@ +void +fn1 (int p) +{ +} diff --git a/gcc/testsuite/gcc.dg/lto/pr60404_2.c b/gcc/testsuite/gcc.dg/lto/pr60404_2.c new file mode 100644 index 00000000000..e1db02409a8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr60404_2.c @@ -0,0 +1,9 @@ +extern int b; +extern void fn1 (int); + +void +fn2 (int p) +{ + b = p++; + fn1 (p); +} diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c index 86276b361a6..9a1ac67bf77 100644 --- a/gcc/tree-ssa-coalesce.c +++ b/gcc/tree-ssa-coalesce.c @@ -1289,9 +1289,12 @@ coalesce_ssa_name (void) _require_ that all the names originating from it be coalesced, because there must be a single partition containing all the names so that it can be assigned - the canonical RTL location of the DECL safely. */ + the canonical RTL location of the DECL safely. + If in_lto_p, a function could have been compiled + originally with optimizations and only the link + performed at -O0, so we can't actually require it. */ const int cost - = TREE_CODE (SSA_NAME_VAR (a)) == VAR_DECL + = (TREE_CODE (SSA_NAME_VAR (a)) == VAR_DECL || in_lto_p) ? MUST_COALESCE_COST - 1 : MUST_COALESCE_COST; add_coalesce (cl, SSA_NAME_VERSION (a), SSA_NAME_VERSION (*slot), cost);