aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Trippelsdorf <trippels@gcc.gnu.org>2014-11-25 07:41:48 +0000
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>2014-11-25 07:41:48 +0000
commita5b58b283d4f139da5cca26af936ddb65dd4ad7c (patch)
tree4c0ff73cb0c4d815369df604de4e0b12c0e4f55c
parent02ba3fc22d5b4101f99bd5b0cc5101a04cdd0eb2 (diff)
downloadgcc-a5b58b283d4f139da5cca26af936ddb65dd4ad7c.zip
gcc-a5b58b283d4f139da5cca26af936ddb65dd4ad7c.tar.gz
gcc-a5b58b283d4f139da5cca26af936ddb65dd4ad7c.tar.bz2
re PR ipa/64059 (ICE: Segmentation fault in ipa-polymorphic-call.c:1593)
Fix PR64059 * ipa-prop.c (ipa_analyze_call_uses): Don't call get_dynamic_type when devirtualization is disabled. From-SVN: r218038
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-prop.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr64059.C56
4 files changed, 68 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5db7497..8ff9c72 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-11-25 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/64059
+ * ipa-prop.c (ipa_analyze_call_uses): Don't call get_dynamic_type when
+ devirtualization is disabled.
+
2014-11-24 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/63965
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 2e0016b..eeffda4 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -2155,7 +2155,7 @@ ipa_analyze_call_uses (struct func_body_info *fbi, gcall *call)
if (cs && !cs->indirect_unknown_callee)
return;
- if (cs->indirect_info->polymorphic)
+ if (cs->indirect_info->polymorphic && flag_devirtualize)
{
tree instance;
tree target = gimple_call_fn (call);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cee2f3d..147674e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-25 Markus Trippelsdorf <markus@trippelsdorf.de>
+
+ PR ipa/64059
+ * g++.dg/ipa/pr64059.C: New test.
+
2014-11-24 Uros Bizjak <ubizjak@gmail.com>
PR target/63847
diff --git a/gcc/testsuite/g++.dg/ipa/pr64059.C b/gcc/testsuite/g++.dg/ipa/pr64059.C
new file mode 100644
index 0000000..0269b45
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr64059.C
@@ -0,0 +1,56 @@
+// { dg-options "-r -nostdlib -O2 -flto -fno-devirtualize" }
+// { dg-require-effective-target lto }
+
+class A;
+class B
+{
+public:
+ A *operator->();
+};
+class C
+{
+public:
+ virtual void m_fn1 ();
+};
+class A
+{
+public:
+ C *m_fn2 ();
+};
+class D
+{
+public:
+ void
+ m_fn3 ()
+ {
+ list_m->m_fn2 ()->m_fn1 ();
+ }
+ B list_m;
+};
+
+class F
+{
+public:
+ D m_fn4 ();
+};
+class G
+{
+public:
+ F m_fn5 (int, int);
+};
+class H
+{
+public:
+ void
+ m_fn6 ()
+ {
+ fieldEngine_m.m_fn5 (0, 0).m_fn4 ().m_fn3 ();
+ }
+ G fieldEngine_m;
+};
+
+void
+fn1 (H a)
+{
+ a.m_fn6 ();
+}