On Thu, 26 Nov 2020, Jakub Jelinek wrote: > Hi! > > When playing with __builtin_bit_cast, I have noticed __builtin_clear_padding > ICE on the G class below. The artificial field with D type has offset 0 > and size 8 bytes, but the following artificial field with E type has offset > 0 and size 0, so it triggers the asserts that we don't move current position > backwards. Fixed by ignoring is_empty_type (TREE_TYPE (field)) fields, all > of their bits are padding which is what is added when skipping over to next > field anyway. > > Ok for trunk if it passes bootstrap/regtest? So far passed all > builtin-clear-padding* tests, so everything that uses these functions ATM > in the GCC tree.
OK. Richard. > 2020-11-26 Jakub Jelinek <ja...@redhat.com> > > PR libstdc++/88101 > * gimple-fold.c (clear_padding_type): Ignore fields with is_empty_type > types. > > * g++.dg/torture/builtin-clear-padding-3.C: New test. > > --- gcc/gimple-fold.c.jj 2020-11-26 14:05:07.393268700 +0100 > +++ gcc/gimple-fold.c 2020-11-26 14:18:10.826532574 +0100 > @@ -4533,6 +4533,8 @@ clear_padding_type (clear_padding_struct > "well defined padding bits for %qs", > field, "__builtin_clear_padding"); > } > + else if (is_empty_type (TREE_TYPE (field))) > + continue; > else > { > HOST_WIDE_INT pos = int_byte_position (field); > --- gcc/testsuite/g++.dg/torture/builtin-clear-padding-3.C.jj 2020-11-26 > 14:26:40.532848182 +0100 > +++ gcc/testsuite/g++.dg/torture/builtin-clear-padding-3.C 2020-11-26 > 14:27:51.995051122 +0100 > @@ -0,0 +1,24 @@ > +/* PR libstdc++/88101 */ > + > +struct D { int a; int : 24; int b : 8; }; > +struct E {}; > +struct F { char c, d, e; }; > +struct G : public D, E, F { int f; } g1, g2; > + > +__attribute__((noipa)) void > +foo (G *g) > +{ > + g->a = -1; g->b = -1; g->c = -1; g->d = -1; g->e = -1; g->f = -1; > +} > + > +int > +main () > +{ > + __builtin_memset (&g2, -1, sizeof (g2)); > + foo (&g1); > + foo (&g2); > + __builtin_clear_padding (&g2); > + if (__builtin_memcmp (&g1, &g2, sizeof (g1))) > + __builtin_abort (); > + return 0; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imend