re PR middle-end/36137 (gcc can't do math)

PR middle-end/36137
	* fold-const.c (fold_binary): Use STRIP_SIGN_NOPS instead of
	STRIP_NOPS on arguments even for MIN_EXPR and MAX_EXPR.

	* gcc.c-torture/execute/20080506-1.c: New test.

From-SVN: r135028
This commit is contained in:
Jakub Jelinek 2008-05-07 09:40:01 +02:00 committed by Jakub Jelinek
parent c18c98c0ad
commit f61edbf65f
4 changed files with 34 additions and 7 deletions

View File

@ -1,14 +1,14 @@
2008-05-07 Jakub Jelinek <jakub@redhat.com>
PR middle-end/36137
* fold-const.c (fold_binary): Use STRIP_SIGN_NOPS instead of
STRIP_NOPS on arguments even for MIN_EXPR and MAX_EXPR.
PR middle-end/36106
* omp-low.c (expand_omp_atomic_pipeline): Load value using the
integral type rather than floating point, then VIEW_CONVERT_EXPR
to the floating point type.
* testsuite/libgomp.c/atomic-5.c: New test.
* testsuite/libgomp.c/atomic-6.c: New test.
* testsuite/libgomp.c/autopar-1.c: New test.
2008-05-07 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.c (ix86_expand_copysign): Force non-zero constant

View File

@ -1,6 +1,6 @@
/* Fold a constant sub-tree into a single node for C-compiler
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of GCC.
@ -9261,7 +9261,8 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
safe for every expression, except for a comparison expression
because its signedness is derived from its operands. So, in
the latter case, only strip conversions that don't change the
signedness.
signedness. MIN_EXPR/MAX_EXPR also need signedness of arguments
preserved.
Note that this is done as an internal manipulation within the
constant folder, in order to find the simplest representation
@ -9269,7 +9270,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
cases, the appropriate type conversions should be put back in
the tree that will get out of the constant folder. */
if (kind == tcc_comparison)
if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR)
{
STRIP_SIGN_NOPS (arg0);
STRIP_SIGN_NOPS (arg1);

View File

@ -1,3 +1,8 @@
2008-05-07 Jakub Jelinek <jakub@redhat.com>
PR middle-end/36137
* gcc.c-torture/execute/20080506-1.c: New test.
2008-05-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/34974

View File

@ -0,0 +1,21 @@
/* PR middle-end/36137 */
extern void abort (void);
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int
main ()
{
unsigned int u;
int i = -1;
u = MAX ((unsigned int) MAX (i, 0), 1);
if (u != 1)
abort ();
u = MIN ((unsigned int) MAX (i, 0), (unsigned int) i);
if (u != 0)
abort ();
return 0;
}