Problems with register elimination

Chung-Ju Wu jasonwucj@gmail.com
Mon Jul 29 00:18:00 GMT 2013


On 7/28/13 8:16 AM, David Given wrote:
> I am having a great deal of trouble getting register elimination (and
> stack frame layouts in general) working properly on my architecture.
> There is some fundamental issue I'm simply not getting here.
[...]
> Weirdness (1): I never see ARG_POINTER_REGNUM used to access arguments.
> The compiler seems to want to access function arguments via
> FRAME_POINTER_REGNUM plus a small value, which means they overlap the
> locals. (It's definitely using the same numeric ranges. It looks like
> it's trying to use ARG_POINTER_REGNUM but is getting the wrong register.)
>

Internally, ARG_POINTER_REGNUM is a pointer to the incoming arguments
which is pushed into stack by caller, and FRAME_POINTER_REGNUM is a
pointer to the first location of local variables.

                             |    |
        old stack pointer ->  ----
                             |    | \
                             |    |   incoming arguments pushed by caller
                             |    | /
         argument pointer ->   --
                             |    |
                             |    |
                             |    |
            frame pointer ->   --
                             |    | \
                             |    |   local variables
                             |    | /
                               --
                             |    | \
                             |    |   outgoing arguments
                             |    | /
            stack pointer ->  ----
                             |    |


> Weirdness (2): the following test function generates code with tries to
> copy AP_REG into a register without eliminating it.
>
[...]
>
> I don't know whether this is just talking about the MCore, or gcc in
> general --- I find it interesting that most backends which use a fake
> frame pointer seem to end up with FRAME_POINTER_REGNO and
> HARD_FRAME_POINTER_REGNO pointing at different addresses.
>
> If anyone can offer any suggestions as to what I'm doing wrong --- or,
> better still, point me at more in-depth reading on how all this is
> supposed to work!
>

Did you implement TARGET_CAN_ELIMINATE and INITIAL_ELIMINATION_OFFSET ??

You need to implement these two target macros to eliminate ARG_POINTER_REGNUM
and FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM.


Best regards,
jasonwucj



More information about the Gcc mailing list