annotate python/transform.py @ 175:a51b3c956386

Added function call in expressions
author Windel Bouwman
date Fri, 19 Apr 2013 22:15:54 +0200
parents 3eb06f5fb987
children 5fd02aa38b42
rev   line source
173
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
1 from ir import *
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
2 # Standard passes:
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
3
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
4 class FunctionPass:
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
5 def run(self, ir):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
6 """ Main entry point for the pass """
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
7 for f in ir.Functions:
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
8 self.onFunction(f)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
9 def onFunction(self, f):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
10 """ Override this virtual method """
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
11 raise NotImplementedError()
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
12
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
13 class BasicBlockPass(FunctionPass):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
14 def onFunction(self, f):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
15 for bb in f.BasicBlocks:
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
16 self.onBasicBlock(bb)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
17 def onBasicBlock(self, bb):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
18 """ Override this virtual method """
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
19 raise NotImplementedError()
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
20
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
21 class InstructionPass(BasicBlockPass):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
22 def onBasicBlock(self, bb):
174
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
23 for ins in iter(bb.Instructions):
173
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
24 self.onInstruction(ins)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
25 def onInstruction(self, ins):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
26 """ Override this virtual method """
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
27 raise NotImplementedError()
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
28
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
29 # Usefull transforms:
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
30 class ConstantFolder(InstructionPass):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
31 def onInstruction(self, i):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
32 if type(i) is ImmLoad:
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
33 i.target.constval = i.value
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
34 elif type(i) is BinaryOperator:
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
35 a = i.value1
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
36 b = i.value2
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
37 if hasattr(a, 'constval') and hasattr(b,'constval'):
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
38 op = i.operation
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
39 if op == '+':
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
40 i2 = ImmLoad(i.result, a.constval + b.constval)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
41 i.Parent.replaceInstruction(i, i2)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
42 elif op == '*':
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
43 i2 = ImmLoad(i.result, a.constval * b.constval)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
44 i.Parent.replaceInstruction(i, i2)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
45 elif op == '-':
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
46 i2 = ImmLoad(i.result, a.constval - b.constval)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
47 i.Parent.replaceInstruction(i, i2)
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
48
174
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
49 class DeadCodeDeleter(BasicBlockPass):
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
50 def onBasicBlock(self, bb):
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
51 def instructionUsed(ins):
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
52 if len(ins.defs) == 0:
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
53 # In case this instruction does not define any variables, assume it is usefull.
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
54 return True
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
55 for d in ins.defs:
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
56 if d.IsUsed:
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
57 return True
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
58 return False
3eb06f5fb987 Added memory alloc for locals
Windel Bouwman
parents: 173
diff changeset
59 bb.Instructions = list(filter(instructionUsed, bb.Instructions))
173
c1d2b6b9f9a7 Rework into passes
Windel Bouwman
parents:
diff changeset
60
175
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
61 def isAllocPromotable(allocinst):
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
62 # Check if alloc value is only used by load and store operations.
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
63 assert type(allocinst) is Alloc
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
64 for use in ai.value.used_by:
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
65 print(use.user, use)
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
66 if not type(use.user) in [Load, Store]:
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
67 # TODO: check volatile
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
68 return False
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
69 otherUse = True
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
70 return True
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
71
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
72 class Mem2RegPromotor(FunctionPass):
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
73 def onFunction(self, f):
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
74 print(f)
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
75