https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121371

            Bug ID: 121371
           Summary: Misoptimize when signed integer is used as index and
                    increase repeatedly
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: z00823823 at outlook dot com
  Target Milestone: ---

I watched a video of CppCon 2016
https://youtu.be/yG1OZ69H_-o?t=2357&si=PHngSgE8CboKWpeq

There is an example in the video (below is a heavily simplified version):

```c
#define False ((Bool)0)
typedef unsigned int UInt32;
typedef unsigned char UChar;
typedef unsigned char Bool;

Bool mainGtU ( UInt32  i1, 
               UInt32  i2,
               UChar*  block )
{
   UChar  c1, c2;

   /* 1 */
   c1 = block[i1]; c2 = block[i2];
   if (c1 != c2) return (c1 > c2);
   i1++; i2++;
   /* 2 */
   c1 = block[i1]; c2 = block[i2];
   if (c1 != c2) return (c1 > c2);
   i1++; i2++;
   /* 3 */
   c1 = block[i1]; c2 = block[i2];
   if (c1 != c2) return (c1 > c2);
   i1++; i2++;

   return False;
}
```

This code is not good because the i1 and i2 is unsigned int and the cimpiler
can not "cache" the block+i1 result because the i1 i2 must warp aroud if it
overlfows.

The speaker provides a better code, by simply using signed int i1/i2 because
signed int overflow is UB and compiler can assume they never happens and
generate better code.

I tried the speaker's method in clang and it does generate better code:
https://godbolt.org/z/cez7W7x36

But when I tried it in gcc it generates worth code:
https://godbolt.org/z/fG5ce7rqK

Reply via email to