On Mon, 20 Jan 2025, Jakub Jelinek wrote: > Hi! > > As reported by Dimitar, this should have been a multiplication, but wasn't > caught because in the test (~(__SIZE_TYPE__) 0) / 2 is the largest accepted > size and so adding 3 to it also resulted in "overflow". > > The following patch adds one subtest to really verify it is a multiplication > and fixes the operation. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. > 2025-01-20 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/118224 > * tree-ssa-dce.cc (is_removable_allocation_p): Multiply a1 by a2 > instead of adding it. > > * gcc.dg/pr118224.c: New test. > > --- gcc/tree-ssa-dce.cc.jj 2025-01-08 12:13:30.378063752 +0100 > +++ gcc/tree-ssa-dce.cc 2025-01-19 22:27:27.047533500 +0100 > @@ -331,7 +331,7 @@ is_removable_allocation_p (gcall *stmt, > return false; > if (TREE_CODE (a1) == INTEGER_CST > && TREE_CODE (a2) == INTEGER_CST > - && (wi::to_widest (a1) + wi::to_widest (a2) > + && (wi::to_widest (a1) * wi::to_widest (a2) > > tree_to_uhwi (TYPE_MAX_VALUE (ptrdiff_type_node)))) > return false; > return true; > --- gcc/testsuite/gcc.dg/pr118224.c.jj 2025-01-06 10:11:53.398877980 > +0100 > +++ gcc/testsuite/gcc.dg/pr118224.c 2025-01-19 22:10:36.826394427 +0100 > @@ -27,5 +27,7 @@ main () > #endif > if (__builtin_calloc ((~(__SIZE_TYPE__) 0) / 2, 3)) > __builtin_abort (); > + if (__builtin_calloc ((~(__SIZE_TYPE__) 0) / 16, 64)) > + __builtin_abort (); > foo (1); > } > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)