> 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.
You are right, I was just thinking of that. I suppose it indeed makes more sense to assert that there are no bitfields here and in the AO comparsion take care of stripping the last bitfield reference and handling it specially? Honza > > Jakub >