aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKenneth Zadeck <zadeck@naturalbridge.com>2013-11-27 15:42:02 +0000
committerKenneth Zadeck <zadeck@gcc.gnu.org>2013-11-27 15:42:02 +0000
commit2e25208425c34892071ee65a99e80bb56fb19b20 (patch)
tree2550786536ef94f31fb46f8419d188392110b7c1 /gcc
parente9287a41dffc9e76dd80be4be75b0c3a58f57231 (diff)
downloadgcc-2e25208425c34892071ee65a99e80bb56fb19b20.zip
gcc-2e25208425c34892071ee65a99e80bb56fb19b20.tar.gz
gcc-2e25208425c34892071ee65a99e80bb56fb19b20.tar.bz2
c90-const-expr-8.c: Look for overflow on INT_MIN % -1.
2013-11-27 Kenneth Zadeck <zadeck@naturalbridge.com> * gcc.dg/c90-const-expr-8.c: Look for overflow on INT_MIN % -1. * gcc.dg/c99-const-expr-8.c: Look for overflow on INT_MIN % -1. 2013-11-27 Kenneth Zadeck <zadeck@naturalbridge.com> * fold-const.c (int_const_binop_1): Make INT_MIN % -1 return 0 with the overflow bit set. From-SVN: r205448
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/c90-const-expr-8.c3
-rw-r--r--gcc/testsuite/gcc.dg/c99-const-expr-8.c3
5 files changed, 31 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3899f7e..1ef702c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-11-27 Kenneth Zadeck <zadeck@naturalbridge.com>
+
+ * fold-const.c
+ (int_const_binop_1): Make INT_MIN % -1 return 0 with the overflow
+ bit set.
+
2013-11-27 Richard Biener <rguenther@suse.de>
PR middle-end/58723
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index d56b355..fcd7f08 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -1110,7 +1110,22 @@ int_const_binop_1 (enum tree_code code, const_tree arg1, const_tree arg2,
case ROUND_MOD_EXPR:
if (op2.is_zero ())
return NULL_TREE;
- tmp = op1.divmod_with_overflow (op2, uns, code, &res, &overflow);
+
+ /* Check for the case the case of INT_MIN % -1 and return
+ overflow and result = 0. The TImode case is handled properly
+ in double-int. */
+ if (TYPE_PRECISION (type) <= HOST_BITS_PER_WIDE_INT
+ && !uns
+ && op2.is_minus_one ()
+ && op1.high == (HOST_WIDE_INT) -1
+ && (HOST_WIDE_INT) op1.low
+ == (((HOST_WIDE_INT)-1) << (TYPE_PRECISION (type) - 1)))
+ {
+ overflow = 1;
+ res = double_int_zero;
+ }
+ else
+ tmp = op1.divmod_with_overflow (op2, uns, code, &res, &overflow);
break;
case MIN_EXPR:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 084e812..075e0b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-27 Kenneth Zadeck <zadeck@naturalbridge.com>
+
+ * gcc.dg/c90-const-expr-8.c: Look for overflow on INT_MIN % -1.
+ * gcc.dg/c99-const-expr-8.c: Look for overflow on INT_MIN % -1.
+
2013-11-27 Marek Polacek <polacek@redhat.com>
PR sanitizer/59306
diff --git a/gcc/testsuite/gcc.dg/c90-const-expr-8.c b/gcc/testsuite/gcc.dg/c90-const-expr-8.c
index 4923bc6..b6aba7b 100644
--- a/gcc/testsuite/gcc.dg/c90-const-expr-8.c
+++ b/gcc/testsuite/gcc.dg/c90-const-expr-8.c
@@ -23,5 +23,6 @@ enum e {
/* { dg-error "3:overflow in constant expression" "constant" { target *-*-* } 22 } */
E6 = 0 * !-INT_MIN, /* { dg-warning "13:integer overflow in expression" } */
/* { dg-error "8:not an integer constant" "constant" { target *-*-* } 24 } */
- E7 = INT_MIN % -1 /* Not an overflow. */
+ E7 = INT_MIN % -1 /* { dg-warning "16:integer overflow in expression" } */
+ /* { dg-error "1:overflow in constant expression" "constant" { target *-*-* } 28 } */
};
diff --git a/gcc/testsuite/gcc.dg/c99-const-expr-8.c b/gcc/testsuite/gcc.dg/c99-const-expr-8.c
index e84fa7b..1ddd9ed 100644
--- a/gcc/testsuite/gcc.dg/c99-const-expr-8.c
+++ b/gcc/testsuite/gcc.dg/c99-const-expr-8.c
@@ -23,5 +23,6 @@ enum e {
/* { dg-error "overflow in constant expression" "constant" { target *-*-* } 22 } */
E6 = 0 * !-INT_MIN, /* { dg-warning "integer overflow in expression" } */
/* { dg-error "not an integer constant" "constant" { target *-*-* } 24 } */
- E7 = INT_MIN % -1 /* Not an overflow. */
+ E7 = INT_MIN % -1 /* { dg-warning "16:integer overflow in expression" } */
+ /* { dg-error "1:overflow in constant expression" "constant" { target *-*-* } 28 } */
};