http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49079
--- Comment #3 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-05-20 13:21:23 UTC --- I think it goes wrong when folding during inlining of ustr_len. D.2729_11 = xi1_6 + 1; switch (xi2_9) <default: <L5>, case 0: <L6>, case 1: <L4>, case 2: <L3>, case 4: <L2>, case 8: <L1>> ... <L4>: D.2772_47 = MEM[(const unsigned char *)s1_1(D)].data[D.2729_11]{lb: 0 sz: 1}; at runtime xi1_6 is zero. After inlining we get D.2830_13 = xi1_9 + 1; switch (xi2_12) <default: <L7>, case 0: <L8>, case 1: <L6>, case 2: <L5>, case 4: <L4>, case 8: <L3>> ... # ret_45 = PHI <0(2), ret_42(5)> <L6>: D.2828_43 = 1; but we are called with s1_1 = "\1\2s2" so somehow the offset from the array ref around the MEM is ignored.