public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Guenther <rguenther@suse.de>
To: Jan Hubicka <hubicka@ucw.cz>
Cc: gcc-patches@gcc.gnu.org, mjambor@suse.cz
Subject: Re: Remove vtable_method field in cgraph_node
Date: Sun, 17 Apr 2011 21:27:00 -0000	[thread overview]
Message-ID: <alpine.LNX.2.00.1104172143120.810@zhemvz.fhfr.qr> (raw)
In-Reply-To: <20110417163459.GH5273@kam.mff.cuni.cz>

On Sun, 17 Apr 2011, Jan Hubicka wrote:

> Hi,
> this patch drops vtable_method filed. I never understood what it is about but reading
> PR20991 I am convinced that we hit the same problem with work on new devirutalization code.
> I implemented what Mark describe as "ideal solution" there - i.e. teaching cgraph that
> virtual functions might become reachable until after inlining.  Since we still can
> devirutalize in late compilation (that is pretty much poinless but anyway), we no
> ahve can_refer_decl_in_current_unit_p that tests if the function has been already thrown
> away.  Perhaps we might apply there the observation about vtable being output somewhere,
> but I do not think it is safe: if vtable is COMDAT, we can pretty much also optimize
> all references to it out in all compilation unit and up not outputting it.
> When vtable is not COMDAT, the methods won't be either and this trick will not apply.
> 
> Consequently I am dropping the flag. This is very trivial based on observation
> that cp_fold_obj_type_ref, the only setter of the flag, is now dead. Plus the
> varasm code is no-longer executed at the time of IPA optimizations that the original
> patch was fixing.
> 
> Martin,
> can you please look into why cp_fold_obj_type_ref is no longer used and if possible
> get rid of it?
> 
> Richi,
> compiling the original testcase:
> // PR middle-end/20991
> // { dg-options "-O2" }
> // { dg-do compile }
> 
> struct S
> {
>   virtual inline int foo () const;
>   virtual inline bool bar () const;
>   virtual int baz (int) const;
> };
> 
> inline int S::foo () const
> {
>   return 1;
> }
> 
> inline bool S::bar () const
> {
>   return foo () == 0;
> }
> 
> void A ()
> {
>   S s;
>   if (s.bar ())
>     s.foo ();
> }
> 
> void B ()
> {
>   S s;
>   if (s.bar ())
>     s.foo ();
> }
> 
> we end up with bit amusing code:
> void B() ()
> { 
>   int D.2147;
>   struct S s;
> 
> <bb 2>:
>   s._vptr.S = &_ZTV1S[2];
>   D.2147_8 = OBJ_TYPE_REF(foo;&s->0) (&s);
>   return;
> 
> }
> 
> notice that OBJ_TYPE_REF is useless since foo got devitualized and it holds alive
> the useless s._vptr.S = &_ZTV1S[2].  We want to drop OBJ_TYPE_REF at time we fold
> first argument to constant.

At some point we dropped all OBJ_TYPE_REF with direct fn but that lead to
issues.  I'll try to dig up what that was.

Richard.

