re PR middle-end/25125 ((short) ((int)(unsigned short) + (int)) is done in the wrong...
authorKazu Hirata <kazu@codesourcery.com>
Mon, 26 Dec 2005 23:00:18 +0000 (23:00 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Mon, 26 Dec 2005 23:00:18 +0000 (23:00 +0000)
gcc/
PR tree-optimization/25125
* convert.c (convert_to_integer): Don't narrow the type of a
PLUX_EXPR or MINUS_EXPR if !flag_wrapv and the unwidened type
is signed.

gcc/testsuite/
PR tree-optimization/25125
* gcc.dg/vect/vect-7.c, gcc.dg/vect/vect-reduc-2char.c,
gcc.dg/vect/vect-reduc-2short.c: XFAIL.
* gcc.c-torture/execute/pr25125.c: New.

From-SVN: r109065

gcc/ChangeLog
gcc/convert.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr25125.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-7.c
gcc/testsuite/gcc.dg/vect/vect-reduc-2char.c
gcc/testsuite/gcc.dg/vect/vect-reduc-2short.c

index 71807d72eaccbc27c8ffc34afd4882e6e304cb98..4695cc75aa62d505f96ddade4403759c757dbd54 100644 (file)
@@ -1,3 +1,10 @@
+2005-12-26  Kazu Hirata  <kazu@codesourcery.com>
+
+       PR tree-optimization/25125
+       * convert.c (convert_to_integer): Don't narrow the type of a
+       PLUX_EXPR or MINUS_EXPR if !flag_wrapv and the unwidened type
+       is signed.
+
 2005-12-26  Graham Stott  <graham.stott@btinternet.com>
 
        PR middle-end/25568
index e8030bf9f01e5fa135145ac81da111dcfbb80baa..805c6f5c7898508dec604d8bbe1e0f4f37589e2d 100644 (file)
@@ -628,7 +628,17 @@ convert_to_integer (tree type, tree expr)
                                || ex_form == RSHIFT_EXPR
                                || ex_form == LROTATE_EXPR
                                || ex_form == RROTATE_EXPR))
-                       || ex_form == LSHIFT_EXPR)
+                       || ex_form == LSHIFT_EXPR
+                       /* If we have !flag_wrapv, and either ARG0 or
+                          ARG1 is of a signed type, we have to do
+                          PLUS_EXPR or MINUS_EXPR in an unsigned
+                          type.  Otherwise, we would introduce
+                          signed-overflow undefinedness.  */
+                       || (!flag_wrapv
+                           && (ex_form == PLUS_EXPR
+                               || ex_form == MINUS_EXPR)
+                           && (!TYPE_UNSIGNED (TREE_TYPE (arg0))
+                               || !TYPE_UNSIGNED (TREE_TYPE (arg1)))))
                      typex = lang_hooks.types.unsigned_type (typex);
                    else
                      typex = lang_hooks.types.signed_type (typex);
index 2d786b50020fac78158bd267da265c0f68fcb0a2..6a442180cc5560cb0791ba21e52d0f2baec0b65e 100644 (file)
@@ -1,3 +1,10 @@
+2005-12-26  Kazu Hirata  <kazu@codesourcery.com>
+
+       PR tree-optimization/25125
+       * gcc.dg/vect/vect-7.c, gcc.dg/vect/vect-reduc-2char.c,
+       gcc.dg/vect/vect-reduc-2short.c: XFAIL.
+       * gcc.c-torture/execute/pr25125.c: New.
+
 2005-12-24  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/25029
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr25125.c b/gcc/testsuite/gcc.c-torture/execute/pr25125.c
new file mode 100644 (file)
index 0000000..f08ebe7
--- /dev/null
@@ -0,0 +1,27 @@
+extern void exit (int);
+extern void abort (void);
+extern unsigned short f (short a) __attribute__((__noinline__));
+
+unsigned short
+f (short a)
+{
+  short b;
+
+  if (a > 0)
+    return 0;
+  b = ((int) a) + - (int) 32768;
+  return b;
+}
+
+int
+main (void)
+{
+  if (sizeof (short) < 2
+      || sizeof (short) >= sizeof (int))
+    exit (0);
+
+  if (f (-32767) != 1)
+    abort ();
+
+  exit (0);
+}
index e359bbe2c563c906b12812b40e025ae9a4c899f9..10cff365cb977c5eac8ddd72026af8151867996f 100644 (file)
@@ -46,6 +46,6 @@ int main (void)
 }
 
 /* Fails for 32-bit targets that don't vectorize PLUS.  */
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail *-*-* } } } */
 /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
index aecf8a512e1d9fe781f57ac8fb42960685f1a327..e664fda96601ddc14cd199aaf2f92d1fba20bba6 100644 (file)
@@ -45,5 +45,5 @@ int main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail vect_no_int_max } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
index 4476c83d0e7b718d194454027db4b52d8b9417ef..9f312fbc3f53ee402a274de4b98ed605bf54d732 100644 (file)
@@ -44,5 +44,5 @@ int main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail vect_no_int_max } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */