https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114171
--- Comment #3 from Andrei Horodniceanu <a.horodniceanu at proton dot me> --- (In reply to Hongtao Liu from comment #2) > on rtl level,we get > > (insn 7 6 8 2 (set (reg:CCZ 17 flags) > (compare:CCZ (mem:TI (plus:DI (reg/f:DI 100 [ _5 ]) > (const_int 24 [0x18])) [0 MEM[(ucent *)_5 + 24B]+0 S16 > A128]) > (const_int 0 [0]))) "test.d":15:16 30 {*cmpti_doubleword} > (nil)) > > It's 16-byte aligned. I'm not sure I understand this notation but I think I can pick the mem function which returns a memory reference at the offset given by the _5 register? plus 24 of 16 byte size and 128 bit alignment. This does match up as the size of the BreakStatement class is 40 (24 + 16). I don't see how it can say that that memory is 16-byte aligned as in D code the alignment of the class is 8 but it may be just that, internally, gcc has a more accurate record. Could you check the rtl for the same snippet of code but instead of `interface ASTNode` do `abstract class ASTNode`? This would make BreakStatement be of size 32 instead of 40 and change the 24 offset to 16 which happens to produce a 16-byte aligned memory location. This is the only other interesting thing I hit when trying to reduce the failing code.