> a.C.027t.fre1 dump reads:
> void B() ()
> {
>   int (*__vtbl_ptr_type) () * D.2149;
>   int (*__vtbl_ptr_type) () D.2148;
>   int D.2147;
>   bool D.2146;
>   struct S s;
> 
> <bb 2>:
>   s._vptr.S = &_ZTV1S[2];
>   D.2149_6 = &_ZTV1S[2];
>   D.2148_7 = foo;
>   D.2147_8 = OBJ_TYPE_REF(D.2148_7;&s->0) (&s);
>   D.2146_9 = D.2147_8 == 0;
>   D.2146_12 = D.2146_9;
>   D.2146_1 = D.2146_12;
>   D.2146_2 = D.2146_1;
>   return;
> 
> }
> 
> already I would expect FRE to replace D.2148_7 by foo.  Later this is done by copyprop1
> 
> Folding statement: D.2147_8 = OBJ_TYPE_REF(D.2148_7;&s->0) (&s);
> Folded into: D.2147_8 = OBJ_TYPE_REF(foo;&s->0) (&s);
> 
> void B() ()
> {
>   int (*__vtbl_ptr_type) () * D.2149;
>   int (*__vtbl_ptr_type) () D.2148;
>   int D.2147;
>   bool D.2146;
>   struct S s;
> 
> <bb 2>:
>   s._vptr.S = &_ZTV1S[2];
>   D.2147_8 = OBJ_TYPE_REF(foo;&s->0) (&s);
>   return;
> 
> }
> 
> When copyprop chose to do constant propagation for whatever reason, it probably should
> do the folding, too. Either in substitute_and_fold or via its own ccp_fold_stmt.  I am sure
> you know the best alternatives better than I  do ;)
> 
> Honza
> 
> 	* cgraph.c (cgraph_clone_node): Do not handle vtable_method
> 	* cgraph.h (struct cgraph_local_info): Drop vtable_method.
> 	* cgraphunit.c (cgraph_copy_node_for_versioning): Drop vtable_method.
> 	* lto-cgraph.c (lto_output_node, input_overwrite_node): Drop vtable method.
> 	* gimple-fold.c (can_refer_decl_in_current_unit_p): Mention PR20991 in
> 	gimple-fold.c
> 	* varasm.c (mark_decl_referenced): Drop vtable_method handling code.
> 	* cp/class.c (cp_fold_obj_type_ref): Drop vtable_method.
> Index: cgraph.c
> ===================================================================
> *** cgraph.c	(revision 172608)
> --- cgraph.c	(working copy)
> *************** cgraph_clone_node (struct cgraph_node *n
> *** 2161,2167 ****
>     new_node->local = n->local;
>     new_node->local.externally_visible = false;
>     new_node->local.local = true;
> -   new_node->local.vtable_method = false;
>     new_node->global = n->global;
>     new_node->rtl = n->rtl;
>     new_node->count = count;
> --- 2161,2166 ----
> Index: cgraph.h
> ===================================================================
> *** cgraph.h	(revision 172608)
> --- cgraph.h	(working copy)
> *************** struct GTY(()) cgraph_local_info {
> *** 95,104 ****
>     /* True when the function has been originally extern inline, but it is
>        redefined now.  */
>     unsigned redefined_extern_inline : 1;
> - 
> -   /* True if the function is going to be emitted in some other translation
> -      unit, referenced from vtable.  */
> -   unsigned vtable_method : 1;
>   };
>   
>   /* Information about the function that needs to be computed globally
> --- 95,100 ----
> Index: cgraphunit.c
> ===================================================================
> *** cgraphunit.c	(revision 172608)
> --- cgraphunit.c	(working copy)
> *************** cgraph_copy_node_for_versioning (struct 
> *** 1991,1997 ****
>      new_version->local = old_version->local;
>      new_version->local.externally_visible = false;
>      new_version->local.local = true;
> -    new_version->local.vtable_method = false;
>      new_version->global = old_version->global;
>      new_version->rtl = old_version->rtl;
>      new_version->reachable = true;
> --- 1991,1996 ----
> Index: cp/class.c
> ===================================================================
> *** cp/class.c	(revision 172608)
> --- cp/class.c	(working copy)
> *************** cp_fold_obj_type_ref (tree ref, tree kno
> *** 8402,8409 ****
>   				  DECL_VINDEX (fndecl)));
>   #endif
>   
> -   cgraph_get_node (fndecl)->local.vtable_method = true;
> - 
>     return build_address (fndecl);
>   }
>   
> --- 8402,8407 ----
> Index: lto-cgraph.c
> ===================================================================
> *** lto-cgraph.c	(revision 172608)
> --- lto-cgraph.c	(working copy)
> *************** lto_output_node (struct lto_simple_outpu
> *** 491,497 ****
>     bp_pack_value (&bp, node->local.finalized, 1);
>     bp_pack_value (&bp, node->local.can_change_signature, 1);
>     bp_pack_value (&bp, node->local.redefined_extern_inline, 1);
> -   bp_pack_value (&bp, node->local.vtable_method, 1);
>     bp_pack_value (&bp, node->needed, 1);
>     bp_pack_value (&bp, node->address_taken, 1);
>     bp_pack_value (&bp, node->abstract_and_needed, 1);
> --- 491,496 ----
> *************** input_overwrite_node (struct lto_file_de
> *** 927,933 ****
>     node->local.finalized = bp_unpack_value (bp, 1);
>     node->local.can_change_signature = bp_unpack_value (bp, 1);
>     node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
> -   node->local.vtable_method = bp_unpack_value (bp, 1);
>     node->needed = bp_unpack_value (bp, 1);
>     node->address_taken = bp_unpack_value (bp, 1);
>     node->abstract_and_needed = bp_unpack_value (bp, 1);
> --- 926,931 ----
> Index: gimple-fold.c
> ===================================================================
> *** gimple-fold.c	(revision 172608)
> --- gimple-fold.c	(working copy)
> *************** can_refer_decl_in_current_unit_p (tree d
> *** 80,86 ****
>       return true;
>     /* We are not at ltrans stage; so don't worry about WHOPR.
>        Also when still gimplifying all referred comdat functions will be
> !      produced.  */
>     if (!flag_ltrans && (!DECL_COMDAT (decl) || !cgraph_function_flags_ready))
>       return true;
>     /* If we already output the function body, we are safe.  */
> --- 80,89 ----
>       return true;
>     /* We are not at ltrans stage; so don't worry about WHOPR.
>        Also when still gimplifying all referred comdat functions will be
> !      produced.
> !      ??? as observed in PR20991 for already optimized out comdat virtual functions
> !      we may not neccesarily give up because the copy will be output elsewhere when
> !      corresponding vtable is output.  */
>     if (!flag_ltrans && (!DECL_COMDAT (decl) || !cgraph_function_flags_ready))
>       return true;
>     /* If we already output the function body, we are safe.  */
> Index: varasm.c
> ===================================================================
> *** varasm.c	(revision 172608)
> --- varasm.c	(working copy)
> *************** mark_decl_referenced (tree decl)
> *** 2201,2208 ****
>   	 definition.  */
>         struct cgraph_node *node = cgraph_get_create_node (decl);
>         if (!DECL_EXTERNAL (decl)
> ! 	  && (!node->local.vtable_method || !cgraph_global_info_ready
> ! 	      || !node->local.finalized))
>   	cgraph_mark_needed_node (node);
>       }
>     else if (TREE_CODE (decl) == VAR_DECL)
> --- 2201,2207 ----
>   	 definition.  */
>         struct cgraph_node *node = cgraph_get_create_node (decl);
>         if (!DECL_EXTERNAL (decl)
> ! 	  && !node->local.finalized)
>   	cgraph_mark_needed_node (node);
>       }
>     else if (TREE_CODE (decl) == VAR_DECL)
> 
> 

-- 
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex

  reply	other threads:[~2011-04-17 19:44 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-17 17:26 Jan Hubicka
2011-04-17 21:27 ` Richard Guenther [this message]
2011-04-18  0:51   ` Jan Hubicka
2011-04-18  9:27     ` Richard Guenther
2011-04-18 15:40       ` Jan Hubicka
2011-04-18 15:41         ` Richard Guenther
2011-04-18 16:27           ` Jan Hubicka
2011-04-20 13:43 ` Martin Jambor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LNX.2.00.1104172143120.810@zhemvz.fhfr.qr \
    --to=rguenther@suse.de \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hubicka@ucw.cz \
    --cc=mjambor@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).