Hi! I thought for ADDR_EXPRs we couldn't reach this, but we actually can, when there is an SSA_NAME with POINTER_PLUS_EXPR of ADDR_EXPR and constant.
The following patch handles it. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-06-30 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/71707 * tree-ssa-strlen.c (get_stridx_plus_constant): Handle already present strinfo even for ADDR_EXPR ptr. * gcc.dg/strlenopt-29.c: New test. --- gcc/tree-ssa-strlen.c.jj 2016-06-29 16:10:27.000000000 +0200 +++ gcc/tree-ssa-strlen.c 2016-06-30 10:28:30.605430361 +0200 @@ -677,8 +677,14 @@ get_stridx_plus_constant (strinfo *bases { if (r == 0) { - gcc_assert (TREE_CODE (ptr) == SSA_NAME); - ssa_ver_to_stridx[SSA_NAME_VERSION (ptr)] = si->idx; + if (TREE_CODE (ptr) == SSA_NAME) + ssa_ver_to_stridx[SSA_NAME_VERSION (ptr)] = si->idx; + else + { + int *pidx = addr_stridxptr (TREE_OPERAND (ptr, 0)); + if (pidx != NULL && *pidx == 0) + *pidx = si->idx; + } return si->idx; } break; --- gcc/testsuite/gcc.dg/strlenopt-29.c.jj 2016-06-30 10:36:34.673371348 +0200 +++ gcc/testsuite/gcc.dg/strlenopt-29.c 2016-06-30 10:38:21.731032244 +0200 @@ -0,0 +1,27 @@ +/* PR tree-optimization/71707 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fdump-tree-strlen" } */ + +#include "strlenopt.h" + +char a[32]; +size_t b; + +__attribute__((noinline, noclone)) char * +foo (void) +{ + char *p = memcpy (a, "a", 2) + 1; + memcpy (&a[1], "b", 2); + b = strlen (a) + strlen (&a[1]) + strlen (p); + return p; +} + +int +main () +{ + if (foo () != &a[1] || b != 4) + abort (); + return 0; +} + +/* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen" } } */ Jakub