This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Some wide-int review comments
- From: Kenneth Zadeck <zadeck at naturalbridge dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: "Joseph S. Myers" <joseph at codesourcery dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>, Mike Stump <mikestump at comcast dot net>, Richard Sandiford <rdsandiford at googlemail dot com>
- Date: Wed, 20 Nov 2013 18:31:21 -0500
- Subject: Re: Some wide-int review comments
- Authentication-results: sourceware.org; auth=none
- References: <87mwlfgp8s dot fsf at talisman dot default> <527E456B dot 4050203 at naturalbridge dot com> <CAFiYyc2qJB3onVWWqBu5sYMQE6Otpmys5U3ZpyQtWAfKOFCcCQ at mail dot gmail dot com> <5280E914 dot 2060501 at naturalbridge dot com> <CAFiYyc0tNHO54aS7PaRKLdsWMQ6qN++MdN8=63Eq1AD5GtHrPg at mail dot gmail dot com> <5280F219 dot 6050000 at naturalbridge dot com> <CAFiYyc0LmDSAtMYqAe4kBr=4WcAzNtQm=cjbeX+1OGGyyjS-=g at mail dot gmail dot com> <52825432 dot 5070502 at naturalbridge dot com> <Pine dot LNX dot 4 dot 64 dot 1311121624220 dot 31448 at digraph dot polyomino dot org dot uk> <52825AC9 dot 9050604 at naturalbridge dot com> <CAFiYyc2Zph0ROZcXuapeP-7uXrWV1qXW2Znjseg6Dd0w2e0M2A at mail dot gmail dot com>
On 11/13/2013 04:59 AM, Richard Biener wrote:
On Tue, Nov 12, 2013 at 5:43 PM, Kenneth Zadeck
<zadeck@naturalbridge.com> wrote:
On 11/12/2013 11:27 AM, Joseph S. Myers wrote:
On Tue, 12 Nov 2013, Kenneth Zadeck wrote:
Richi,
i am having a little trouble putting this back the way that you want.
The
issue is rem.
what is supposed to happen for INT_MIN % -1?
I would assume because i am failing the last case of
gcc.dg/c90-const-expr-8.c
that INT_MIN %-1 should not overflow even if INT_MIN / -1 does.
however,
Given the conclusion in C11 that a%b should be considered undefined if a/b
is not representable, I think it's reasonable to say INT_MIN % -1 *should*
be considered to overflow (for all C standard versions) (and bug 30484 is
only a bug for -fwrapv).
however, my local question is what do we want the api to be
int-const-binop-1? The existing behavior seems to be that at least for
common modes this function silently returns 0 and it is up to the front ends
to put their own spin on it.
For wide-int you create 1:1 the behavior of current trunk (if a change of
behavior in TImode is not tested in the testsuite then you can ignore that).
Whatever change you do to semantics of functions you do separately
from wide-int (preferably first on trunk, or at your choice after the wide-int
merge).
For this case in question I'd say a % -1 should return 0, but for
INT_MIN % -1 that 0 should have TREE_OVERFLOW set (and
thus you need to adjust that c90-const-expr-8.c testcase).
Richard.
kenny
richi,
I have done this exactly as you suggested. bootstrapped and regression
tested on x86-64.
2013-11-20 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-20 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.
ok to commit?
kenny
Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c (revision 205161)
+++ gcc/fold-const.c (working copy)
@@ -1105,7 +1105,22 @@ int_const_binop_1 (enum tree_code code,
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:
Index: gcc/testsuite/gcc.dg/c90-const-expr-8.c
===================================================================
--- gcc/testsuite/gcc.dg/c90-const-expr-8.c (revision 205161)
+++ gcc/testsuite/gcc.dg/c90-const-expr-8.c (working copy)
@@ -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 } */
};
Index: gcc/testsuite/gcc.dg/c99-const-expr-8.c
===================================================================
--- gcc/testsuite/gcc.dg/c99-const-expr-8.c (revision 205161)
+++ gcc/testsuite/gcc.dg/c99-const-expr-8.c (working copy)
@@ -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 } */
};