https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71303
Bug ID: 71303 Summary: missing strlen optimization for strings initialized via a braced-init-list Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- While continuing my exploration of tree-ssa-strlen.c I discovered that while optimizes a strlen call when the argument is an array initialized using a string (as in function f below), it doesn't optimize it when the argument is initialized using the braced initializer-list (as in g below). This is also the root cause behind at least part of bug 71296. (As a data point, Clang 3.8 emits optimal code for both functions in the test case.) $ cat strlen.c && /build/gcc-6-branch/gcc/xgcc -B /build/gcc-6-branch/gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout strlen.c int f (void) { char s[] = "12345"; return __builtin_strlen (s); } int g (void) { char s[] = { '1', '2', '3', '4', '5', '\0' }; return __builtin_strlen (s); } ;; Function f (f, funcdef_no=0, decl_uid=1756, cgraph_uid=0, symbol_order=0) f () { <bb 2>: return 5; } ;; Function g (g, funcdef_no=1, decl_uid=1760, cgraph_uid=1, symbol_order=1) g () { char s[6]; long unsigned int _8; int _9; <bb 2>: s[0] = 49; s[1] = 50; s[2] = 51; s[3] = 52; s[4] = 53; s[5] = 0; _8 = __builtin_strlen (&s); _9 = (int) _8; s ={v} {CLOBBER}; return _9; }