Message ID | 540E094C.1050700@redhat.com |
---|---|
State | New |
Headers | show |
> On 09/08/2014 03:51 PM, Jan Hubicka wrote: > >You did not attach the patch. > > Oops. OK, thanks! Honza > > > commit e57303b73d20fa75ffc535bbc219dc0f6472e431 > Author: Jason Merrill <jason@redhat.com> > Date: Mon Sep 8 13:11:58 2014 -0400 > > PR c++/61214 > PR c++/62224 > gcc/ > * gimple-fold.c (can_refer_decl_in_current_unit_p): Don't allow > reference to a DECL_EXTERNAL COMDAT. > gcc/cp/ > * decl2.c (decl_needed_p): Revert virtual functions change. > > diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c > index 944b5ee..5549075 100644 > --- a/gcc/cp/decl2.c > +++ b/gcc/cp/decl2.c > @@ -1940,11 +1940,6 @@ decl_needed_p (tree decl) > if (flag_keep_inline_dllexport > && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))) > return true; > - /* Virtual functions might be needed for devirtualization. */ > - if (flag_devirtualize > - && TREE_CODE (decl) == FUNCTION_DECL > - && DECL_VIRTUAL_P (decl)) > - return true; > /* Otherwise, DECL does not need to be emitted -- yet. A subsequent > reference to DECL might cause it to be emitted later. */ > return false; > diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c > index c6aea65..2527d29 100644 > --- a/gcc/gimple-fold.c > +++ b/gcc/gimple-fold.c > @@ -146,7 +146,8 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl) > The second is important when devirtualization happens during final > compilation stage when making a new reference no longer makes callee > to be compiled. */ > - if (!node || !node->definition || node->global.inlined_to) > + if (!node || !node->definition > + || DECL_EXTERNAL (decl) || node->global.inlined_to) > { > gcc_checking_assert (!TREE_ASM_WRITTEN (decl)); > return false; > diff --git a/gcc/testsuite/g++.dg/ipa/devirt-39.C b/gcc/testsuite/g++.dg/ipa/devirt-39.C > index fbeea12..8cd734d 100644 > --- a/gcc/testsuite/g++.dg/ipa/devirt-39.C > +++ b/gcc/testsuite/g++.dg/ipa/devirt-39.C > @@ -1,5 +1,5 @@ > // PR c++/61214 > -/* { dg-options "-O2 -fdump-tree-optimized" } */ > +/* { dg-options "-O2" } */ > > struct Base > { > @@ -24,5 +24,4 @@ int main() > return 0; > } > > -/* { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "optimized" } } */ > -/* { dg-final { cleanup-tree-dump "optimized" } } */ > +/* { dg-final { scan-assembler-not "_ZN3Foo5cloneEv" } } */ > diff --git a/gcc/testsuite/g++.dg/ipa/devirt-40.C b/gcc/testsuite/g++.dg/ipa/devirt-40.C > new file mode 100644 > index 0000000..9c3bdf5 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/ipa/devirt-40.C > @@ -0,0 +1,21 @@ > +// PR c++/62224 > +// { dg-options "-O2" } > +// For 4.9, we don't want to devirtualize f and thus create a reference to g. > + > +struct A > +{ > + virtual void f () = 0; > +}; > + > +class B : A > +{ > + virtual void f () { g(); } > + void g(); > +}; > + > +void h (A *a) > +{ > + a->f (); > +} > + > +// { dg-final { scan-assembler-not "_ZN1B1gEv" } }
commit e57303b73d20fa75ffc535bbc219dc0f6472e431 Author: Jason Merrill <jason@redhat.com> Date: Mon Sep 8 13:11:58 2014 -0400 PR c++/61214 PR c++/62224 gcc/ * gimple-fold.c (can_refer_decl_in_current_unit_p): Don't allow reference to a DECL_EXTERNAL COMDAT. gcc/cp/ * decl2.c (decl_needed_p): Revert virtual functions change. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 944b5ee..5549075 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1940,11 +1940,6 @@ decl_needed_p (tree decl) if (flag_keep_inline_dllexport && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))) return true; - /* Virtual functions might be needed for devirtualization. */ - if (flag_devirtualize - && TREE_CODE (decl) == FUNCTION_DECL - && DECL_VIRTUAL_P (decl)) - return true; /* Otherwise, DECL does not need to be emitted -- yet. A subsequent reference to DECL might cause it to be emitted later. */ return false; diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index c6aea65..2527d29 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -146,7 +146,8 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl) The second is important when devirtualization happens during final compilation stage when making a new reference no longer makes callee to be compiled. */ - if (!node || !node->definition || node->global.inlined_to) + if (!node || !node->definition + || DECL_EXTERNAL (decl) || node->global.inlined_to) { gcc_checking_assert (!TREE_ASM_WRITTEN (decl)); return false; diff --git a/gcc/testsuite/g++.dg/ipa/devirt-39.C b/gcc/testsuite/g++.dg/ipa/devirt-39.C index fbeea12..8cd734d 100644 --- a/gcc/testsuite/g++.dg/ipa/devirt-39.C +++ b/gcc/testsuite/g++.dg/ipa/devirt-39.C @@ -1,5 +1,5 @@ // PR c++/61214 -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2" } */ struct Base { @@ -24,5 +24,4 @@ int main() return 0; } -/* { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "optimized" } } */ -/* { dg-final { cleanup-tree-dump "optimized" } } */ +/* { dg-final { scan-assembler-not "_ZN3Foo5cloneEv" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/devirt-40.C b/gcc/testsuite/g++.dg/ipa/devirt-40.C new file mode 100644 index 0000000..9c3bdf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-40.C @@ -0,0 +1,21 @@ +// PR c++/62224 +// { dg-options "-O2" } +// For 4.9, we don't want to devirtualize f and thus create a reference to g. + +struct A +{ + virtual void f () = 0; +}; + +class B : A +{ + virtual void f () { g(); } + void g(); +}; + +void h (A *a) +{ + a->f (); +} + +// { dg-final { scan-assembler-not "_ZN1B1gEv" } }
On 09/08/2014 03:51 PM, Jan Hubicka wrote: > You did not attach the patch. Oops.