OSDN Git Service

* fold-const.c (extract_muldiv_1) <case ABS_EXPR>: If ctype is
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 27 Nov 2004 10:13:56 +0000 (10:13 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 27 Nov 2004 10:13:56 +0000 (10:13 +0000)
unsigned and type signed, build ABS_EXPR with signed_type (ctype)
and only afterwards convert to ctype.

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

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

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

index bb246c4..0c81048 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-27  Jakub Jelinek  <jakub@redhat.com>
+
+       * fold-const.c (extract_muldiv_1) <case ABS_EXPR>: If ctype is
+       unsigned and type signed, build ABS_EXPR with signed_type (ctype)
+       and only afterwards convert to ctype.
+
 2004-11-27  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/mips-protos.h (function_arg_boundary): Declare.
index 167fc03..eca8c96 100644 (file)
@@ -5127,7 +5127,21 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
        return t1;
       break;
 
-    case NEGATE_EXPR:  case ABS_EXPR:
+    case ABS_EXPR:
+      /* If widening the type changes it from signed to unsigned, then we
+         must avoid building ABS_EXPR itself as unsigned.  */
+      if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
+        {
+          tree cstype = (*lang_hooks.types.signed_type) (ctype);
+          if ((t1 = extract_muldiv (op0, c, code, cstype)) != 0)
+            {
+              t1 = fold (build1 (tcode, cstype, fold_convert (cstype, t1)));
+              return fold_convert (ctype, t1);
+            }
+          break;
+        }
+      /* FALLTHROUGH */
+    case NEGATE_EXPR:
       if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
        return fold (build1 (tcode, ctype, fold_convert (ctype, t1)));
       break;
index 4b602d3..a80759b 100644 (file)
@@ -1,3 +1,7 @@
+2004-11-27  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/execute/20041126-1.c: New test.
+
 2004-11-27  Richard Sandiford  <rsandifo@redhat.com>
 
        * gcc.dg/mips-args-1.c: Don't expect _R3000 or _R4000 to be defined
diff --git a/gcc/testsuite/gcc.c-torture/execute/20041126-1.c b/gcc/testsuite/gcc.c-torture/execute/20041126-1.c
new file mode 100644 (file)
index 0000000..58855ae
--- /dev/null
@@ -0,0 +1,26 @@
+extern int abs (int);
+extern void abort (void);
+
+void
+check (int *p)
+{
+  int i;
+  for (i = 0; i < 5; ++i)
+    if (p[i])
+      abort ();
+  for (; i < 10; ++i)
+    if (p[i] != i + 1)
+      abort ();
+}
+
+int
+main (void)
+{
+  int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+  int i;
+
+  for (i = -5; i < 0; i++)
+    a[abs (i - 10) - 11] = 0;
+  check (a);
+  return 0;
+}