Can gcc.dg/torture/pr67828.c be an infinite loop?
Aldy Hernandez
aldyh@redhat.com
Fri Sep 24 08:59:34 GMT 2021
On 9/24/21 10:08 AM, Richard Biener wrote:
> On Fri, Sep 24, 2021 at 10:04 AM Aldy Hernandez via Gcc <gcc@gcc.gnu.org> wrote:
>>
>> Hi folks.
>>
>> My upcoming threading improvements turn the test below into an infinite
>> runtime loop:
>>
>> int a, b;
>> short c;
>>
>> int
>> main ()
>> {
>> int j, d = 1;
>> for (; c >= 0; c++)
>> {
>> BODY:
>> a = d;
>> d = 0;
>> if (b)
>> {
>> xprintf (0);
>> if (j)
>> xprintf (0);
>> }
>> }
>> xprintf (d);
>> exit (0);
>> }
>>
>> On the false edge out of if(b) we thread directly to BODY, eliding the
>> loop conditional, because we know that c>=0 because it could never overflow.
>>
>> Since B is globally initialized to 0, this has the effect of turning the
>> test into an infinite loop.
>>
>> Is this correct, or did I miss something?
>
> Yes, 'c' will wrap to negative SHORT_MIN and terminate the loop via
> the c>=0 test.
Huh, so SHORT_MAX + 1 = SHORT_MIN? I thought that was an overflow, and
therefore undefined.
Aldy
>
> Mind c++ is really (short)(((int)c)++) and signed integer truncation
> is implementation
> defined.
>
> Richard.
>
>> Aldy
>>
>
More information about the Gcc
mailing list