https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71625
Bug ID: 71625 Summary: missing strlen optimization on different array initialization style Product: gcc Version: tree-ssa Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: renlin at gcc dot gnu.org Target Milestone: --- Hi, The following two functions shall give the same result 3. Currently, foo () can be optimized to return a constant. bar (), however, contains function call to strlen, which is sub-optimal. int foo () { char array[] = "abc"; return __builtin_strlen (array); } int bar () { char array[] = {'a', 'b', 'c', '\0'}; return __builtin_strlen (array); } Clang 3.8 produce optimal code-generation for both cases. In addition, I have another case here: int hallo (); int dummy () { char array[] = "abc"; return hallo () + __builtin_strlen (array); } the __builtin_strlen is not fold into a const as in foo () above. Presumably, gcc is too conservative about what hallo () function can do. By adding a pure attribute to hallo (), gcc will generate optimal code. Clang 3.8 gives optimal code in this case as well.