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
This commit is contained in:
Jakub Jelinek 2011-02-27 20:37:35 +01:00 committed by Jakub Jelinek
parent 1d944f61ad
commit f6b439c98c
2 changed files with 19 additions and 1 deletions

View 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.

View 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: