re PR middle-end/47903 (var-tracking.c: valgrind error)
authorJakub Jelinek <jakub@redhat.com>
Sun, 27 Feb 2011 19:37:35 +0000 (20:37 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 27 Feb 2011 19:37:35 +0000 (20:37 +0100)
PR middle-end/47903
* real.c (real_arithmetic) <case PLUS_EXPR, MINUS_EXPR,
MULT_EXPR, RDIV_EXPR>: Clear padding bits in *r first if
r isn't op0 nor op1.

From-SVN: r170547

gcc/ChangeLog
gcc/real.c

index b59539f324095e36168b491ddf00b43f1c7d3a66..ca9f3660c27ced58cea0d254535a5614940fc06d 100644 (file)
@@ -1,3 +1,10 @@
+2011-02-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/47903
+       * real.c (real_arithmetic) <case PLUS_EXPR, MINUS_EXPR,
+       MULT_EXPR, RDIV_EXPR>: Clear padding bits in *r first if
+       r isn't op0 nor op1.
+
 2011-02-23  Georg-Johann Lay  <avr@gjlay.de>
 
        * config/avr/avr.md: Remove magic comment for emacs.
index 4318586110aebf429e640bff68f78f325a3d1de3..6d3b4356d237475f7ddc5943c4227ed0ff7dad12 100644 (file)
@@ -1,6 +1,7 @@
 /* real.c - software floating point emulation.
    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002,
-   2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
    Contributed by Stephen L. Moshier (moshier@world.std.com).
    Re-written by Richard Henderson <rth@redhat.com>
 
@@ -1009,15 +1010,25 @@ real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
   switch (code)
     {
     case PLUS_EXPR:
+      /* Clear any padding areas in *r if it isn't equal to one of the
+        operands so that we can later do bitwise comparisons later on.  */
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_add (r, op0, op1, 0);
 
     case MINUS_EXPR:
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_add (r, op0, op1, 1);
 
     case MULT_EXPR:
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_multiply (r, op0, op1);
 
     case RDIV_EXPR:
+      if (r != op0 && r != op1)
+       memset (r, '\0', sizeof (*r));
       return do_divide (r, op0, op1);
 
     case MIN_EXPR: