Daniel Berlin writes: > On 6/15/07, Adam Nemet <[EMAIL PROTECTED]> wrote: > > get_alias_set and internally record_component_aliases makes > > assumptions about the IR that are only valid in RTL. > > What is this assumption, exactly?
That non-addressable fields are always accessed through alias set 0. For example: X: (set (mem A) ...) Y: (set (zero_extract (mem B) 2 2) ...) Let's say that A and B both point to the same type and have the same alias set 1. The bitfield store in Y would normally have the alias set of the field, let's say 2. Normally 2 would have to be recorded as an alias subset of 1. This is not done in RTL and the comment before record_component_aliases mentions this: /* Record that component types of TYPE, if any, are part of that type for aliasing purposes. For record types, we only record component types for fields that are marked addressable. If I am not mistaken this is because the functions expanding RTL ensure that the alias set of the mem operand in Y has alias set 0. Or to quote expmed.c: /* We may be accessing data outside the field, which means we can alias adjacent data. */ if (MEM_P (op0)) { op0 = shallow_copy_rtx (op0); set_mem_alias_set (op0, 0); set_mem_expr (op0, 0); } Adam