https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69909

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The wrong alias set appears in expr.c:10524
        if (op0 == orig_op0)
          op0 = copy_rtx (op0);

        set_mem_attributes (op0, exp, 0); /// <<<<< HERE

        if (REG_P (XEXP (op0, 0)))
          mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));

Before that op0 has the right alias set from expansion:
(mem:TI (plus:DI (reg/f:DI 82 virtual-stack-vars)
        (const_int -48 [0xffffffffffffffd0])) [1  S16 A128])
but after this
(mem/j/c:TI (plus:DI (reg/f:DI 82 virtual-stack-vars)
        (const_int -48 [0xffffffffffffffd0])) [2  S16 A128])
Alias set 1 is TYPE_ALIAS_SET of the V vector, 2 is TYPE_ALIAS_SET of the U
vector.
exp here is:
debug_generic_stmt (exp)
BIT_FIELD_REF <_7, 128, 128>;
where:
_7 = VIEW_CONVERT_EXPR<U>(d.1_6);
I'd say that VIEW_CONVERT_EXPR expansion should make sure if it returns a MEM_P
that MEM_KEEP_ALIAS_SET is set on it at least if the TYPE_ALIAS_SET of the type
is different from MEM_ALIAS_SET.
And then BIT_FIELD_REF (and other handled_component_p expansion) should honor
MEM_KEEP_ALIAS_SET (or should that be set_mem_attributes_minus_bitpos itself),
and not adjust the alias set of the MEM.

Reply via email to