On Mon, May 23, 2016 at 3:19 PM, Kyrill Tkachov
<kyrylo.tkac...@foss.arm.com> wrote:
>
> On 23/05/16 13:46, Richard Biener wrote:
>>
>> n Mon, May 23, 2016 at 2:28 PM, Kyrill Tkachov
>> <kyrylo.tkac...@foss.arm.com> wrote:
>>>
>>> On 23/05/16 12:27, Richard Biener wrote:
>>>>
>>>> On Mon, May 23, 2016 at 1:17 PM, Kyrill Tkachov
>>>> <kyrylo.tkac...@foss.arm.com> wrote:
>>>>>
>>>>> Hi all,
>>>>>
>>>>> In this PR we end up hitting a signed overflow in
>>>>> noce_get_alt_condition
>>>>> when we try to
>>>>> increment or decrement a HOST_WIDE_INT that might be HOST_WIDE_INT_MAX
>>>>> or
>>>>> HOST_WIDE_INT_MIN.
>>>>>
>>>>> I've confirmed the overflow by adding an assert before the operation:
>>>>> gcc_assert (desired_val != HOST_WIDE_INT_MAX);
>>>>>
>>>>> This patch fixes those cases by catching the cases when desired_val has
>>>>> the
>>>>> extreme
>>>>> value and avoids the transformation that function is trying to make.
>>>>>
>>>>> Bootstrapped and tested on arm, aarch64, x86_64.
>>>>>
>>>>> I've added the testcase that I used to trigger the assert mentioned
>>>>> above
>>>>> as
>>>>> a compile test,
>>>>> though I'm not sure how much value it has...
>>>>>
>>>>> Ok for trunk?
>>>>
>>>> If this isn't also a wrong-code issue (runtime testcase?) then why not
>>>> perform
>>>> the operation in unsigned HOST_WIDE_INT instead?
>>>
>>>
>>> This part of the code transforms a comparison "x < CST" to "x <= CST - 1"
>>> and similar transformations. Fro what I understand the LT,LE,GT,GE RTL
>>> comparison
>>> operators operate on signed integers, so I'm not sure how valid it would
>>> be
>>> to do all this on unsigned HOST_WIDE_INT.
>>
>> But then this is a wrong-code issue and you should see miscompiles
>> and thus can add a dg-do run testcase instead?
>
>
> I couldn't get it to miscompile anything, because the check:
> "actual_val == desired_val + 1"  where desired_val + 1 has signed
> overflow doesn't return true, so the transformation doesn't happen anyway.
> I think whether a miscompilation can occur depends on whether the compiler
> used
> to compile GCC itself does anything funky with the undefined behaviour
> that's
> occurring, which is why we should fix it. I suppose the testcase in this
> patch only
> goes so far to show that GCC doesn't crash, but not much else. I can make it
> an execute
> testcase if you'd like, but I can't get it to fail on my setup (the
> generated assembly
> looks correct on inspection).

Please make it a execute testcase anyway.

Ok with that change.

Thanks,
Richard.

> Kyrill
>
>
> Kyrill
>
>
>> Richard.
>>
>>> Thanks,
>>> Kyrill
>>>
>>>
>>>
>>>> Richard.
>>>>
>>>>> Thanks,
>>>>> Kyrill
>>>>>
>>>>> 2016-05-23  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>
>>>>>
>>>>>       PR rtl-optimization/66940
>>>>>       * ifcvt.c (noce_get_alt_condition): Check that incrementing or
>>>>>       decrementing desired_val will not overflow before performing
>>>>> these
>>>>>       operations.
>>>>>
>>>>> 2016-05-23  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>
>>>>>
>>>>>       PR rtl-optimization/66940
>>>>>       * gcc.c-torture/compile/pr66940.c: New test.
>>>
>>>
>

Reply via email to