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

prathamesh3492 at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |prathamesh3492 at gcc dot 
gnu.org

--- Comment #3 from prathamesh3492 at gcc dot gnu.org ---
Hi,
As of r238513, gcc folds call to strlen into constant.
void f(unsigned x)

void g()
{
  char s[] = "hello";
  f (__builtin_strlen (s + 1));
}

optimized dump shows:
;; Function g (g, funcdef_no=0, decl_uid=1753, cgraph_uid=0, symbol_order=0)

Optimizing: _1 = __builtin_strlen (&MEM[(void *)&s + 1B]);
into: _1 = 4;
g ()
{
  char s[6];
  long unsigned int _1;
  unsigned int _2;

  <bb 2>:
  s = "hello";
  _1 = 4;
  _2 = (unsigned int) _1;
  f (_2);
  s ={v} {CLOBBER};
  return;

}

However there seems to be another issue, if there are repeated
calls to strlen() with same arg, only the first call is folded.
For example consider following case:

void f (unsigned);

void g (void)
{
    char s[] = "hello";
    f (__builtin_strlen (s));
    f (__builtin_strlen (s));
}

Only the first call to __builtin_strlen() is folded to 5,
the second one isn't.
Optimized dump shows:
;; Function g (g, funcdef_no=0, decl_uid=1753, cgraph_uid=0, symbol_order=0)

Optimizing: _1 = __builtin_strlen (&s);
into: _1 = 5;
g ()
{
  char s[6];
  long unsigned int _1;
  unsigned int _2;
  long unsigned int _3;
  unsigned int _4;

  <bb 2>:
  s = "hello";
  _1 = 5;
  _2 = (unsigned int) _1;
  f (_2);
  _3 = __builtin_strlen (&s);
  _4 = (unsigned int) _3;
  f (_4);
  s ={v} {CLOBBER};
  return;

}

clang seems to fold both the calls to 5.

Thanks,
Prathamesh

Reply via email to