This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Recovering REG_EXPR information after temporary expression replacement
- From: Michael Matz <matz at suse dot de>
- To: "William J. Schmidt" <wschmidt at linux dot vnet dot ibm dot com>
- Cc: gcc at gcc dot gnu dot org, bergner at vnet dot ibm dot com
- Date: Fri, 27 Jan 2012 18:40:40 +0100 (CET)
- Subject: Re: Recovering REG_EXPR information after temporary expression replacement
- References: <1327680086.2734.42.camel@gnopaine>
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: