Skip to content
Snippets Groups Projects
Commit 770cbc9f authored by Taddeus Kroes's avatar Taddeus Kroes
Browse files

Merged conflicts.

parents fd60f13d 98c43ff0
No related branches found
No related tags found
No related merge requests found
...@@ -29,7 +29,8 @@ def create_use_def(block): ...@@ -29,7 +29,8 @@ def create_use_def(block):
defined = set() defined = set()
if block.dummy: if block.dummy:
block.use_set = set(['$4', '$5', '$6', '$7']) block.use_set = set(['$4', '$5', '$6', '$7', \
'$f0', '$f3', '$f4', '$f12', '$2'])
block.def_set = set(['$2', '$3']) block.def_set = set(['$2', '$3'])
return return
......
...@@ -15,11 +15,14 @@ def optimize(program, verbose=0): ...@@ -15,11 +15,14 @@ def optimize(program, verbose=0):
iterations = 0 iterations = 0
while changed: while changed:
<<<<<<< HEAD
iterations += 1 iterations += 1
if verbose > 1: if verbose > 1:
print 'main iteration %d', iterations print 'main iteration %d', iterations
=======
>>>>>>> 98c43ff02c474a62e42ac89ba9fe20be98f9eccd
changed = False changed = False
# Optimize on a global level # Optimize on a global level
......
...@@ -95,7 +95,6 @@ def eliminate_common_subexpressions(block): ...@@ -95,7 +95,6 @@ def eliminate_common_subexpressions(block):
% (s.name, ', '.join(map(str, s))) % (s.name, ', '.join(map(str, s)))
block.insert(S('command', s.name, *([new_reg] + args)), \ block.insert(S('command', s.name, *([new_reg] + args)), \
index=occurrences[0], message=message) index=occurrences[0], message=message)
changed = True changed = True
# Reset pointer to continue from the original statement # Reset pointer to continue from the original statement
...@@ -267,6 +266,7 @@ def fold_constants(block): ...@@ -267,6 +266,7 @@ def fold_constants(block):
else 'Substraction', s[1]) else 'Substraction', s[1])
block.replace(1, [S('command', 'move', rd, s[1])], \ block.replace(1, [S('command', 'move', rd, s[1])], \
message=message) message=message)
changed = True
else: else:
for reg in s.get_def(): for reg in s.get_def():
if reg in register: if reg in register:
......
...@@ -5,21 +5,16 @@ def remove_redundancies(block): ...@@ -5,21 +5,16 @@ def remove_redundancies(block):
"""Execute all functions that remove redundant statements.""" """Execute all functions that remove redundant statements."""
callbacks = [move_aa, move_inst, instr_move_jal, move_move, sw_ld, shift, callbacks = [move_aa, move_inst, instr_move_jal, move_move, sw_ld, shift,
add_lw] add_lw]
old_len = -1
changed = False changed = False
while old_len != len(block): block.reset()
old_len = len(block)
block.reset() while not block.end():
s = block.read()
while not block.end(): for callback in callbacks:
s = block.read() if callback(s, block):
changed = True
for callback in callbacks:
if callback(s, block):
changed = True
break
return changed return changed
......
...@@ -68,6 +68,7 @@ class Program(Block): ...@@ -68,6 +68,7 @@ class Program(Block):
return remove_redundant_jumps(self) \ return remove_redundant_jumps(self) \
| remove_redundant_branch_jumps(self) | remove_redundant_branch_jumps(self)
return False
def optimize_blocks(self): def optimize_blocks(self):
"""Optimize on block level. Keep executing all optimizations until no """Optimize on block level. Keep executing all optimizations until no
...@@ -80,7 +81,7 @@ class Program(Block): ...@@ -80,7 +81,7 @@ class Program(Block):
| fold_constants(block) \ | fold_constants(block) \
| copy_propagation(block) \ | copy_propagation(block) \
| eliminate_dead_code(block): | eliminate_dead_code(block):
changed = True changed = True
return changed return changed
......
...@@ -41,12 +41,12 @@ class TestLiveness(unittest.TestCase): ...@@ -41,12 +41,12 @@ class TestLiveness(unittest.TestCase):
s33 = S('command', 'mult', 'b', 'd') s33 = S('command', 'mult', 'b', 'd')
s34 = S('command', 'mflo', 'temp') s34 = S('command', 'mflo', 'temp')
s35 = S('command', 'addu', 'return', 'temp', 'c') 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]) s31, s32, s33, s34, s35])
generate_flow_graph([b1, b2, b3]) generate_flow_graph([b1, b2, b3, b4])
create_in_out([b1, b2, b3]) create_in_out([b1, b2, b3, b4])
self.assertEqual(b1.use_set, set()) self.assertEqual(b1.use_set, set())
self.assertEqual(b1.def_set, set(['a', 'b', 'd', 'x'])) self.assertEqual(b1.def_set, set(['a', 'b', 'd', 'x']))
...@@ -57,51 +57,46 @@ class TestLiveness(unittest.TestCase): ...@@ -57,51 +57,46 @@ class TestLiveness(unittest.TestCase):
self.assertEqual(b3.use_set, set(['b', 'd'])) self.assertEqual(b3.use_set, set(['b', 'd']))
self.assertEqual(b3.def_set, set(['c', 'temp', 'return'])) self.assertEqual(b3.def_set, set(['c', 'temp', 'return']))
self.assertEqual(b1.live_in, set()) self.assertEqual(b1.live_in, set(['$4', '$5', '$6', '$7']))
self.assertEqual(b1.live_out, set(['a', 'b', 'd'])) self.assertEqual(b1.live_out, set(['a', 'b', 'd', '$4', '$5', '$6', '$7']))
self.assertEqual(b2.live_in, set(['a', 'b'])) self.assertEqual(b2.live_in, set(['a', 'b', '$4', '$5', '$6', '$7']))
self.assertEqual(b2.live_out, set(['b', 'd'])) self.assertEqual(b2.live_out, set(['b', 'd', '$4', '$5', '$6', '$7']))
self.assertEqual(b3.live_in, set(['b', 'd'])) self.assertEqual(b3.live_in, set(['b', 'd', '$4', '$5', '$6', '$7']))
self.assertEqual(b3.live_out, set()) self.assertEqual(b3.live_out, set(['$4', '$5', '$6', '$7']))
# def test_create_in_out_two(self): # def test_create_in_out_two(self):
# s11 = S('command', 'subu', 'i', 'm', '0x00000001') # s11 = S('command', 'subu', 'i', 'm', '0x00000001')
# s12 = S('command', 'move', 'j', 'n') # s12 = S('command', 'move', 'j', 'n')
# s13 = S('command', 'move', 'a', 'u1') # s13 = S('command', 'move', 'a', 'u1')
# s14 = S('command', 'subu', 'i', 'm', '0x00000001') # s14 = S('command', 'subu', 'i', 'm', '0x00000005')
# s15 = S('command', 'j', 'L1') # s15 = S('command', 'j', 'L1')
# s16 = S('')
# #
# s21 = S('label', 'L1') # s21 = S('label', 'L1')
# s22 = S('command', 'addi', 'i', '0x00000001') # s22 = S('command', 'addi', 'i', '0x00000001')
# s23 = S('command', 'subi', 'j', '0x00000001') # s23 = S('command', 'subi', 'j', '0x00000002')
# s24 = S('command', 'j', 'L2') # s24 = S('command', 'bne', 'i', 'j', 'L2')
# #
# s31 = S('label', 'L2') # s31 = S('command', 'move', 'a', 'u2')
# s32 = S('command', 'move', 'a', 'u2') # s32 = S('command', 'j', 'L1')
# s33 = S('command', 'j', 'L1')
# s41 = S('label', 'L3') # s41 = S('label', 'L2')
# s42 = S('command', 'move', 'i', 'u3') # s42 = S('command', 'move', 'i', 'u3')
# s43 = S('command', 'beq', 'g', 'd', 'L4') # s43 = S('command', 'beq', 'i', 'j', 'L3')
# #
# s51 = S('label', 'L4') # s51 = S('label', 'L3')
# s52 = S('command', 'addu', 'b', 'i', 'a') # s52 = S('command', 'addu', 'b', 'i', 'a')
# #
# b1, b2, b3, b4 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22,\ # blocks = find_basic_blocks([s11, s12, s13, s14, s15,
# s31, s32, s33, s41, s42, s43, s51]) # s21, s22, s23, s24, s31, s32, s41, s42, s43, s51, s52])
#
# generate_flow_graph([b1, b2, b3, b4, b5]) # generate_flow_graph(blocks)
# create_in_out([b1, b2, b3, b4, b5]) # create_in_out(blocks)
#
# #
# for i, block in enumerate(blocks):
#self.assertEqual(b1.) # print 'block ', i,':\n\t in:', block.live_in
# print '\t out:', block.live_out
#
# #print blocks[-1].live_in
...@@ -109,3 +104,4 @@ class TestLiveness(unittest.TestCase): ...@@ -109,3 +104,4 @@ class TestLiveness(unittest.TestCase):
...@@ -55,11 +55,11 @@ class TestReachingDefinitions(unittest.TestCase): ...@@ -55,11 +55,11 @@ class TestReachingDefinitions(unittest.TestCase):
s34 = S('command', 'mflo', 'temp') s34 = S('command', 'mflo', 'temp')
s35 = S('command', 'addu', 'return', 'temp', 'c') 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]) s31, s32, s33, s34, s35])
generate_flow_graph([b1, b2, b3]) generate_flow_graph([b1, b2, b3, b4])
create_in_out([b1, b2, b3]) create_in_out([b1, b2, b3, b4])
self.assertEqual(b1.gen_set, set([s11.sid, s12.sid, s13.sid, self.assertEqual(b1.gen_set, set([s11.sid, s12.sid, s13.sid,
s14.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