> On Thu, Nov 12, 2020 at 11:39:07AM +0100, Jan Hubicka wrote: > > > On Thu, Nov 12, 2020 at 11:29:21AM +0100, Jan Hubicka wrote: > > > > > 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? > > > > > > Or just compare DECL_FIELD_OFFSET and DECL_FIELD_BIT_OFFSET of the fields > > > rather than their DECL_BIT_FIELD_REPRESENTATIVE? > > > > I think I will need to compare bitfields specially at the ao_ref_compare > > side anyway to distinguish > > > > struct S { int c; int a : 5, b : 1; }; > > struct T { int c; int a : 5, b : 3; }; > > > > s->b and t->b. Those have same base address (bitwise) but still we do > > not want to consider them equal. > > How is that different from: > struct S { long long d; int e; }; > struct T { long long d; long long e; }; > s->e vs. t->e ? > One thing is comparison of the address (as it is comparing > DECL_FIELD_BIT_OFFSET too, it is essentially bit-address), and another thing > (unlrelated to OEP_ADDRESS comparisons) is if you need to ensure the access > has the same size, in that case you just compare the bit size of the access...
I believe for that I only need to compare TYPE_SIZE of the access. Bitfields are special since their types are wider and they do extension. Honza > > Jakub >