* 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
+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.
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;
+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
--- /dev/null
+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;
+}