This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Recovering REG_EXPR information after temporary expression replacement


Great, thanks!  Results are good on this specific test case.  Seems like
a nice thing to add in 4.8.

On Fri, 2012-01-27 at 18:40 +0100, Michael Matz wrote:
> Hi,
> 
> On Fri, 27 Jan 2012, William J. Schmidt wrote:
> 
> > ------------------------------------------------------------------------
> > int
> > test_switch_1 (unsigned int *index, int i)
> > {
> >   switch (*index)
> ...
> > However, for the first case, temporary expression replacement has
> > effectively removed the assignment to D.2004_3 (single local immediate
> > use permits replacement), so instead we see:
> > 
> > ------------------------------------------------------------------------
> > ;; switch (D.2004_3) <default: <L3>, case 0: <L5>, case 1: <L1>, case 2:
> > <L2>>
> > 
> > (insn 7 6 8 (set (reg:SI 124)
> >         (mem:SI (reg/v/f:SI 122 [ index ]) [2 *index_2(D)+0 S4 A32]))
> > t1.i:4 -1
> 
> With TER there is no decl anymore to associate the pseudo with.  
> Conceptually, what's expanded is "*index", not an assignment to a pseudo.  
> The move into a pseudo (and the creation of that very pseudo) is done by 
> copy_to_reg in expand_case.
> 
> > It would be a nice enhancement if the REG_EXPR could be preserved in
> > such cases.  Does anyone know if there's something that would prevent
> > this?
> 
> The hack below works in this specific situation (TERed into a switch), and 
> adds a REG_EXPR when an TERed SSA name ever expanded into a pseudo (i.e. 
> also for some more generic situations).
> 
> 
> Ciao,
> Michael.
> Index: expr.c
> ===================================================================
> --- expr.c	(revision 183559)
> +++ expr.c	(working copy)
> @@ -8991,8 +8991,13 @@ expand_expr_real_1 (tree exp, rtx target
>  	  && stmt_is_replaceable_p (SSA_NAME_DEF_STMT (exp)))
>  	g = SSA_NAME_DEF_STMT (exp);
>        if (g)
> -	return expand_expr_real (gimple_assign_rhs_to_tree (g), target, tmode,
> -				 modifier, NULL);
> +	{
> +	  rtx r = expand_expr_real (gimple_assign_rhs_to_tree (g), target,
> +				    tmode, modifier, NULL);
> +	  if (REG_P (r) && !REG_EXPR (r))
> +	    set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (exp), r);
> +	  return r;
> +	}
> 
>        ssa_name = exp;
>        decl_rtl = get_rtx_for_ssa_name (ssa_name);
> Index: stmt.c
> ===================================================================
> --- stmt.c	(revision 183559)
> +++ stmt.c	(working copy)
> @@ -2381,7 +2381,11 @@ expand_case (gimple stmt)
>  	  do_pending_stack_adjust ();
> 
>  	  if (MEM_P (index))
> -	    index = copy_to_reg (index);
> +	    {
> +	      index = copy_to_reg (index);
> +	      if (TREE_CODE (index_expr) == SSA_NAME)
> +		set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (index_expr), index);
> +	    }
> 
>  	  /* We generate a binary decision tree to select the
>  	     appropriate target code.  This is done as follows:
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]