[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-bugs
Subject:    [Bug tree-optimization/109350] FAIL: g++.dg/warn/Wstringop-overflow-4.C
From:       amacleod at redhat dot com via Gcc-bugs <gcc-bugs () gcc ! gnu ! org>
Date:       2023-03-31 20:47:44
Message-ID: bug-109350-4-HcZpjZkeuU () http ! gcc ! gnu ! org/bugzilla/
[Download RAW message or body]

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

--- Comment #4 from Andrew Macleod <amacleod at redhat dot com> ---
Perhaps its clearer (HA!) if I turn the IL into a C program:
This is what the code sequence we are seeing effectively does:

int need_beer(int value);
int need_big_beer(unsigned long value);

int beer(int value)
{
  unsigned long x = value;
  unsigned long y = x + 0x80000000;
  if (y < 0xFFFFFFFF)
    {
      int r = x;
      int t = r + 1;
      unsigned long z = t;
      if (x >  0x3FFFFFFFFFFFFFFC)
        {
          need_beer (r);
          if (z <= 0x3FFFFFFFFFFFFFFC)
            need_big_beer (z);
        }
    }
}


and with relevant outgoing edges:
    <bb 2> :
    x_3 = (long unsigned int) value_2(D);
    y_4 = x_3 + 2147483648;
    if (y_4 != 4294967295)
      goto <bb 3>; [INV]
    else
      goto <bb 6>; [INV]

x_3 : [irange] long unsigned int [0, 2147483647][18446744071562067968, +INF]
y_4 : [irange] long unsigned int [0, 4294967295] NONZERO 0xffffffff
2->3  (T) value_2(D) :  [irange] int [-INF, 2147483646]
2->3  (T) x_3 :         [irange] long unsigned int [0,
2147483646][18446744071562067968, +INF]
2->3  (T) y_4 :         [irange] long unsigned int [0, 4294967294] NONZERO
0xffffffff

    <bb 3> :
    t_7 = value_2(D) + 1;
    z_8 = (long unsigned int) t_7;
    if (x_3 > 4611686018427387900)
      goto <bb 4>; [INV]
    else
      goto <bb 6>; [INV]

t_7 : [irange] int [-2147483647, +INF]
z_8 : [irange] long unsigned int [0, 2147483647][18446744071562067969, +INF]
3->4  (T) value_2(D) :  [irange] int [-INF, -1]
3->4  (T) x_3 :         [irange] long unsigned int [18446744071562067968, +INF]
3->4  (T) t_7 :         [irange] int [-2147483647, 0]
3->4  (T) z_8 :         [irange] long unsigned int [0, 0][18446744071562067969,
+INF]

    <bb 4> :
    need_beer (value_2(D));
    if (z_8 <= 4611686018427387900)
      goto <bb 5>; [INV]
    else
      goto <bb 6>; [INV]

4->5  (T) value_2(D) :  [irange] int [-1, -1]
4->5  (T) z_8 :         [irange] long unsigned int [0, 0] NONZERO 0x0

    <bb 5> :
    need_big_beer (0);=
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic