I'm porting to a 16 bit micro and noticed that when optimization is enabled (function.c:2101), most (non-volatile, non-addressed) stack variables are copied into virtual registers. I assume this is so the register allocator will attempt to allocate them to physical registers.

Unfortunately, in those cases where there are a lot of stack parameters and those virtual registers are spilled to local variables a lot of code and stack space is wasted copying an image of the stack parameters into a spill slot instead of the overflow dropping back to use the original stack parameter space.

For example ...

    add    sp,-20
    st    r0,[sp]
    st    r1,[sp+2]
    ld    r0,[sp+24]
    st    r0,[sp+4]
    ld    r2,[sp+26]
    st    r2,[sp+6]
    ld    r3,[sp+28]
    st    r3,[sp+8]
    ld    r0,[sp+30]
    st    r0,[sp+10]

I'm aware that there are cases where the stack parameters are unsuitable as spill locations (due to partial values, alignment etc) but the majority of cases I see such as the example above the stack parameters are viable spill locations. In the case illustrated above the required stack space has blown out significantly and there are a host of redundant load/store operations that could be eliminated if the spill were to the stack parameters.

For small micros such as MSP430 & friends and many of the Renasis MCUs, some of which only have 2K or ram on board, this could be a real issue.

Although I reproduced the same behaviour on i386 using a stock compiler, I was wondering if there was something missing in my port that prevents spilling to stack locations, or a cleanup pass that addresses this issue ?

Thanks, Paul

Reply via email to