diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-17 20:46:01 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-17 20:46:01 +0000 |
commit | aa6a48b8bd414d6eaf88457fa803c83728537056 (patch) | |
tree | 861d915ca8345f83579d9f05c88cb1628918bdb6 | |
parent | 0f604f19c1866b5e217fcc21eb4b6c07566493f6 (diff) | |
download | gcc-aa6a48b8bd414d6eaf88457fa803c83728537056.tar.gz |
gcc/
* config/mips/mips.c (mips_gimplify_va_arg_expr): Fix invalid
tree sharing.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144244 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 26 |
2 files changed, 19 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index de0bfe3561d..c82420ab39f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-02-17 Richard Sandiford <rdsandiford@googlemail.com> + + * config/mips/mips.c (mips_gimplify_va_arg_expr): Fix invalid + tree sharing. + 2009-02-17 Ruan Beihong <ruanbeihong@gmail.com> Richard Sandiford <rdsandiford@googlemail.com> diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index c69423f0d68..7d2a61be5ca 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -5292,10 +5292,10 @@ mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, 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, tree type, gimple_seq *pre_p, } 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, tree type, gimple_seq *pre_p, { /* [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; |