This is the mail archive of the
mailing list for the GCC project.
Re: Division by INT64_MIN
- From: Matthew Fernandez <matthew dot fernandez at gmail dot com>
- To: Joseph Myers <joseph at codesourcery dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Fri, 9 Oct 2015 09:13:24 +1100
- Subject: Re: Division by INT64_MIN
- Authentication-results: sourceware.org; auth=none
- References: <5611DC31 dot 3030301 at gmail dot com> <alpine dot DEB dot 2 dot 10 dot 1510051406260 dot 21676 at digraph dot polyomino dot org dot uk> <5615FA63 dot 2080702 at gmail dot com> <alpine dot DEB dot 2 dot 10 dot 1510081508040 dot 17059 at digraph dot polyomino dot org dot uk>
On 09/10/15 02:08, Joseph Myers wrote:
On Thu, 8 Oct 2015, Matthew Fernandez wrote:
On 06/10/15 01:09, Joseph Myers wrote:
On Mon, 5 Oct 2015, Matthew Fernandez wrote:
on x86 is emitted as a call to __divdi3. If the numerator or denominator
negative, __divdi3 negates them. If either of these values is INT64_MIN, I
believe this negation is undefined. Is this correct? If this is the case,
it seems code like "INT64_MIN / INT64_MIN" which should be perfectly legal
accidentally causes undefined behaviour via libgcc. In practice,
seems to work as expected, but it seems to me that the C code of __divdi3
should not be relying on these negations working consistently.
It sounds like some casts to UDWtype should be inserted so the negation
takes place on an unsigned type.
Thanks for the speedy response, Joseph. Should I open a new bug report about
this? I suspect there are GCC developers out there who would disagree that
this constitutes a bug.
If you don't intend to send a patch, I suggest opening a bug report (but I
expect it's a bug only in the source code, not in the libgcc binaries).
OK, created as https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67902.
In my own implementation I just special cased all the tricky pairs of operands, which worked fine as I'm not doing any
64-bit divisions in performance-critical sections. However, I'm hesitant to submit something like this as a patch
because I suspect the performance degradation would be unpalatable to others.