On 08/02/18 15:26, Bernd Edlinger wrote: >> >> /* If the length can be computed at compile-time, return it. */ >> - len = c_strlen (src, 0); >> + tree array; >> + tree len = c_strlen (src, 0, &array); > > You know the c_strlen tries to compute wide character sizes, > but strlen does not do that, strlen (L"abc") should give 1 > (or 0 on a BE machine) > I wonder if that is correct. > [snip] >> >> static tree >> -fold_builtin_strlen (location_t loc, tree type, tree arg) >> +fold_builtin_strlen (location_t loc, tree fndecl, tree type, tree arg) >> { >> if (!validate_arg (arg, POINTER_TYPE)) >> return NULL_TREE; >> else >> { >> - tree len = c_strlen (arg, 0); >> - >> + tree arr = NULL_TREE; >> + tree len = c_strlen (arg, 0, &arr); > > Is it possible to write a test case where strlen(L"test") reaches this point? > what will c_strlen return then? >
Yes, of course it is: $ cat y.c int f(char *x) { return __builtin_strlen(x); } int main () { return f((char*)&L"abcdef"[0]); } $ gcc -O3 -S y.c $ cat y.s main: .LFB1: .cfi_startproc movl $6, %eax ret .cfi_endproc The reason is that c_strlen tries to fold wide chars at all. I do not know when that was introduced, was that already before your last patches? Is it possible to revert the last few patches cleanly? Bernd.