-
Notifications
You must be signed in to change notification settings - Fork 22
/
liveness.go
54 lines (47 loc) · 1.11 KB
/
liveness.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Value liveness analysis & register allocation.
package compiler
// FIXME: The current RegAlloc is based on wasm stack info and we probably
// want a real one (in addition to this) with liveness analysis.
// Returns the total number of registers used.
func (c *SSAFunctionCompiler) RegAlloc() int {
regID := TyValueID(1)
valueRelocs := make(map[TyValueID]TyValueID)
for _, values := range c.StackValueSets {
for _, v := range values {
valueRelocs[v] = regID
}
regID++
}
for i := range c.Code {
ins := &c.Code[i]
if ins.Target != 0 {
if reg, ok := valueRelocs[ins.Target]; ok {
ins.Target = reg
} else {
panic("Register not found for target")
}
}
for j, v := range ins.Values {
if v != 0 {
if reg, ok := valueRelocs[v]; ok {
ins.Values[j] = reg
} else {
panic("Register not found for value")
}
}
}
}
return int(regID)
}
func (ins *Instr) BranchTargets() []int {
switch ins.Op {
case "jmp", "jmp_if", "jmp_table":
ret := make([]int, len(ins.Immediates))
for i, t := range ins.Immediates {
ret[i] = int(t)
}
return ret
default:
return []int{}
}
}