This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix old bug in div_and_round_double
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Eric Botcazou <ebotcazou at adacore dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 28 May 2014 09:57:34 +0200
- Subject: Re: Fix old bug in div_and_round_double
- Authentication-results: sourceware.org; auth=none
- References: <3615860 dot z70LMau7zY at polaris>
On Tue, May 27, 2014 at 10:29 PM, Eric Botcazou <ebotcazou@adacore.com> wrote:
> This is an old bug in div_and_round_double for ROUND_DIV_EXPR: when the code
> detects that it needs to adjust the quotient, it needs to decide whether it
> increases or decreases it by 1. This only depends on the expected sign of the
> quotient, but the test reads:
>
> if (*hquo < 0)
>
> So if the quotient is 0, the code will always bump it, thus yielding 1, even
> if the expected quotient is negative. This causes the attached Ada testcase
> to fail at -O on all active branches... except for mainline, because of the
> correct implementation of the same test in wi::div_round:
>
> if (wi::neg_p (x, sgn) != wi::neg_p (y, sgn))
> return quotient - 1;
> else
> return quotient + 1;
>
> It turns out that div_and_round_double has a predicate quo_neg that implements
> the same test as the wide-int one and ought to be used here.
>
> Tested on x86_64-suse-linux (of course this probably doesn't mean anything on
> the mainline, but it was also test with 4.7 and 4.9 compilers) and applied on
> the mainline as obvious.
I suppose you also install on branches?
Thanks,
Richard.
>
> 2014-05-27 Eric Botcazou <ebotcazou@adacore.com>
>
> * double-int.c (div_and_round_double) <ROUND_DIV_EXPR>: Use the proper
> predicate to detect a negative quotient.
>
>
> 2014-05-27 Eric Botcazou <ebotcazou@adacore.com>
>
> * gnat.dg/overflow_fixed.adb: New test.
>
>
> --
> Eric Botcazou