On 05/05/2017 06:01 AM, 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.
Oooh, very nice! :) I spent some time on something like this
last summer (under bug 71304) but didn't finish it. My patch
also handled NULs inserted by simple assignment. I see your
patch handles them when they are inserted by a call to one of
the functions but not otherwise, as in the test case below.
Is that something that could be easily handled in your
approach?
char a[30];
int f1 (void)
{
__builtin_memcpy (a, "1234567", 7);
__builtin_memcpy (a + 7, "", 1);
return __builtin_strlen (a); // is optimized to 7
}
int f2 (void)
{
__builtin_memcpy (a, "1234567", 7);
a[7] = '\0';
return __builtin_strlen (a); // could be optimized to 7
}
Martin