Georg-Johann Lay schreef op 2012-07-27 16:06:
Wouter van Gulik schrieb:
Hi list,
This code:
char* f(char* p)
{
  p++;
  return p;
}
Results in:

        mov r18,r24
        mov r19,r25
        subi r18,lo8(-(1))
        sbci r19,hi8(-(1))
        mov r24,r18
        mov r25,r19
        ret
When compiling with avr-gcc -O[23s] -mmcu=avr5 -S main.c

Oops, copy paste error; for avr5 movw is used to move the pointer registers. Still it does a useless move.


Looks very much like PR52278, which is still open.


I think this is the same, for sanity I also checked with int and long (against my Ubuntu gcc-avr 4.5.3) and it yields the same result; first move the register then the add, then move it back.

What I wonder: why is r18 picked? Clearly r26, or r30 are way better choices. Maybe this is fixed in 4.7.1 already, don't have a 4.7+ at the moment.

According to Vladimir, the register allocator (RA) should work smooth
with SUBREGs, but obviously, it does not.


Clearly.

You can try -fno-split-wide-types, but that might have other disadvantages.


That gives the expected result.


HTH,

Wouter

_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to