Stelian Pop <stel...@popies.net> writes: >> I took a quick look at a similar case for x86, and the key step seems to >> be a call to ptr_difference_const. It converts the difference of two >> ADDR_EXPRs to a constant. > > in my case ptr_difference_const doesn't get called at all, because > the operands are no longer ADDR_EXPRs:
They are still ADDR_EXPRs where it counts on x86, as the code strips nop conversions. In your case the conversion from HImode to SImode seems to be defeating that. There is something strange in your trees. Why did it convert the pointers to "long int"? Why did it not simply convert them to "int"? The fact that they are going to be assigned to a "long int" variable should not have caused them to convert to "long int". Oh, I see it comes from PTRDIFF_TYPE, which defaults to "long int". Try doing #define PTRDIFF_TYPE "int" in your CPU.h file. Ian