On Thu, 17 Oct 2019, Jakub Jelinek wrote: > Hi! > > objsz computation has two modes. One is a cheap one that doesn't handle > SSA_NAMEs and is used in say random builtin folding. The other is > where compute_builtin_object_size is called in between init_object_sizes () > and fini_object_sizes () calls, where those set up data structures and the > call then handles SSA_NAMEs and caches results for them. This second mode > is what the objsz pass uses, and in some cases the strlen pass too, but in > other cases it doesn't. While fini_object_sizes (); is called > unconditionally at the end of strlen pass, init_object_sizes () is only > called when the strlen pass calls handle_printf_call which calls > get_destination_size; after that, any strcmp etc. takes advantage of that, > but if no *printf is encountered, it will not. Note, init_object_sizes () > can be called multiple times and does nothing the second and following time, > unless fini_object_sizes () has been called. And fini_object_sizes () can > be called multiple times and doesn't do anything if since the last > fini_object_sizes () no init_object_sizes () has been called. > > So, on the following testcase without the patch, we set the value range > of the first strcmp call to ~[0, 0], because we determine the buffer holding > the first operand is at most 7 bytes long, but the second operand is a > string literal with 7 characters + terminating NUL, but on the second call > we don't, because no sprintf has been called in the function (and processed > before the call). > > Fixed thusly, ok for trunk if it passes bootstrap/regtest?
OK. Richard. > 2019-10-17 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/92056 > * tree-ssa-strlen.c (determine_min_objsize): Call init_object_sizes > before calling compute_builtin_object_size. > > * gcc.dg/tree-ssa/pr92056.c: New test. > > --- gcc/tree-ssa-strlen.c.jj 2019-10-17 00:18:09.851648007 +0200 > +++ gcc/tree-ssa-strlen.c 2019-10-17 10:19:19.546086865 +0200 > @@ -3462,6 +3462,8 @@ determine_min_objsize (tree dest) > { > unsigned HOST_WIDE_INT size = 0; > > + init_object_sizes (); > + > if (compute_builtin_object_size (dest, 2, &size)) > return size; > > --- gcc/testsuite/gcc.dg/tree-ssa/pr92056.c.jj 2019-10-17 > 10:18:25.819907087 +0200 > +++ gcc/testsuite/gcc.dg/tree-ssa/pr92056.c 2019-10-17 10:17:56.201359262 > +0200 > @@ -0,0 +1,36 @@ > +/* PR tree-optimization/92056 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > +/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */ > +/* { dg-final { scan-tree-dump-not "strcmp \\(" "optimized" } } */ > + > +void bar (int, char *); > + > +int > +foo (int x, char *y, const char *z) > +{ > + char *a; > + __builtin_sprintf (y, z); > + if (x == 3) > + a = __builtin_malloc (5); > + else if (x == 7) > + a = __builtin_malloc (6); > + else > + a = __builtin_malloc (7); > + bar (x, a); > + return __builtin_strcmp (a, "abcdefg") != 0; > +} > + > +int > +baz (int x) > +{ > + char *a; > + if (x == 3) > + a = __builtin_malloc (5); > + else if (x == 7) > + a = __builtin_malloc (6); > + else > + a = __builtin_malloc (7); > + bar (x, a); > + return __builtin_strcmp (a, "abcdefg") != 0; > +} > > Jakub > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)