On 24/09/2021 10:29, Andrew Pinski via Gcc wrote:
On Fri, Sep 24, 2021 at 1:05 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.

Huh about c>=0 being always true? the expression, "c++" is really c=
(short)(((int)c)+1).  So it will definitely wrap over when c is
SHRT_MAX.

Except when sizeof(short) == sizeof (int), at which point the 'int' expression will overflow and we get UB again.

R.


Thanks,
Andrew Pinski


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?
Aldy

Reply via email to