On Fri, May 05, 2017 at 01:01:08PM +0100, Richard Sandiford wrote: > tree-ssa-strlen.c looks for cases in which a string is built up using > operations like: > > memcpy (a, "foo", 4); > memcpy (a + 3, "bar", 4); > int x = strlen (a); > > As a side-effect, it optimises the non-final memcpys so that they don't > include the nul terminator. > > However, after removing some "& ~0x1"s from tree-ssa-dse.c, the DSE pass > does this optimisation itself (because it can tell that later memcpys > overwrite the terminators). The strlen pass wasn't able to handle these > pre-optimised calls in the same way as the unoptimised ones. > > This patch adds support for tracking unterminated strings.
I'm not sure I like the terminology (terminated vs. !terminated), I wonder if it wouldn't be better to add next to length field minimum_length field, length would be what it is now, tree representing the string length, while minimum_length would be just a guarantee that strlen (ptr) >= minimum_length, i.e. that in the first minimum_length bytes (best would be to guarantee that it is just a constant if non-NULL) are non-zero. It shouldn't be handled just by non-zero terminated memcpy, but e.g. even if you e.g. construct it byte by byte, etc. a[0] = 'a'; a[1] = 'b'; a[2] = 'c'; a[3] = 'd'; a[4] = '\0'; x = strlen (a); etc., or strcpy (a, "abcdefg"); strcpy (a + 8, "hijk"); a[7] = 'q'; x = strlen (a); or say by storing 4 non-zero bytes at a time... Jakub