This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Switch order in sra_walk_modify_expr
- From: kenner at vlsi1 dot ultra dot nyu dot edu (Richard Kenner)
- To: rth at redhat dot com
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 24 Nov 04 11:26:47 EST
- Subject: Switch order in sra_walk_modify_expr
This fixes a number of ACATS tests, including c352001. We discussed this
a while ago, but I wanted to verify this is what we agreed on.
Tested on x86_64-linux-gnu.
2004-11-24 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree-sra.c (sra_walk_modify_expr): Handle RHS first, then LHS.
*** tree-sra.c 22 Nov 2004 20:02:16 -0000 2.45
--- tree-sra.c 24 Nov 2004 16:19:29 -0000
*************** sra_walk_modify_expr (tree expr, block_s
*** 806,809 ****
--- 806,834 ----
}
+ /* If the RHS is scalarizable, handle it. There are only two cases. */
+ if (rhs_elt)
+ {
+ if (!rhs_elt->is_scalar)
+ fns->ldst (rhs_elt, lhs, bsi, false);
+ else
+ fns->use (rhs_elt, &TREE_OPERAND (expr, 1), bsi, false);
+ }
+
+ /* If it isn't scalarizable, there may be scalarizable variables within, so
+ check for a call or else walk the RHS to see if we need to do any
+ copy-in operations. We need to do it before the LHS is scalarized so
+ that the statements get inserted in the proper place, before any
+ copy-out operations. */
+ else
+ {
+ tree call = get_call_expr_in (rhs);
+ if (call)
+ sra_walk_call_expr (call, bsi, fns);
+ else
+ sra_walk_expr (&TREE_OPERAND (expr, 1), bsi, false, fns);
+ }
+
+ /* Likewise, handle the LHS being scalarizable. We have cases similar
+ to those above, but also want to handle RHS being constant. */
if (lhs_elt)
{
*************** sra_walk_modify_expr (tree expr, block_s
*** 835,863 ****
fns->use (lhs_elt, &TREE_OPERAND (expr, 0), bsi, true);
}
- else
- {
- /* LHS_ELT being null only means that the LHS as a whole is not a
- scalarizable reference. There may be occurrences of scalarizable
- variables within, which implies a USE. */
- sra_walk_expr (&TREE_OPERAND (expr, 0), bsi, true, fns);
- }
! /* Likewise for the right-hand side. The only difference here is that
! we don't have to handle constants, and the RHS may be a call. */
! if (rhs_elt)
! {
! if (!rhs_elt->is_scalar)
! fns->ldst (rhs_elt, lhs, bsi, false);
! else
! fns->use (rhs_elt, &TREE_OPERAND (expr, 1), bsi, false);
! }
else
! {
! tree call = get_call_expr_in (rhs);
! if (call)
! sra_walk_call_expr (call, bsi, fns);
! else
! sra_walk_expr (&TREE_OPERAND (expr, 1), bsi, false, fns);
! }
}
--- 860,869 ----
fns->use (lhs_elt, &TREE_OPERAND (expr, 0), bsi, true);
}
! /* Similarly to above, LHS_ELT being null only means that the LHS as a
! whole is not a scalarizable reference. There may be occurrences of
! scalarizable variables within, which implies a USE. */
else
! sra_walk_expr (&TREE_OPERAND (expr, 0), bsi, true, fns);
}