mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-23 01:50:33 +08:00
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
This commit is contained in:
parent
e738433e45
commit
2ace77c21a
@ -1,3 +1,8 @@
|
||||
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.
|
||||
|
@ -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);
|
||||
|
@ -1,3 +1,7 @@
|
||||
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,
|
||||
|
41
gcc/testsuite/g++.dg/ipa/devirt-21.C
Normal file
41
gcc/testsuite/g++.dg/ipa/devirt-21.C
Normal file
@ -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 <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" } } */
|
Loading…
x
Reference in New Issue
Block a user