OSDN Git Service

2010-07-29 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Jul 2010 10:59:54 +0000 (10:59 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Jul 2010 10:59:54 +0000 (10:59 +0000)
PR middle-end/45034
* convert.c (convert_to_integer): Always use an unsigned
type for narrowed negate and bitwise not.

* gcc.c-torture/execute/pr45034.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162673 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/convert.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr45034.c [new file with mode: 0644]

index ffbe8b2..5c066b5 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-29  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/45034
+       * convert.c (convert_to_integer): Always use an unsigned
+       type for narrowed negate and bitwise not.
+
 2010-07-29  Ira Rosen  <irar@il.ibm.com>
 
        * tree-vect-loop.c (vect_create_epilog_for_reduction): Switch
index 48f3f94..57eedbf 100644 (file)
@@ -799,14 +799,7 @@ convert_to_integer (tree type, tree expr)
          /* This is not correct for ABS_EXPR,
             since we must test the sign before truncation.  */
          {
-           tree typex;
-
-           /* Don't do unsigned arithmetic where signed was wanted,
-              or vice versa.  */
-           if (TYPE_UNSIGNED (TREE_TYPE (expr)))
-             typex = unsigned_type_for (type);
-           else
-             typex = signed_type_for (type);
+           tree typex = unsigned_type_for (type);
            return convert (type,
                            fold_build1 (ex_form, typex,
                                         convert (typex,
index 3ccd402..a41b820 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-29  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/45034
+       * gcc.c-torture/execute/pr45034.c: New testcase.
+
 2010-07-28  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/45096
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr45034.c b/gcc/testsuite/gcc.c-torture/execute/pr45034.c
new file mode 100644 (file)
index 0000000..2d86f30
--- /dev/null
@@ -0,0 +1,45 @@
+extern void abort (void);
+static void fixnum_neg(signed char x, signed char *py, int *pv)
+{
+  unsigned char ux, uy;
+
+  ux = (unsigned char)x;
+  uy = -ux;
+  *py = (uy <= 127) ? (signed char)uy : (-(signed char)(255 - uy) - 1);
+  *pv = (x == -128) ? 1 : 0;
+}
+
+void __attribute__((noinline)) foo(int x, int y, int v)
+{
+  if (y < -128 || y > 127)
+    abort();
+}
+
+int test_neg(void)
+{
+  signed char x, y;
+  int v, err;
+
+  err = 0;
+  x = -128;
+  for (;;) {
+      fixnum_neg(x, &y, &v);
+      foo((int)x, (int)y, v);
+      if ((v && x != -128) || (!v && x == -128))
+       ++err;
+      if (x == 127)
+       break;
+      ++x;
+  }
+  return err;
+}
+
+int main(void)
+{
+  if (sizeof (char) != 1)
+    return 0;
+  if (test_neg() != 0)
+    abort();
+  return 0;
+}
+