From 2ace77c21a7f35b9d98b8a6ecd7d95f5b0c30b1a Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sun, 2 Feb 2014 19:56:33 +0100 Subject: [PATCH] ipa-prop.c (update_jump_functions_after_inlining): When type is not preserverd by passthrough, do not propagate the type. * ipa-prop.c (update_jump_functions_after_inlining): When type is not preserverd by passthrough, do not propagate the type. * g++.dg/ipa/devirt-23.C: New testcase. From-SVN: r207405 --- gcc/ChangeLog | 5 ++++ gcc/ipa-prop.c | 11 +++++--- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.dg/ipa/devirt-21.C | 41 ++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/devirt-21.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index af84338d9f1..09b1208ec94 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-02-02 Jan Hubicka + + * 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 * config/mips/mips.c (MIPS_GET_FCSR, MIPS_SET_FCSR): New macros. diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index af2e22392b0..f8a1ca4f3d4 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -2359,10 +2359,13 @@ update_jump_functions_after_inlining (struct cgraph_edge *cs, 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f27d7ea85f..0e17c17166a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-02-02 Jan Hubicka + + * g++.dg/ipa/devirt-23.C: New testcase. + 2014-02-02 Richard Sandiford * gcc.target/mips/get-fcsr-1.c, gcc.target/mips/get-fcsr-2.c, diff --git a/gcc/testsuite/g++.dg/ipa/devirt-21.C b/gcc/testsuite/g++.dg/ipa/devirt-21.C new file mode 100644 index 00000000000..99f60afe33c --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-21.C @@ -0,0 +1,41 @@ +/* { 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 +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" } } */ -- 2.30.2