aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2004-11-27 11:13:56 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2004-11-27 11:13:56 +0100
commit47d42ce2710bf905381c70cf2cd8c7b3495b4af0 (patch)
treed42b0016cfb2a956039363a27cfd89764e73ef14
parent87980da05e5466d35e0de2b767112896292cd2c9 (diff)
downloadgcc-47d42ce2710bf905381c70cf2cd8c7b3495b4af0.zip
gcc-47d42ce2710bf905381c70cf2cd8c7b3495b4af0.tar.gz
gcc-47d42ce2710bf905381c70cf2cd8c7b3495b4af0.tar.bz2
fold-const.c (extract_muldiv_1): If ctype is unsigned and type signed...
* 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. * gcc.c-torture/execute/20041126-1.c: New test. From-SVN: r91373
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c16
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20041126-1.c26
4 files changed, 51 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bb246c4..0c81048 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 167fc03..eca8c96 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4b602d3..a80759b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..58855ae
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20041126-1.c
@@ -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;
+}