comparison python/transform.py @ 173:c1d2b6b9f9a7

Rework into passes
author Windel Bouwman
date Fri, 19 Apr 2013 12:42:21 +0200
parents
children 3eb06f5fb987
comparison
equal deleted inserted replaced
172:5a7d37d615ee 173:c1d2b6b9f9a7
1 from ir import *
2 # Standard passes:
3
4 class FunctionPass:
5 def run(self, ir):
6 """ Main entry point for the pass """
7 for f in ir.Functions:
8 self.onFunction(f)
9 def onFunction(self, f):
10 """ Override this virtual method """
11 raise NotImplementedError()
12
13 class BasicBlockPass(FunctionPass):
14 def onFunction(self, f):
15 for bb in f.BasicBlocks:
16 self.onBasicBlock(bb)
17 def onBasicBlock(self, bb):
18 """ Override this virtual method """
19 raise NotImplementedError()
20
21 class InstructionPass(BasicBlockPass):
22 def onBasicBlock(self, bb):
23 for ins in bb.Instructions:
24 self.onInstruction(ins)
25 def onInstruction(self, ins):
26 """ Override this virtual method """
27 raise NotImplementedError()
28
29 # Usefull transforms:
30 class ConstantFolder(InstructionPass):
31 def onInstruction(self, i):
32 if type(i) is ImmLoad:
33 i.target.constval = i.value
34 print(type(i.value), i.value)
35 elif type(i) is BinaryOperator:
36 a = i.value1
37 b = i.value2
38 if hasattr(a, 'constval') and hasattr(b,'constval'):
39 op = i.operation
40 if op == '+':
41 i2 = ImmLoad(i.result, a.constval + b.constval)
42 print(i2)
43 i.Parent.replaceInstruction(i, i2)
44 elif op == '*':
45 i2 = ImmLoad(i.result, a.constval * b.constval)
46 print(i2)
47 i.Parent.replaceInstruction(i, i2)
48 elif op == '-':
49 i2 = ImmLoad(i.result, a.constval - b.constval)
50 print(i2)
51 i.Parent.replaceInstruction(i, i2)
52
53 class DeadCodeDeleter(InstructionPass):
54 def onInstruction(self, ins):
55 print(ins, ins.Users)
56 if not ins.defs in ins.live_out:
57 ins.Parent.removeInstruction(ins)
58