ยง SSA as linear typed language
- Control flow is linear in a basic block: ie, we can have a sea of nodes representation, where each terminator instruction produces linear control flow tokens:
br: token[-1] --> token[1]
. brcond: token[-1] -> -> (token[1], token[1])
, return: token[-1] -> ()
. This ensures that each branching only happens once, thereby "sealing their fate. On the other hand, reguar instructions also take a "control token", but don't consume it . so for example, add: token[0] -> (name, name) -> name
.
- Next question: is dominance also somehow 'linear'?
- Answer: yes. We need quantitative types. When we branch from basic block
A
into blocks B, C
, attach 1/2A
to the control tokens from (%tokb, %tokc) = br cond %cond0 B, C
. Now, if someone builds a token that's at a basic block D
that is merged into by both B, C
, they will receive a "full" A
that they can use. Pictorially:
A
...
B C
[1/2A] [1/2A]
D
1A