aboutsummaryrefslogtreecommitdiff
path: root/gcc/real.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-02-27 20:37:35 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-02-27 20:37:35 +0100
commitf6b439c98cc246de3e27c45a30ad5877b7ccb958 (patch)
treeeaa8c5783d5d40079e949e06d2ac1b67aee2e28f /gcc/real.c
parent1d944f61adf5fa7f5744d0ec269e02f55b79921f (diff)
downloadgcc-f6b439c98cc246de3e27c45a30ad5877b7ccb958.zip
gcc-f6b439c98cc246de3e27c45a30ad5877b7ccb958.tar.gz
gcc-f6b439c98cc246de3e27c45a30ad5877b7ccb958.tar.bz2
re PR middle-end/47903 (var-tracking.c: valgrind error)
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
Diffstat (limited to 'gcc/real.c')
-rw-r--r--gcc/real.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/real.c b/gcc/real.c
index 4318586..6d3b435 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -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: