Commit df7b96c8 authored by Jayke Meijer's avatar Jayke Meijer

Merge branch 'master' of github.com:taddeus/peephole

parents e305a0d2 47e216c2
......@@ -17,6 +17,8 @@ def remove_redundancies(block):
while old_len != len(block):
old_len = len(block)
block.reset()
while not block.end():
s = block.read()
......@@ -30,20 +32,34 @@ def remove_redundancies(block):
def optimize_block(block):
"""Optimize a basic block."""
#changed = True
#while changed:
# changed = False
# if remove_redundancies(block): changed = True
# if eliminate_common_subexpressions(block): changed = True
# if fold_constants(block): changed = True
# if copy_propagation(block): changed = True
# if eliminate_dead_code(block): changed = True
# print 'iteration'
while remove_redundancies(block) \
| eliminate_common_subexpressions(block) \
| fold_constants(block) \
| copy_propagation(block) \
| eliminate_dead_code(block):
#| algebraic_transformations(block) \
#print 'iteration'
pass
from copy import deepcopy
def optimize(statements, verbose=0):
"""Optimization wrapper function, calls global and basic-block level
optimization functions."""
# Optimize on a global level
# TODO: only count instructions (no directives)
statements = deepcopy(statements)
o = len(statements)
remove_redundant_jumps(statements)
g = len(statements)
......@@ -64,18 +80,12 @@ def optimize(statements, verbose=0):
opt_blocks = reduce(lambda a, b: a + b, block_statements)
b = len(opt_blocks)
# - Common subexpression elimination
# - Constant folding
# - Copy propagation
# - Dead-code elimination
# - Temporary variable renaming
# - Interchange of independent statements
# Print results
if verbose:
print 'Original statements: %d' % o
print 'After global optimization: %d' % g
print 'After basic blocks optimization: %d' % b
print 'Optimization: %d (%d%%)' \
print 'Original statements: %d' % o
print 'After global optimization: %d (%d removed)' % (g, o - g)
print 'After basic block optimization: %d (%d removed)' % (b, g - b)
print 'Statements removed: %d (%d%%)' \
% (o - b, int((o - b) / float(b) * 100))
return opt_blocks
......@@ -50,6 +50,8 @@ def eliminate_common_subexpressions(block):
"""
changed = False
block.reset()
while not block.end():
s = block.read()
......@@ -123,6 +125,8 @@ def fold_constants(block):
# Current known values in register
register = {}
block.reset()
while not block.end():
s = block.read()
......@@ -147,10 +151,10 @@ def fold_constants(block):
elif s.name == 'lw' and s[1] in constants:
# Usage of variable with constant value
register[s[0]] = constants[s[1]]
elif s.name == 'mflo':
elif s.name == 'mflo' and '$lo' in register:
# Move of `Lo' register to another register
register[s[0]] = register['$lo']
elif s.name == 'mfhi':
elif s.name == 'mfhi' and '$hi' in register:
# Move of `Hi' register to another register
register[s[0]] = register['$hi']
elif s.name in ['mult', 'div'] \
......@@ -252,6 +256,8 @@ def copy_propagation(block):
moves_to = []
changed = False
block.reset()
while not block.end():
s = block.read()
......@@ -305,6 +311,8 @@ def algebraic_transformations(block):
"""
changed = False
block.reset()
while not block.end():
s = block.read()
......
......@@ -175,7 +175,7 @@ class Statement:
if self.is_branch() or self.is_store() or self.is_compare() \
or self.is_command(*['mult', 'div', 'dsz', 'mtc1']):
if self.name == 'dsz':
m = re.match('^\d+\(([^)]+)\)$', self[0])
m = re.match('^[^(]+\(([^)]+)\)$', self[0])
if m:
use.append(m.group(1))
......@@ -190,7 +190,7 @@ class Statement:
use.append(self[1])
# Case arg1 relative adressing
if self.is_load_non_immediate() or self.is_store():
m = re.match('^\d+\(([^)]+)\)$', self[1])
m = re.match('^[^(]+\(([^)]+)\)$', self[1])
if m:
use.append(m.group(1))
......@@ -290,4 +290,8 @@ class Block:
def reverse_statements(self):
"""Reverse the statement list and reset the pointer."""
self.statements = self.statements[::-1]
self.reset()
def reset(self):
"""Reset the internal pointer."""
self.pointer = 0
......@@ -33,7 +33,7 @@ def write_statements(statements):
else:
line += ' '
line += ','.join(s.args)
line += ','.join(map(str, s))
else:
raise Exception('Unsupported statement type "%s"' % s.stype)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment