[Bug tree-optimization/106511] [13 Regression] New -Werror=maybe-uninitialized since r13-1268-g8c99e307b20c502e

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Aug 19 11:39:10 GMT 2022


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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
The missed optimization is

 symTotal = 0;
 for (i = 0; i < 16; i++) {
  if (t&(1 << (15-i))) {
   k = get_bits(bd, 16);
   for (j = 0; j < 16; j++)
    if (k&(1 << (15-j)))
     symToByte[symTotal++] = (16*i)+j;
  }
 }
...
 symCount = symTotal+2;
 for (j = 0; j < groupCount; j++) {
  unsigned char length[258], temp[20 +1];
  int minLen, maxLen, pp;
# 235 "bunzip2.c"
  t = get_bits(bd, 5)-1;
  for (i = 0; i < symCount; i++) {
...
   length[i] = t+1;
  }

  minLen = maxLen = length[0];

to see that symCount cannot be zero and thus the loop header copy check for the
loop on the last line can be elided.  It looks quite obvious to me that
should be able to compute a range for symTotal and thus symCount.  SCEV
is likely of not much help here but we should be able to compute
the maximum number of times symTotal++ is executed by looking at the number
of iterations of the loop nest.

Note that with -O we do not run VRP and with -O2 we don't warn.  But
the testcase

void link_error ();
int bar ();
void foo ()
{
  int symTotal = 0;
  for (int i = 0; i < 16; ++i)
    {
      if (bar())
        symTotal++;
    }
  if (symTotal < 0 || symTotal > 16)
    link_error ();
}

shows that even with -O2 VRP only figures that symTotal is positive, it doesn't
get the upper bound:

  <bb 6> [local count: 63136016]:
  # RANGE [irange] int [0, +INF] NONZERO 0x7fffffff
  # symTotal_19 = PHI <symTotal_3(5)>
  if (symTotal_19 > 16)

given that loop header copying short-cuts the initialization of length[]
it's clear that we diagnose the unconditional use after the loop.


More information about the Gcc-bugs mailing list