Straight-line single assignment in C--

Edward Z. Yang ezyang at MIT.EDU
Sat Jan 21 05:44:02 CET 2012

Hello all,

I was wondering if the following style of register assignment ever
shows up in C-- code generated by GHC:

    a = R1
    I32[a] = 1
    a = R2
    I32[a] = 2

That is to say, there are two disjoint live ranges of a: we could rename
all instances of a in the first and second lines to something different
without affecting the semantics (although maybe affecting register allocation
and stack spilling.)

    asdf = R1
    I32[asdf] = 1
    a = R2
    I32[a] = 2

But C-- is not in SSA form, and even when no loops are involved it seems
that some naughty code generator could reuse a variable.  This is
pretty inconvenient, because I want to record this information

    a = R1 // used only once
    I32[a] = 1
    a = R2 // used only once
    I32[a] = 2

in a map:

    a -> used only once

But since the register names go all the same place this may end in tears.

If multiple assignment is rare enough in straight line code, I might
be able to take the conservative approach and just say

    a -> used multiple times

Which I don't think will cause any problems in the inlining step later.
But I don't have a good sense for this.


More information about the Glasgow-haskell-users mailing list