re PR ipa/77653 (wrong code at -Os and above on x86_64-linux-gnu (in both 32-bit...
authorMartin Liska <mliska@suse.cz>
Thu, 22 Sep 2016 12:52:09 +0000 (14:52 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 22 Sep 2016 12:52:09 +0000 (12:52 +0000)
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

gcc/ChangeLog
gcc/ipa-icf.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr77653.c [new file with mode: 0644]

index c2b4470..f8ea8fa 100644 (file)
@@ -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
index 798d833..0869756 100644 (file)
@@ -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;
     }
 
index 0891121..82a8676 100644 (file)
@@ -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 (file)
index 0000000..8d11739
--- /dev/null
@@ -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"  } } */