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: Richard Biener <richard dot guenther at gmail dot com>
- To: Kenneth Zadeck <zadeck at naturalbridge dot com>
- Cc: 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: Mon, 11 Nov 2013 15:42:16 +0100
- 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>
On Mon, Nov 11, 2013 at 3:26 PM, Kenneth Zadeck
<zadeck@naturalbridge.com> wrote:
> On 11/11/2013 06:49 AM, Richard Biener wrote:
>>
>> On Sat, Nov 9, 2013 at 3:23 PM, Kenneth Zadeck <zadeck@naturalbridge.com>
>> wrote:
>>>
>>> On 11/08/2013 05:30 AM, Richard Sandiford wrote:
>>>>
>>>> From tree-vrp.c:
>>>>
>>>> @@ -1893,6 +1884,10 @@ vrp_int_const_binop (enum tree_code code
>>>> /* If the singed operation wraps then int_const_binop has done
>>>> everything we want. */
>>>> ;
>>>> + /* Signed division of -1/0 overflows and by the time it gets here
>>>> + returns NULL_TREE. */
>>>> + else if (!res)
>>>> + return NULL_TREE;
>>>> else if ((TREE_OVERFLOW (res)
>>>> && !TREE_OVERFLOW (val1)
>>>> && !TREE_OVERFLOW (val2))
>>>>
>>>> Why is this case different from trunk? Or is it a bug-fix independent
>>>> of wide-int?
>>>
>>> the api for division is different for wide-int than it was for
>>> double-int.
>>
>> But this is using a tree API (int_const_binop) that didn't change
>> (it returned NULL for / 0 previously). So what makes us arrive here
>> now? (I agree there is a bug in VRP, but it shouldn't manifest itself
>> only on wide-int)
>>
>> Richard.
>
> My reading of the code is that is that i changed int_const_binop to return
> null_tree for this case.
Trunk has:
case TRUNC_DIV_EXPR:
case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
case EXACT_DIV_EXPR:
/* This is a shortcut for a common special case. */
if (op2.high == 0 && (HOST_WIDE_INT) op2.low > 0
&& !TREE_OVERFLOW (arg1)
&& !TREE_OVERFLOW (arg2)
&& op1.high == 0 && (HOST_WIDE_INT) op1.low >= 0)
{
if (code == CEIL_DIV_EXPR)
op1.low += op2.low - 1;
res.low = op1.low / op2.low, res.high = 0;
break;
}
/* ... fall through ... */
case ROUND_DIV_EXPR:
if (op2.is_zero ())
return NULL_TREE;
so it already returns NULL_TREE on divide by zero.
> On the trunk, only rem returns null_tree for divide by 0, on the wide int
> branch, both div and rem return null tree.
>
> I know that this is going to bring on a string of questions that i do not
> remember the answers to as to why i made that change. but
> fold-const.c:int_const_binop_1 now returns null_tree and this is just
> fallout from that change.
>
> Kenny
>>>>
>>>> Thanks,
>>>> Richard
>>>
>>>
>