173
|
1
|
|
2 class RegisterAllocator:
|
|
3 def live_analyze(self):
|
|
4 # Determine liveness:
|
|
5 for i in self.Instructions:
|
|
6 i.live_in = set()
|
|
7 i.live_out = set()
|
|
8 for z in range(50):
|
|
9 # TODO iterate until converge
|
|
10 for i in self.Instructions:
|
|
11 lo_mk = i.live_out.difference(i.defs)
|
|
12 i.live_in = i.uses.union(lo_mk)
|
|
13 lo = set()
|
|
14 for s in i.succ:
|
|
15 lo = lo.union(s.live_in)
|
|
16 i.live_out = lo
|
|
17 def registerAllocate(self, ir, regs):
|
|
18 print(regs)
|
|
19 allVals = []
|
|
20 # construct interference:
|
|
21 for i in ir.Instructions:
|
|
22 for v in i.live_in:
|
|
23 allVals.append(v)
|
|
24 for v2 in i.live_in:
|
|
25 if v != v2:
|
|
26 v.interferes.add(v2)
|
|
27 # assign random registers:
|
|
28 print(allVals)
|
|
29 regs = set(regs)
|
|
30 for v in allVals:
|
|
31 takenregs = set([iv.reg for iv in v.interferes])
|
|
32 r2 = list(regs.difference(takenregs))
|
|
33 # Pick next available:
|
|
34 v.reg = r2[0]
|
|
35
|