diff options
author | Jakub Jelinek <jakub@redhat.com> | 2004-11-27 11:13:56 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2004-11-27 11:13:56 +0100 |
commit | 47d42ce2710bf905381c70cf2cd8c7b3495b4af0 (patch) | |
tree | d42b0016cfb2a956039363a27cfd89764e73ef14 | |
parent | 87980da05e5466d35e0de2b767112896292cd2c9 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20041126-1.c | 26 |
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; +} |