aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-03-27 10:50:55 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-03-27 10:50:55 +0000
commitc5e5f5f6429b05b47110f8dea839ec055d69bb4f (patch)
tree436db44226b3bbc595fc9db8b13e1d3a7ecce101
parent7cd200f63f80396e9ddfe163a3fed86fd2aed672 (diff)
downloadgcc-c5e5f5f6429b05b47110f8dea839ec055d69bb4f.zip
gcc-c5e5f5f6429b05b47110f8dea839ec055d69bb4f.tar.gz
gcc-c5e5f5f6429b05b47110f8dea839ec055d69bb4f.tar.bz2
re PR ipa/79776 (ICE on valid code in insert_vi_for_tree, at tree-ssa-structalias.c:2807)
2017-03-27 Richard Biener <rguenther@suse.de> PR ipa/79776 * tree-ssa-structalias.c (associate_varinfo_to_alias): Skip inlined thunk clones. * g++.dg/ipa/pr79776.C: New testcase. From-SVN: r246494
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr79776.C29
-rw-r--r--gcc/tree-ssa-structalias.c4
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2f40b8..2997a00 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-03-27 Richard Biener <rguenther@suse.de>
+
+ PR ipa/79776
+ * tree-ssa-structalias.c (associate_varinfo_to_alias): Skip
+ inlined thunk clones.
+
2017-03-27 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/80168
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3a8e22e..169a2ca 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-03-27 Richard Biener <rguenther@suse.de>
+
+ PR ipa/79776
+ * g++.dg/ipa/pr79776.C: New testcase.
+
2017-03-27 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/80168
diff --git a/gcc/testsuite/g++.dg/ipa/pr79776.C b/gcc/testsuite/g++.dg/ipa/pr79776.C
new file mode 100644
index 0000000..2d53ed3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr79776.C
@@ -0,0 +1,29 @@
+// PR ipa/71146
+// { dg-do compile }
+// { dg-options "-O3 -fipa-pta" }
+
+typedef enum { X } E;
+struct A {
+ virtual void bar ();
+};
+struct B {
+ virtual E fn (const char *, int, int *) = 0;
+};
+struct C : A, B {
+ E fn (const char *, int, int *);
+ void fn2 ();
+ B *foo;
+};
+void C::fn2 () {
+ if (!foo)
+ return;
+ foo->fn (0, 0, 0);
+}
+E
+C::fn (const char *, int, int *)
+{
+ fn2 ();
+ foo = 0;
+ fn (0, 0, 0);
+ return X;
+}
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index c043e5e..aab6821 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -7615,7 +7615,9 @@ struct pt_solution ipa_escaped_pt
static bool
associate_varinfo_to_alias (struct cgraph_node *node, void *data)
{
- if ((node->alias || node->thunk.thunk_p)
+ if ((node->alias
+ || (node->thunk.thunk_p
+ && ! node->global.inlined_to))
&& node->analyzed)
insert_vi_for_tree (node->decl, (varinfo_t)data);
return false;