http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53705
--- Comment #2 from Michael Matz <matz at gcc dot gnu.org> 2012-06-17 15:36:19 UTC --- Or alternatively cselib doesn't respect one invariant in constructing the locations of its VALUEs. As seen above it constructs two values for the same memory area, one referring to stack pointer, the other to (hard) frame pointer. But alias.c explains: 2. stack_pointer_rtx, frame_pointer_rtx, hard_frame_pointer_rtx (if distinct from frame_pointer_rtx) and arg_pointer_rtx. Each of these rtxes has a separate ADDRESS associated with it, each with a negative id. GCC is (and is required to be) precise in which register it chooses to access a particular region of stack. We can therefore assume that accesses based on one of these rtxes do not alias accesses based on another of these rtxes. Note the last paragraph. The RTL instructions themself respect this invariant (there are no accesses via [sp], only via [bp] or derived values). But the cselib values don't. I'd say value 5 (the one referring to sp and value 2) is the broken one. It should only refer to value 2.