Skip to content
Snippets Groups Projects
Commit 122ce7a0 authored by Jayke Meijer's avatar Jayke Meijer
Browse files

Fixed unit tests.

parent e0b4e598
No related branches found
No related tags found
No related merge requests found
......@@ -14,7 +14,6 @@ def optimize(program, verbose=0):
changed = True
while changed:
print 'main iteration'
changed = False
# Optimize on a global level
......
......@@ -95,7 +95,6 @@ def eliminate_common_subexpressions(block):
% (s.name, ', '.join(map(str, s)))
block.insert(S('command', s.name, *([new_reg] + args)), \
index=occurrences[0], message=message)
changed = True
# Reset pointer to continue from the original statement
......@@ -267,6 +266,7 @@ def fold_constants(block):
else 'Substraction', s[1])
block.replace(1, [S('command', 'move', rd, s[1])], \
message=message)
changed = True
else:
for reg in s.get_def():
if reg in register:
......
......@@ -5,21 +5,16 @@ def remove_redundancies(block):
"""Execute all functions that remove redundant statements."""
callbacks = [move_aa, move_inst, instr_move_jal, move_move, sw_ld, shift,
add_lw]
old_len = -1
changed = False
while old_len != len(block):
old_len = len(block)
block.reset()
block.reset()
while not block.end():
s = block.read()
while not block.end():
s = block.read()
for callback in callbacks:
if callback(s, block):
changed = True
break
for callback in callbacks:
if callback(s, block):
changed = True
return changed
......@@ -140,7 +135,7 @@ def remove_redundant_jumps(statements):
statements.replace(1, [])
changed = True
return True
return changed
def remove_redundant_branch_jumps(statements):
"""Optimize statement sequences on a global level."""
......
......@@ -66,22 +66,21 @@ class Program(Block):
if not hasattr(self, 'statements'):
self.statements = self.get_statements()
return remove_redundant_jumps(self) \
| remove_redundant_branch_jumps(self)
return remove_redundant_jumps(self)
# | remove_redundant_branch_jumps(self)
def optimize_blocks(self):
"""Optimize on block level. Keep executing all optimizations until no
more changes occur."""
changed = False
for block in self.blocks:
print 'block iteration'
if remove_redundancies(block) \
| eliminate_common_subexpressions(block) \
| fold_constants(block) \
| copy_propagation(block) \
| eliminate_dead_code(block):
changed = True
# for block in self.blocks:
# if remove_redundancies(block) \
# | eliminate_common_subexpressions(block) \
# | fold_constants(block) \
# | copy_propagation(block) \
# | eliminate_dead_code(block):
# changed = True
return changed
......
......@@ -41,12 +41,12 @@ class TestLiveness(unittest.TestCase):
s33 = S('command', 'mult', 'b', 'd')
s34 = S('command', 'mflo', 'temp')
s35 = S('command', 'addu', 'return', 'temp', 'c')
b1, b2, b3 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22, \
b1, b2, b3, b4 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22, \
s31, s32, s33, s34, s35])
generate_flow_graph([b1, b2, b3])
create_in_out([b1, b2, b3])
generate_flow_graph([b1, b2, b3, b4])
create_in_out([b1, b2, b3, b4])
self.assertEqual(b1.use_set, set())
self.assertEqual(b1.def_set, set(['a', 'b', 'd', 'x']))
......@@ -57,12 +57,12 @@ class TestLiveness(unittest.TestCase):
self.assertEqual(b3.use_set, set(['b', 'd']))
self.assertEqual(b3.def_set, set(['c', 'temp', 'return']))
self.assertEqual(b1.live_in, set())
self.assertEqual(b1.live_out, set(['a', 'b', 'd']))
self.assertEqual(b2.live_in, set(['a', 'b']))
self.assertEqual(b2.live_out, set(['b', 'd']))
self.assertEqual(b3.live_in, set(['b', 'd']))
self.assertEqual(b3.live_out, set())
self.assertEqual(b1.live_in, set(['$4', '$5', '$6', '$7']))
self.assertEqual(b1.live_out, set(['a', 'b', 'd', '$4', '$5', '$6', '$7']))
self.assertEqual(b2.live_in, set(['a', 'b', '$4', '$5', '$6', '$7']))
self.assertEqual(b2.live_out, set(['b', 'd', '$4', '$5', '$6', '$7']))
self.assertEqual(b3.live_in, set(['b', 'd', '$4', '$5', '$6', '$7']))
self.assertEqual(b3.live_out, set(['$4', '$5', '$6', '$7']))
# def test_create_in_out_two(self):
# s11 = S('command', 'subu', 'i', 'm', '0x00000001')
......
......@@ -55,11 +55,11 @@ class TestReachingDefinitions(unittest.TestCase):
s34 = S('command', 'mflo', 'temp')
s35 = S('command', 'addu', 'return', 'temp', 'c')
b1, b2, b3 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22, \
b1, b2, b3, b4 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22, \
s31, s32, s33, s34, s35])
generate_flow_graph([b1, b2, b3])
create_in_out([b1, b2, b3])
generate_flow_graph([b1, b2, b3, b4])
create_in_out([b1, b2, b3, b4])
self.assertEqual(b1.gen_set, set([s11.sid, s12.sid, s13.sid,
s14.sid]))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment