On Thu, Nov 12, 2020 at 10:49:40AM +0100, Jan Hubicka wrote: > > > + if (!operand_equal_p (DECL_FIELD_OFFSET (field0), > > > + DECL_FIELD_OFFSET (field1), > > > + flags & ~OEP_ADDRESS_OF) > > > + || !operand_equal_p (DECL_FIELD_BIT_OFFSET (field0), > > > + DECL_FIELD_BIT_OFFSET (field1), > > > + flags & ~OEP_ADDRESS_OF)) > > > > If it is an address, why do you need to handle > > DECL_BIT_FIELD_REPRESENTATIVE? Taking address of a bit-field is not > > allowed. > > Perhaps just return false if the fields are bit-fields (or assert they > > aren't), and just compare DECL_FIELD*OFFSET of the fields themselves? > > I took the code from nonoverlapping_component_refs_p_1, however in > compare_ao_refs i call compare_operands on OEP_ADDRESS for memory > operands, so it would be useful there. I think it makes sense in that > context - in order to match memory acesses for equivalence we want to > first compare that they access same memory location...
If OEP_ADDRESS is used also on non-addressable stuff, just to compare that two COMPONENT_REFs access the same memory, then just comparing DECL_BIT_FIELD_REPRESENTATIVE is not sufficient, you could have: struct S { int c; int a : 7, b : 1; }; struct T { int c; int a : 7, b : 1; }; and compare s->a vs. t->b with OEP_ADDRESS and the offsets of their DECL_BIT_FIELD_REPRESENATIVE is the same, yet we don't want to say the two bit-fields are the same. Jakub