diff python/transform.py @ 173:c1d2b6b9f9a7

Rework into passes
author Windel Bouwman
date Fri, 19 Apr 2013 12:42:21 +0200
parents
children 3eb06f5fb987
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python/transform.py	Fri Apr 19 12:42:21 2013 +0200
@@ -0,0 +1,58 @@
+from ir import * 
+# Standard passes:
+
+class FunctionPass:
+   def run(self, ir):
+      """ Main entry point for the pass """
+      for f in ir.Functions:
+         self.onFunction(f)
+   def onFunction(self, f):
+      """ Override this virtual method """
+      raise NotImplementedError()
+
+class BasicBlockPass(FunctionPass):
+   def onFunction(self, f):
+      for bb in f.BasicBlocks:
+         self.onBasicBlock(bb)
+   def onBasicBlock(self, bb):
+      """ Override this virtual method """
+      raise NotImplementedError()
+      
+class InstructionPass(BasicBlockPass):
+   def onBasicBlock(self, bb):
+      for ins in bb.Instructions:
+         self.onInstruction(ins)
+   def onInstruction(self, ins):
+      """ Override this virtual method """
+      raise NotImplementedError()
+
+# Usefull transforms:
+class ConstantFolder(InstructionPass):
+   def onInstruction(self, i):
+      if type(i) is ImmLoad:
+         i.target.constval = i.value
+         print(type(i.value), i.value)
+      elif type(i) is BinaryOperator:
+         a = i.value1
+         b = i.value2
+         if hasattr(a, 'constval') and hasattr(b,'constval'):
+            op = i.operation
+            if op == '+':
+               i2 = ImmLoad(i.result, a.constval + b.constval)
+               print(i2)
+               i.Parent.replaceInstruction(i, i2)
+            elif op == '*':
+               i2 = ImmLoad(i.result, a.constval * b.constval)
+               print(i2)
+               i.Parent.replaceInstruction(i, i2)
+            elif op == '-':
+               i2 = ImmLoad(i.result, a.constval - b.constval)
+               print(i2)
+               i.Parent.replaceInstruction(i, i2)
+
+class DeadCodeDeleter(InstructionPass):
+   def onInstruction(self, ins):
+      print(ins, ins.Users)
+      if not ins.defs in ins.live_out:
+         ins.Parent.removeInstruction(ins)
+