diff options
author | Martin Liska <mliska@suse.cz> | 2016-09-22 14:52:09 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2016-09-22 12:52:09 +0000 |
commit | a13f439f47a1b35ed273bfb34a96e01bb6c9c875 (patch) | |
tree | 9891dbd477cab298a615b1c6330961e48b27f24e /gcc | |
parent | 9ef2eff0d40fb59ee7538148fc8eb25088777297 (diff) | |
download | gcc-a13f439f47a1b35ed273bfb34a96e01bb6c9c875.zip gcc-a13f439f47a1b35ed273bfb34a96e01bb6c9c875.tar.gz gcc-a13f439f47a1b35ed273bfb34a96e01bb6c9c875.tar.bz2 |
re PR ipa/77653 (wrong code at -Os and above on x86_64-linux-gnu (in both 32-bit and 64-bit modes))
Fix PR ipa/77653
PR ipa/77653
* gcc.dg/ipa/pr77653.c: New test.
PR ipa/77653
* ipa-icf.c (sem_variable::merge): Yield merge operation if
alias address matters, not necessarily address of original.
From-SVN: r240354
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-icf.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ipa/pr77653.c | 24 |
4 files changed, 37 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c2b4470..f8ea8fa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-09-22 Martin Liska <mliska@suse.cz> + + PR ipa/77653 + * ipa-icf.c (sem_variable::merge): Yield merge operation if + alias address matters, not necessarily address of original. + 2016-09-22 Richard Biener <rguenther@suse.de> PR middle-end/77697 diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 798d833..0869756 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -2179,7 +2179,6 @@ sem_variable::merge (sem_item *alias_item) varpool_node *alias = alias_var->get_node (); bool original_discardable = false; - bool original_address_matters = original->address_matters_p (); bool alias_address_matters = alias->address_matters_p (); /* See if original is in a section that can be discarded if the main @@ -2222,13 +2221,11 @@ sem_variable::merge (sem_item *alias_item) } /* We can not merge if address comparsion metters. */ - if (original_address_matters && alias_address_matters - && flag_merge_constants < 2) + if (alias_address_matters && flag_merge_constants < 2) { if (dump_file) fprintf (dump_file, - "Not unifying; " - "adress of original and alias may be compared.\n\n"); + "Not unifying; adress of original may be compared.\n\n"); return false; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0891121..82a8676 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-09-22 Martin Liska <mliska@suse.cz> + + PR ipa/77653 + * gcc.dg/ipa/pr77653.c: New test. + 2016-09-22 Jakub Jelinek <jakub@redhat.com> PR fortran/77665 diff --git a/gcc/testsuite/gcc.dg/ipa/pr77653.c b/gcc/testsuite/gcc.dg/ipa/pr77653.c new file mode 100644 index 0000000..8d11739 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr77653.c @@ -0,0 +1,24 @@ +/* { dg-options "-O2 -fdump-ipa-icf-details" } */ + +int a, b, c, d, e, h, i, j, k, l; +const int f; +static int g; + +void fn1 (int p1) +{ + k = d ? c % k : a * b; + h &= j ^ i ^ 1; +} + +int main () +{ + const int *m = &f, **n = &m; + l && (*n = &e); + if (m != &f) + __builtin_abort (); + fn1 (g); + return 0; +} + +/* { dg-final { scan-ipa-dump "Equal symbols: 1" "icf" } } */ +/* { dg-final { scan-ipa-dump "Not unifying; adress of original may be compared." "icf" } } */ |