annotate python/ir/basicblock.py @ 270:cdc76d183bcc

first register allocator
author Windel Bouwman
date Mon, 19 Aug 2013 21:14:28 +0200
parents 5f8c04a8d26b
children
rev   line source
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
1
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
2 class Block:
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
3 """
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
4 Uninterrupted sequence of instructions with a label at the start.
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
5 """
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
6 def __init__(self, name):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
7 self.name = name
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
8 self.instructions = []
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
9
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
10 def __repr__(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
11 return 'Block {0}'.format(self.name)
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
12
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
13 def addInstruction(self, i):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
14 i.parent = self
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
15 self.instructions.append(i)
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 177
diff changeset
16
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
17 def replaceInstruction(self, i1, i2):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
18 idx = self.instructions.index(i1)
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
19 i1.parent = None
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
20 i1.delete()
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
21 i2.parent = self
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
22 self.instructions[idx] = i2
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 177
diff changeset
23
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
24 def removeInstruction(self, i):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
25 i.parent = None
252
c4370696ccc7 added optimize function
Windel Bouwman
parents: 243
diff changeset
26 i.delete()
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
27 self.instructions.remove(i)
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 177
diff changeset
28
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
29 def getInstructions(self):
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 177
diff changeset
30 return self.instructions
243
ef683881c64e Remove various files
Windel Bouwman
parents: 239
diff changeset
31 Instructions = property(getInstructions)
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 177
diff changeset
32
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
33 def getLastIns(self):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
34 return self.instructions[-1]
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
35 LastInstruction = property(getLastIns)
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
36
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
37 @property
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
38 def Empty(self):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
39 return len(self.instructions) == 0
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
40
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
41 @property
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
42 def FirstInstruction(self):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
43 return self.instructions[0]
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
44
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
45 def getSuccessors(self):
243
ef683881c64e Remove various files
Windel Bouwman
parents: 239
diff changeset
46 if not self.Empty:
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
47 return self.LastInstruction.Targets
243
ef683881c64e Remove various files
Windel Bouwman
parents: 239
diff changeset
48 return []
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
49 Successors = property(getSuccessors)
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
50
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
51 def getPredecessors(self):
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
52 preds = []
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
53 for bb in self.parent.BasicBlocks:
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
54 if self in bb.Successors:
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
55 preds.append(bb)
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
56 return preds
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 205
diff changeset
57 Predecessors = property(getPredecessors)
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents:
diff changeset
58
258
04c19282a5aa Added register allocator
Windel Bouwman
parents: 252
diff changeset
59 def precedes(self, other):
04c19282a5aa Added register allocator
Windel Bouwman
parents: 252
diff changeset
60 raise NotImplementedError()
04c19282a5aa Added register allocator
Windel Bouwman
parents: 252
diff changeset
61
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
62 def check(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 258
diff changeset
63 pass
239
63bb40758066 added check
Windel Bouwman
parents: 219
diff changeset
64