http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57230
Bug ID: 57230 Summary: tree-ssa-strlen incorrectly optimizes a strlen to 0 Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: zackw at panix dot com GCC 4.7 and 4.8 mis-optimize this test case: int main(void) { char pstring[] = " hello world"; pstring[0] = (char) (__builtin_strlen(pstring) - 1); __builtin_printf("%zd\n", __builtin_strlen(pstring)); return 0; } The value written to pstring[0] is (char)11, which is nonzero, so both calls to __builtin_strlen should return 12. However, tree-ssa-strlen replaces the second call with a constant 0. Here are tree dumps right before (-fdump-tree-phiopt2) ... main () { char pstring[13]; long unsigned int _3; unsigned char _4; unsigned char _5; char _6; long unsigned int _8; <bb 2>: pstring = " hello world"; _3 = __builtin_strlen (&pstring); _4 = (unsigned char) _3; _5 = _4 + 255; _6 = (char) _5; pstring[0] = _6; _8 = __builtin_strlen (&pstring); __builtin_printf ("%zd\n", _8); pstring ={v} {CLOBBER}; return 0; } ... and right after (-fdump-tree-strlen): main () { char pstring[13]; long unsigned int _3; unsigned char _4; unsigned char _5; char _6; long unsigned int _8; <bb 2>: pstring = " hello world"; _3 = __builtin_strlen (&pstring); _4 = (unsigned char) _3; _5 = _4 + 255; _6 = (char) _5; pstring[0] = _6; _8 = 0; __builtin_printf ("%zd\n", _8); pstring ={v} {CLOBBER}; return 0; } This is both a missed and an incorrect optimization; it should have replaced the *first* call to __builtin_strlen with 12, and ideally also been able to figure out that the second call was unaffected by the write to pstring[0]. However, only the replacement of the second call with 0 is a correctness issue. Simplified from Debian #707118 <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=707118> (which I'm about to reopen). Observed with both 4.7.3 and 4.8.0.