On Fri, 12 Dec 2014, Jakub Jelinek wrote: > Hi! > > This testcase ICEs because I wasn't checking for overflow in the size > computation. Only max (diff + len2, len1) <= 1024 cases are considered, > so this patch gives up if either len2 or diff is > 1024. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.9/4.8?
Ok. Thanks, Richard. > 2014-12-12 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/64269 > * tree-ssa-forwprop.c (simplify_builtin_call): Bail out if > len2 or diff are too large. > > * gcc.c-torture/compile/pr64269.c: New test. > > --- gcc/tree-ssa-forwprop.c.jj 2014-12-01 14:57:30.000000000 +0100 > +++ gcc/tree-ssa-forwprop.c 2014-12-12 09:46:05.790053928 +0100 > @@ -1288,7 +1288,8 @@ simplify_builtin_call (gimple_stmt_itera > use_operand_p use_p; > > if (!tree_fits_shwi_p (val2) > - || !tree_fits_uhwi_p (len2)) > + || !tree_fits_uhwi_p (len2) > + || compare_tree_int (len2, 1024) == 1) > break; > if (is_gimple_call (stmt1)) > { > @@ -1354,7 +1355,8 @@ simplify_builtin_call (gimple_stmt_itera > is not constant, or is bigger than memcpy length, bail out. */ > if (diff == NULL > || !tree_fits_uhwi_p (diff) > - || tree_int_cst_lt (len1, diff)) > + || tree_int_cst_lt (len1, diff) > + || compare_tree_int (diff, 1024) == 1) > break; > > /* Use maximum of difference plus memset length and memcpy length > --- gcc/testsuite/gcc.c-torture/compile/pr64269.c.jj 2014-12-12 > 09:47:04.795015479 +0100 > +++ gcc/testsuite/gcc.c-torture/compile/pr64269.c 2014-12-12 > 09:46:51.000000000 +0100 > @@ -0,0 +1,9 @@ > +/* PR tree-optimization/64269 */ > + > +void > +foo (char *p) > +{ > + __SIZE_TYPE__ s = ~(__SIZE_TYPE__)0; > + *p = 0; > + __builtin_memset (p + 1, 0, s); > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Jennifer Guild, Dilip Upmanyu, Graham Norton HRB 21284 (AG Nuernberg)