


Stack Areas: How to name stack locations before laying out the stack

The current conversion from STG to CMM leaves stack management completely implicit. The consequence is that a number of things must happen all at once:

  • The stack is laid out.



For example

f(x) {
   y = x;

   call g(x) returning to L;


should be compiled to

   y = x;


   m[stack(L, 1)] = x; // copy the argument
   m[stack(L, 0)] = L;
   call g();


The exact syntax will probably be a bit different, making the representation of the stack slots abstract, but there's the gist of it.

Ah, but do we assign stack slots? As it turns out, an important optimization in GHC is to use return values as stack slots whenever possible. For example, given the program

f() {
  x = g();

If g() returns x on the stack, we would like the return location be used as x's stack slot for the rest of the procedure. Issues raised by this (to be expounded upon):


Ah! Here's an argument for making the stack slots abstract and unique, instead of referring to two values that share the same stack slot (e.g. a call parameter and a return parameter) by the same name. Another apparently important GHC optimization is to keep a return address live on the stack if it can be reused in a subsequent call. It would be really easy to say that an abstract stack slot is live. But it's not so easy if the only way to name the slot is by its (non-distinct) address stack(L, 3) because stack(L, 3) may also be used by some other value that shares the same slot.

Attachments (2)

Download all attachments as: .zip