Make ipa-icf to not prevent devirtualization

Richard Biener richard.guenther@gmail.com
Fri Jan 15 11:33:00 GMT 2016


On Fri, Jan 15, 2016 at 12:01 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> this patch avoid ipa-icf to take away body of a virtual function which is a subject
> of later devirtualization.

But isn't can_remove_if_no_direct_alls_p () supposed to return false
then?  (depending
on cgraph state)

Richard.

> Bootstrapped/regtested x86_64-linux, comitted.
>
> Honza
>
>         PR ipa/68148
>         * ipa-icf.c (sem_function::merge): Virtual functions may become
>         reachable even if they address is not taken and there are no
>         idrect calls.
>         * testsuite/g++.dg/ipa/devirt-49.C: New testcase.
>
> Index: ipa-icf.c
> ===================================================================
> --- ipa-icf.c   (revision 232407)
> +++ ipa-icf.c   (working copy)
> @@ -1305,6 +1305,7 @@ sem_function::merge (sem_item *alias_ite
>
>        /* If all callers was redirected, do not produce wrapper.  */
>        if (alias->can_remove_if_no_direct_calls_p ()
> +         && !DECL_VIRTUAL_P (alias->decl)
>           && !alias->has_aliases_p ())
>         {
>           create_wrapper = false;
> Index: testsuite/g++.dg/ipa/devirt-49.C
> ===================================================================
> --- testsuite/g++.dg/ipa/devirt-49.C    (revision 0)
> +++ testsuite/g++.dg/ipa/devirt-49.C    (revision 0)
> @@ -0,0 +1,20 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-ipa-devirt"  } */
> +struct Interface {
> +  virtual ~Interface() {}
> +  virtual void virtualFunc() = 0;
> +  virtual void virtualFunc2() = 0;
> +};
> +
> +struct Concrete : Interface {
> +  int counter_;
> +  Concrete() : counter_(0) {}
> +  void virtualFunc() { counter_++; }
> +  void virtualFunc2() { counter_++; }
> +};
> +
> +void test(Interface &c) {
> +  c.virtualFunc();
> +  c.virtualFunc2();
> +}
> +/* { dg-final { scan-ipa-dump "2 speculatively devirtualized" "devirt"  } } */



More information about the Gcc-patches mailing list