Commit 2ace77c2 by Jan Hubicka Committed by Jan Hubicka

ipa-prop.c (update_jump_functions_after_inlining): When type is not preserverd…

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
parent e738433e
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);
......
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,
......
/* { 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment