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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-12-16
     Ever confirmed|0                           |1

--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
I cannot reproduce the warnings with my powerpc64le cross compiler, either at
-O2 or -O3 when the loop is fully unrolled, or with any other options I tried
(e.g., -mcpu=power8 and -mcpu=power9), but I did manage to reproduce it with a
powerpc64-linux cross.  The -maltivec option makes a difference.

Below are parts of the dump of the function the warning sees and that cause the
some of the warnings.  The warning is working correctly -- the out-of-bounds
accesses are in the IL.  It looks like they are introduced by jump threading.

Suppressing the new warning by -Wno-stringop-truncation doesn't seem
appropriate because the test was added to verify no warning (originally
-Warray-bounds) is issued for such accesses.  I don't know why they only show
up with the powerpc64 back end and not others.

foo (char * in, char * out, int num)
{
  ...
  char ovec[16];
  ...
  <bb 2> [local count: 118111600]:
  ovec = "\x00";
  if (num_13(D) > 0)
    goto <bb 3>; [89.00%]
  else
    goto <bb 38>; [11.00%]

  <bb 3> [local count: 105119324]:
  _10 = (unsigned int) num_13(D);
  _9 = _10 + 4294967295;
  addr2int0_27 = (signed long) out_14(D);
  andmask_21 = addr2int0_27 & 15;
  _26 = _9 > 14;
  _22 = andmask_21 == 0;
  _30 = in_17(D) + 1;
  _31 = out_14(D) - _30;
  _32 = (sizetype) _31;
  _33 = _32 > 14;
  _76 = _33 & _22;
  _34 = _76 & _26;
  if (_34 != 0)
    goto <bb 4>; [80.00%]
  else
    goto <bb 20>; [20.00%]

  <bb 4> [local count: 84095460]:
  bnd.6_56 = _10 >> 4;
  in_60 = in_17(D) & -16B;
  vect__3.9_61 = MEM <vector(16) char> [(char *)in_60];
  vect__3.12_62 = __builtin_altivec_mask_for_load (in_17(D));
  vectp_in.15_64 = in_17(D) + 15;
  vectp_in.14_67 = vectp_in.15_64 & -16B;
  vect__3.16_68 = MEM <vector(16) char> [(char *)vectp_in.14_67];
  vect__3.17_69 = REALIGN_LOAD <vect__3.9_61, vect__3.16_68, vect__3.12_62>;
  MEM <vector(16) char> [(char *)&ovec] = vect__3.17_69;
  MEM <vector(16) char> [(char *)out_14(D)] = vect__3.17_69;
  vectp_in.14_66 = vectp_in.15_64 + 16;
  vectp_out.20_74 = out_14(D) + 16;
  niters_vector_mult_vf.7_57 = bnd.6_56 << 4;
  tmp.8_58 = (int) niters_vector_mult_vf.7_57;
  if (_10 == niters_vector_mult_vf.7_57)
    goto <bb 36>; [6.25%]
  else
    goto <bb 5>; [93.75%]

  <bb 5> [local count: 78839493]:
  _205 = (sizetype) tmp.8_58;
  _206 = in_17(D) + 16;
  _207 = *_206;
  ovec[tmp.8_58] = _207;
  _209 = vectp_out.20_74;
  MEM[(char *)vectp_out.20_74] = _207;
  i_211 = tmp.8_58 + 1;
  if (num_13(D) > 17)
    goto <bb 6>; [89.00%]
  else
    goto <bb 36>; [11.00%]

  <bb 6> [local count: 70167152]:
  _214 = 17;
  _215 = in_17(D) + 17;
  _216 = *_215;
  ovec[17] = _216;   <<< index value 17 is out of the bounds of char[16]
  _218 = out_14(D) + 17;
  *_218 = _216;
  i_220 = 18;
  if (num_13(D) > 18)
    goto <bb 7>; [89.00%]
  else
    goto <bb 36>; [11.00%]
  ...
  <bb 19> [local count: 15424248]:
  _48 = 30;
  _49 = in_17(D) + 30;
  _50 = *_49;
  ovec[30] = _50;   <<< index value 30 is out of the bounds of char[16]
  _52 = out_14(D) + 30;
  *_52 = _50;
  i_54 = 31;
  goto <bb 36>; [100.00%]
  ...

Reply via email to