]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
mips.c (mips_gimplify_va_arg_expr): Fix invalid tree sharing.
authorRichard Sandiford <rdsandiford@googlemail.com>
Tue, 17 Feb 2009 20:46:01 +0000 (20:46 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 17 Feb 2009 20:46:01 +0000 (20:46 +0000)
gcc/
* config/mips/mips.c (mips_gimplify_va_arg_expr): Fix invalid
tree sharing.

From-SVN: r144244

gcc/ChangeLog
gcc/config/mips/mips.c

index de0bfe3561d3fdc40ec0076af6592d06ddac256b..c82420ab39f2d3d1464f961a7a94d41eded6046a 100644 (file)
@@ -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>
 
index c69423f0d6880a0c6db2d831e452de8f2a27fb19..7d2a61be5ca13d51f6dee66a7e1b547857ae612c 100644 (file)
@@ -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;