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.

Reply via email to