http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55142
--- Comment #27 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2012-11-08 17:17:35 UTC --- > No, this would be one giant kludge by itself. The failure just shows that the > controversial patch [1] for PR 49721 was wrong. > > Quote from [1]: > > --quote-- > I am checking in this patch, which only affects x32 > and nothing else. This one character change, from > > POINTERS_EXTEND_UNSIGNED < 0 > > to > > POINTERS_EXTEND_UNSIGNED != 0 > > creates a working x32 GCC. This isn't perfect. I have > tried many different approaches without any success. > I will revisit it if we run into any problems with x32 > applications. > --/qoute-- > > So, we run into problem. It's not totally wrong, given the context of convert_memory_address_addr_space which is already optimistically correct only. The problem is that the case POINTERS_EXTEND_UNSIGNED > 0 is trickier than POINTERS_EXTEND_UNSIGNED == 0 because RTL constants are sign-extended: in the latter case, everything is sign-extended so this is symmetric and simple; in the former case, one part is zero-extended and the other part sign-extended and, in order to make this work under the same hypothesis of non-overflow, one would need to know which part is bigger. In the case at hand, the code would be correct if the constant was zero-extended and the register sign-extended, not the reverse as currently.