Commit 84d8756d by Richard Kenner Committed by Richard Kenner

* tree.c (save_expr): Don't fold a COMPONENT_REF.

From-SVN: r66264
parent 1f6f0cb6
2003-04-29 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree.c (save_expr): Don't fold a COMPONENT_REF.
2003-04-29 Olivier Hainque <hainque@act-europe.fr> 2003-04-29 Olivier Hainque <hainque@act-europe.fr>
* calls.c (expand_call): When modes of target and valreg match, force * calls.c (expand_call): When modes of target and valreg match, force
......
...@@ -1378,14 +1378,21 @@ tree ...@@ -1378,14 +1378,21 @@ tree
save_expr (expr) save_expr (expr)
tree expr; tree expr;
{ {
tree t = fold (expr); tree t = expr;
tree inner = skip_simple_arithmetic (t); tree inner;
/* Don't fold a COMPONENT_EXPR: if the operand was a CONSTRUCTOR (the
only time it will fold), it can cause problems with PLACEHOLDER_EXPRs
in Ada. Moreover, it isn't at all clear why we fold here at all. */
if (TREE_CODE (t) != COMPONENT_REF)
t = fold (t);
/* If the tree evaluates to a constant, then we don't want to hide that /* If the tree evaluates to a constant, then we don't want to hide that
fact (i.e. this allows further folding, and direct checks for constants). fact (i.e. this allows further folding, and direct checks for constants).
However, a read-only object that has side effects cannot be bypassed. However, a read-only object that has side effects cannot be bypassed.
Since it is no problem to reevaluate literals, we just return the Since it is no problem to reevaluate literals, we just return the
literal node. */ literal node. */
inner = skip_simple_arithmetic (t);
if (TREE_CONSTANT (inner) if (TREE_CONSTANT (inner)
|| (TREE_READONLY (inner) && ! TREE_SIDE_EFFECTS (inner)) || (TREE_READONLY (inner) && ! TREE_SIDE_EFFECTS (inner))
|| TREE_CODE (inner) == SAVE_EXPR || TREE_CODE (inner) == SAVE_EXPR
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment