https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109093
--- Comment #20 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to H.J. Lu from comment #19)
> .DEFERRED_INIT has
>
> insn 259 261 297 4 (set (reg/f:DI 144)
> (plus:DI (reg/f:DI 19 frame)
> (const_int -32 [0xffffffffffffffe0]))) 241 {*leadi}
> (expr_list:REG_EQUAL (plus:DI (reg/f:DI 19 frame)
> (const_int -32 [0xffffffffffffffe0]))
> (nil)))
>
> vs explicit __builtin_memset
>
> insn 264 149 153 34 (set (reg/f:DI 144)
> (plus:DI (reg/f:DI 19 frame)
> (const_int -32 [0xffffffffffffffe0]))) 241 {*leadi}
> (expr_list:REG_EQUIV (plus:DI (reg/f:DI 19 frame)
> (const_int -32 [0xffffffffffffffe0]))
> (nil)))
>
> LRA can eliminate (reg/f:DI 144) with REG_EQUIV, but not with REG_EQUAL.
Neither .DEFERRED_INIT nor explicit zero initialization fills those at all, try
-O2 -ftrivial-auto-var-init=zero:
void foo (char *);
void
bar (void)
{
char a[48];
char b[48] = {};
foo (a);
foo (b);
}
REG_EQUAL (in both cases) is added during cse1.