re PR lto/64684 (wrong code by LTO on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Tue, 20 Jan 2015 13:26:19 +0000 (13:26 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 20 Jan 2015 13:26:19 +0000 (13:26 +0000)
2015-01-20  Richard Biener  <rguenther@suse.de>

PR ipa/64684
* ipa-reference.c (add_static_var): Inline ...
(analyze_function): ... here after splitting out from ...
(is_proper_for_analysis): ... this.

* gcc.dg/lto/pr64684_0.c: New testcase.
* gcc.dg/lto/pr64684_1.c: Likewise.
* gcc.dg/lto/pr64684_2.c: Likewise.
* gcc.dg/lto/pr64685_0.c: Likewise.
* gcc.dg/lto/pr64685_1.c: Likewise.

From-SVN: r219892

gcc/ChangeLog
gcc/ipa-reference.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/pr64684_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr64684_1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr64684_2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr64685_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr64685_1.c [new file with mode: 0644]

index 3ad6b9d6bfbc2d3c41971c1ed716f7ef11a13947..763f105f6ba658a42d1bd280c167b744541d019a 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-20  Richard Biener  <rguenther@suse.de>
+
+       PR ipa/64684
+       * ipa-reference.c (add_static_var): Inline ...
+       (analyze_function): ... here after splitting out from ...
+       (is_proper_for_analysis): ... this.
+
 2015-01-20  Matthew Wahab  <matthew.wahab@arm.com>
 
        PR target/64149
index 6a677ca502c5248537eb5770e3b4af542a9a91f7..5f43a02a1e182b71f7c14befd11e0d4a6f4c127e 100644 (file)
@@ -236,21 +236,6 @@ ipa_reference_get_not_written_global (struct cgraph_node *fn)
 }
 
 \f
-
-/* Add VAR to all_module_statics and the two
-   reference_vars_to_consider* sets.  */
-
-static inline void
-add_static_var (tree var)
-{
-  int uid = DECL_UID (var);
-  gcc_assert (TREE_CODE (var) == VAR_DECL);
-  if (dump_file)
-    splay_tree_insert (reference_vars_to_consider,
-                      uid, (splay_tree_value)var);
-  bitmap_set_bit (all_module_statics, uid);
-}
-
 /* Return true if the variable T is the right kind of static variable to
    perform compilation unit scope escape analysis.  */
 
@@ -285,12 +270,6 @@ is_proper_for_analysis (tree t)
   if (bitmap_bit_p (ignore_module_statics, DECL_UID (t)))
     return false;
 
-  /* This is a variable we care about.  Check if we have seen it
-     before, and if not add it the set of variables we care about.  */
-  if (all_module_statics
-      && !bitmap_bit_p (all_module_statics, DECL_UID (t)))
-    add_static_var (t);
-
   return true;
 }
 
@@ -497,6 +476,15 @@ analyze_function (struct cgraph_node *fn)
       var = ref->referred->decl;
       if (!is_proper_for_analysis (var))
        continue;
+      /* This is a variable we care about.  Check if we have seen it
+        before, and if not add it the set of variables we care about.  */
+      if (all_module_statics
+         && bitmap_set_bit (all_module_statics, DECL_UID (var)))
+       {
+         if (dump_file)
+           splay_tree_insert (reference_vars_to_consider,
+                              DECL_UID (var), (splay_tree_value)var);
+       }
       switch (ref->use)
        {
        case IPA_REF_LOAD:
index 3af24f4255cb06fa5212d125bd60b82fc73521ab..1049e672c0fa7ed8ca9179b43284068919cc45b2 100644 (file)
@@ -1,3 +1,12 @@
+2015-01-20  Richard Biener  <rguenther@suse.de>
+
+       PR ipa/64684
+       * gcc.dg/lto/pr64684_0.c: New testcase.
+       * gcc.dg/lto/pr64684_1.c: Likewise.
+       * gcc.dg/lto/pr64684_2.c: Likewise.
+       * gcc.dg/lto/pr64685_0.c: Likewise.
+       * gcc.dg/lto/pr64685_1.c: Likewise.
+
 2015-01-20  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/62241
diff --git a/gcc/testsuite/gcc.dg/lto/pr64684_0.c b/gcc/testsuite/gcc.dg/lto/pr64684_0.c
new file mode 100644 (file)
index 0000000..8988350
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { { -O1 -flto } } } */
+
+extern void fn2 (void);
+extern int a;
+
+void
+fn1 ()
+{
+  a = -1;
+  fn2 ();
+  a &= 1;
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr64684_1.c b/gcc/testsuite/gcc.dg/lto/pr64684_1.c
new file mode 100644 (file)
index 0000000..f65af2d
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-options "-Os" } */
+
+extern int a;
+
+void
+fn2 (void)
+{
+  a = 0;
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr64684_2.c b/gcc/testsuite/gcc.dg/lto/pr64684_2.c
new file mode 100644 (file)
index 0000000..fe077c3
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-options "-O0" } */
+
+extern void fn1 (void);
+
+int a;
+
+int
+main ()
+{
+  fn1 ();
+
+  if (a != 0) 
+    __builtin_abort (); 
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr64685_0.c b/gcc/testsuite/gcc.dg/lto/pr64685_0.c
new file mode 100644 (file)
index 0000000..6ebc9ea
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { { -flto } } } */
+
+extern int b;
+
+void
+fn1 (void)
+{
+    b = 0;
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr64685_1.c b/gcc/testsuite/gcc.dg/lto/pr64685_1.c
new file mode 100644 (file)
index 0000000..38022d3
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-options "-O1" } */
+
+extern void fn1 (void); 
+
+int a[2], b;
+
+static void
+foo (int p)
+{
+  b = 1 ^ a[(b ^ 1) & 1];
+  b = 1 ^ a[b & 1];
+  if (p)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo (0);
+  b = 0;
+  foo (0);
+
+  if (b != 1)
+    __builtin_abort ();
+
+  return 0;
+}