[committed] Fix tree sharing in mips_gimplify_va_arg_expr
Richard Sandiford
rdsandiford@googlemail.com
Tue Feb 17 21:16:00 GMT 2009
Hmm. It seems I've been using mipsisa64-elfoabi so much that it's
many months since I last tried mipsisa64-elf. Now I have, and a lot
of tests fail due to invalid tree sharing in mips_gimplify_va_arg_expr.
Tested on mipsisa64-elf and applied.
Richard
gcc/
* config/mips/mips.c (mips_gimplify_va_arg_expr): Fix invalid
tree sharing.
Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c 2009-02-15 10:41:59.000000000 +0000
+++ gcc/config/mips/mips.c 2009-02-15 10:52:15.000000000 +0000
@@ -5292,10 +5292,10 @@ mips_gimplify_va_arg_expr (tree valist,
if (GET_MODE_CLASS (TYPE_MODE (type)) == MODE_FLOAT
&& GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FPVALUE)
{
- top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
- NULL_TREE);
- off = build3 (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
- NULL_TREE);
+ top = build3 (COMPONENT_REF, TREE_TYPE (f_ftop),
+ unshare_expr (valist), f_ftop, NULL_TREE);
+ off = build3 (COMPONENT_REF, TREE_TYPE (f_foff),
+ unshare_expr (valist), f_foff, NULL_TREE);
/* When va_start saves FPR arguments to the stack, each slot
takes up UNITS_PER_HWFPVALUE bytes, regardless of the
@@ -5322,17 +5322,17 @@ mips_gimplify_va_arg_expr (tree valist,
}
else
{
- top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
- NULL_TREE);
- off = build3 (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
- NULL_TREE);
+ top = build3 (COMPONENT_REF, TREE_TYPE (f_gtop),
+ unshare_expr (valist), f_gtop, NULL_TREE);
+ off = build3 (COMPONENT_REF, TREE_TYPE (f_goff),
+ unshare_expr (valist), f_goff, NULL_TREE);
rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
if (rsize > UNITS_PER_WORD)
{
/* [1] Emit code for: off &= -rsize. */
- t = build2 (BIT_AND_EXPR, TREE_TYPE (off), off,
+ t = build2 (BIT_AND_EXPR, TREE_TYPE (off), unshare_expr (off),
build_int_cst (TREE_TYPE (off), -rsize));
- gimplify_assign (off, t, pre_p);
+ gimplify_assign (unshare_expr (off), t, pre_p);
}
osize = rsize;
}
@@ -5363,12 +5363,14 @@ mips_gimplify_va_arg_expr (tree valist,
{
/* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
u = size_int (osize - 1);
- t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), ovfl, u);
+ t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl),
+ unshare_expr (ovfl), u);
t = fold_convert (sizetype, t);
u = size_int (-osize);
t = build2 (BIT_AND_EXPR, sizetype, t, u);
t = fold_convert (TREE_TYPE (ovfl), t);
- align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
+ align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
+ unshare_expr (ovfl), t);
}
else
align = NULL;
More information about the Gcc-patches
mailing list