------- Comment #7 from jakub at gcc dot gnu dot org 2010-01-29 15:21 ------- :(, there apparently are VALUEs without locs so we can't always compare this way. Both the problematic VALUEs are created through e = new_cselib_val (hashval, mode, x); (the only place which doesn't assign VALUE values sequentially, but uses a hash. Both (plus:DI (reg/f:DI 7 sp) (const_int 32 [0x20])) and (plus:DI (reg/v/f:DI 3 bx [orig:83 insn_info ] [83]) (const_int 24 [0x18])) hash to the same value (and while having two values with the same hashval would be rejected inside of the same bb, it is not rejected inside of different bbs).
So the values are indeed for something completely different and thus must not be considered equal. On 64-bit hosts we could at no cost add some sequential UID to the VALUEs next to value, but on 32-bit hosts it would enlarge the struct. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42896