aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-01-20 13:26:19 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-01-20 13:26:19 +0000
commit2fd2ae3458ca760040ddb65a45f45fb2e89f2779 (patch)
treeaf742886d1ebe018b2c605867c7bda3ec915fc88 /gcc
parent7d56e747e271356ccaecfa2adbf2516c0c316649 (diff)
downloadgcc-2fd2ae3458ca760040ddb65a45f45fb2e89f2779.zip
gcc-2fd2ae3458ca760040ddb65a45f45fb2e89f2779.tar.gz
gcc-2fd2ae3458ca760040ddb65a45f45fb2e89f2779.tar.bz2
re PR lto/64684 (wrong code by LTO on x86_64-linux-gnu)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ipa-reference.c30
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr64684_0.c13
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr64684_1.c9
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr64684_2.c16
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr64685_0.c10
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr64685_1.c27
8 files changed, 100 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3ad6b9d..763f105 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
index 6a677ca..5f43a02 100644
--- a/gcc/ipa-reference.c
+++ b/gcc/ipa-reference.c
@@ -236,21 +236,6 @@ ipa_reference_get_not_written_global (struct cgraph_node *fn)
}
-
-/* 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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3af24f4..1049e67 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8988350
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr64684_0.c
@@ -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
index 0000000..f65af2d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr64684_1.c
@@ -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
index 0000000..fe077c3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr64684_2.c
@@ -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
index 0000000..6ebc9ea
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr64685_0.c
@@ -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
index 0000000..38022d3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr64685_1.c
@@ -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;
+}