+2014-02-02 Jan Hubicka <hubicka@ucw.cz>
+
+ * ipa-prop.c (update_jump_functions_after_inlining): When type is not
+ preserverd by passthrough, do not propagate the type.
+
2014-02-02 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.c (MIPS_GET_FCSR, MIPS_SET_FCSR): New macros.
dst->type = IPA_JF_UNKNOWN;
break;
case IPA_JF_KNOWN_TYPE:
- ipa_set_jf_known_type (dst,
- ipa_get_jf_known_type_offset (src),
- ipa_get_jf_known_type_base_type (src),
- ipa_get_jf_known_type_base_type (src));
+ if (ipa_get_jf_pass_through_type_preserved (dst))
+ ipa_set_jf_known_type (dst,
+ ipa_get_jf_known_type_offset (src),
+ ipa_get_jf_known_type_base_type (src),
+ ipa_get_jf_known_type_base_type (src));
+ else
+ dst->type = IPA_JF_UNKNOWN;
break;
case IPA_JF_CONST:
ipa_set_jf_cst_copy (dst, src);
+2014-02-02 Jan Hubicka <hubicka@ucw.cz>
+
+ * g++.dg/ipa/devirt-23.C: New testcase.
+
2014-02-02 Richard Sandiford <rdsandiford@googlemail.com>
* gcc.target/mips/get-fcsr-1.c, gcc.target/mips/get-fcsr-2.c,
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */
+/* Main purpose is to verify that we do not produce wrong devirtualization to
+ C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */
+#include <stdlib.h>
+class A {
+public:
+ unsigned length;
+};
+class B {};
+class MultiTermDocs : public virtual B {
+protected:
+ A readerTermDocs;
+ A subReaders;
+ virtual B *m_fn1(int *) {}
+ virtual inline ~MultiTermDocs();
+ void wrap(void)
+ {
+ m_fn1(NULL);
+ }
+};
+class C : MultiTermDocs {
+ B *m_fn1(int *);
+};
+MultiTermDocs::~MultiTermDocs() {
+ wrap ();
+ if (&readerTermDocs) {
+ B *a;
+ for (unsigned i = 0; i < subReaders.length; i++)
+ (a != 0);
+ }
+}
+
+B *C::m_fn1(int *) { abort (); }
+
+main()
+{
+ class C c;
+}
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */