re PR middle-end/36137 (gcc can't do math)
authorJakub Jelinek <jakub@redhat.com>
Wed, 7 May 2008 07:40:01 +0000 (09:40 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 7 May 2008 07:40:01 +0000 (09:40 +0200)
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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20080506-1.c [new file with mode: 0644]

index 6147e35535698106583794c15ac24967b2648c0b..20ee05cd6f306d4e17e4766be255815a073c9409 100644 (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
index b4645ca256e874bdcd3b920c3e5ac3d9afa98169..db7be875427d8908568ac4dd16714f54d5f5fb4d 100644 (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);
index e2d2bb85eebc0b820d31ad68ddd62668dcf1d3b6..a36aa5a3301c6133bfacfab0bbc6cde699e37f36 100644 (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
diff --git a/gcc/testsuite/gcc.c-torture/execute/20080506-1.c b/gcc/testsuite/gcc.c-torture/execute/20080506-1.c
new file mode 100644 (file)
index 0000000..4f6d6d8
--- /dev/null
@@ -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;
+}