http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58970
--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Bernd Edlinger from comment #10) > but this should'nt be neccessary then? > > if (bitoffset > *bitpos) > { > HOST_WIDE_INT adjust = bitoffset - *bitpos; > - > gcc_assert ((adjust % BITS_PER_UNIT) == 0); > - gcc_assert (*offset != NULL_TREE); > > *bitpos += adjust; > - *offset > - = size_binop (MINUS_EXPR, *offset, size_int (adjust / BITS_PER_UNIT)); > + if (*offset == NULL_TREE) > + *offset = size_int (-adjust / BITS_PER_UNIT); > + else > + *offset > + = size_binop (MINUS_EXPR, *offset, size_int (adjust / BITS_PER_UNIT)); > *bitstart = 0; > } Can you prove it isn't necessary? I mean, *bitpos could still be smaller than bitoffset, even when not negative, say with some packed+aligned structures containing bitfields or similar. NULL_TREE *offset is the same thing as zero at that spot, just perhaps less efficient in that case, so I think if we can't prove it will not be hit, it is easy to handle it.