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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|rtl-optimization            |tree-optimization
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=83239

--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
Oddly, this only happens with the statement expression, not with direct calls
to memset.

The invalid memset first shows up in the .phicprop2 dump which shows the output
below.  This seems like another instance (similar to pr83239) where the value
of the size operand to one these built-ins could be checked and, if it's
invalid/out-of-bounds, the call replaced with a trap.

;; Function g (g, funcdef_no=0, decl_uid=1839, cgraph_uid=0, symbol_order=0)

  ...
  Replacing '__n_38' with constant '4294967295'
    Original statement:memset (_16, 0, __n_38);
    Updated statement:memset (_16, 0, 4294967295);
  ...
g (char * data, unsigned int frame_size, _Bool c)
{
  unsigned int __n;
  unsigned int __n;
  unsigned int _1;
  char * _6;
  char * _16;
  char * _22;
  unsigned int _25;
  unsigned int _28;

  <bb 2> [local count: 1073741825]:
  if (frame_size_8(D) != 0)
    goto <bb 3>; [33.00%]
  else
    goto <bb 10>; [67.00%]

  <bb 3> [local count: 354334802]:
  memset (data_10(D), 5, frame_size_8(D));
  if (c_12(D) != 0)
    goto <bb 4>; [0.00%]
  else
    goto <bb 5>; [100.00%]

  <bb 4> [local count: 354334802]:
  f ();

  <bb 5> [local count: 719407025]:
  _1 = frame_size_8(D) >> 1;
  __n_14 = _1 + 4294967295;
  _6 = data_10(D) + _1;
  _25 = _1 + 4294967285;
  if (__n_14 != 0)
    goto <bb 7>; [0.00%]
  else
    goto <bb 6>; [100.00%]

  <bb 6> [local count: 719407025]:
  # _22 = PHI <_6(5), _16(9), _6(7)>
  # _28 = PHI <_25(5), 4294967285(9), _25(7)>
  memset (_22, 4, _28);
  goto <bb 8>; [100.00%]

  <bb 7> [local count: 719407025]:
  memset (_6, 0, __n_14);
  if (_25 != 0)
    goto <bb 6>; [0.00%]
  else
    goto <bb 8>; [100.00%]

  <bb 8> [local count: 1073741825]:
  return;

  <bb 9> [local count: 354334800]:
  _16 = data_10(D);
  memset (_16, 0, 4294967295);
  goto <bb 6>; [100.00%]

  <bb 10> [local count: 719407025]:
  if (c_12(D) != 0)
    goto <bb 4>; [50.75%]
  else
    goto <bb 9>; [49.25%]

}

Reply via email to