From 47d42ce2710bf905381c70cf2cd8c7b3495b4af0 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 27 Nov 2004 11:13:56 +0100 Subject: [PATCH] fold-const.c (extract_muldiv_1): If ctype is unsigned and type signed... * fold-const.c (extract_muldiv_1) : 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 --- gcc/ChangeLog | 6 +++++ gcc/fold-const.c | 16 +++++++++++- gcc/testsuite/ChangeLog | 4 +++ .../gcc.c-torture/execute/20041126-1.c | 26 +++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20041126-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bb246c40c6a..0c81048eef8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-11-27 Jakub Jelinek + + * fold-const.c (extract_muldiv_1) : 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 * config/mips/mips-protos.h (function_arg_boundary): Declare. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 167fc039ff6..eca8c96009b 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 4b602d3a466..a80759b488e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-11-27 Jakub Jelinek + + * gcc.c-torture/execute/20041126-1.c: New test. + 2004-11-27 Richard Sandiford * 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 00000000000..58855ae8c19 --- /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; +} -- 2.30.2