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.

Reply via email to