Commit fd60f13d authored by Taddeus Kroes's avatar Taddeus Kroes

Fixed infinite loop in optimization phase.

parent e0b4e598
...@@ -13,7 +13,7 @@ if __name__ == '__main__': ...@@ -13,7 +13,7 @@ if __name__ == '__main__':
# Parse file # Parse file
program = parse_file(argv[1]) program = parse_file(argv[1])
program.debug = True program.verbose = 1
if len(argv) > 3: if len(argv) > 3:
# Save input assembly in new file for easy comparison # Save input assembly in new file for easy comparison
......
...@@ -12,13 +12,21 @@ def optimize(program, verbose=0): ...@@ -12,13 +12,21 @@ def optimize(program, verbose=0):
o = program.count_instructions() o = program.count_instructions()
changed = True changed = True
iterations = 0
while changed: while changed:
print 'main iteration' iterations += 1
if verbose > 1:
print 'main iteration %d', iterations
changed = False changed = False
# Optimize on a global level # Optimize on a global level
if program.optimize_global(): if program.optimize_global():
if verbose > 1:
print 'changed on global level'
changed = True changed = True
# Perform dataflow analysis on new blocks # Perform dataflow analysis on new blocks
...@@ -26,6 +34,9 @@ def optimize(program, verbose=0): ...@@ -26,6 +34,9 @@ def optimize(program, verbose=0):
# Optimize basic blocks # Optimize basic blocks
if program.optimize_blocks(): if program.optimize_blocks():
if verbose > 1:
print 'changed on block level'
changed = True changed = True
# Count number of instructions after optimization # Count number of instructions after optimization
......
...@@ -274,7 +274,7 @@ def fold_constants(block): ...@@ -274,7 +274,7 @@ def fold_constants(block):
del register[reg] del register[reg]
known.append((reg, 'unknown')) known.append((reg, 'unknown'))
if block.debug and len(known): if block.verbose and len(known):
s.set_inline_comment(','.join([' %s = %s' % k for k in known])) s.set_inline_comment(','.join([' %s = %s' % k for k in known]))
return changed return changed
...@@ -401,7 +401,7 @@ def eliminate_dead_code(block): ...@@ -401,7 +401,7 @@ def eliminate_dead_code(block):
for reg in s.get_def(): for reg in s.get_def():
if is_reg_dead_after(reg, block, n): if is_reg_dead_after(reg, block, n):
# Statement is redefined later, so this statement is useless # Statement is redefined later, so this statement is useless
if block.debug: if block.verbose:
s.stype = 'comment' s.stype = 'comment'
s.options['block'] = False s.options['block'] = False
s.set_inline_comment(' dead register %s' % reg) s.set_inline_comment(' dead register %s' % reg)
...@@ -411,7 +411,7 @@ def eliminate_dead_code(block): ...@@ -411,7 +411,7 @@ def eliminate_dead_code(block):
changed = True changed = True
if not block.debug: if not block.verbose:
block.apply_filter(lambda s: not hasattr(s, 'remove')) block.apply_filter(lambda s: not hasattr(s, 'remove'))
return changed return changed
...@@ -128,6 +128,7 @@ def remove_redundant_jumps(statements): ...@@ -128,6 +128,7 @@ def remove_redundant_jumps(statements):
changed = False changed = False
statements.reset() statements.reset()
while not statements.end(): while not statements.end():
s = statements.read() s = statements.read()
...@@ -140,13 +141,14 @@ def remove_redundant_jumps(statements): ...@@ -140,13 +141,14 @@ def remove_redundant_jumps(statements):
statements.replace(1, []) statements.replace(1, [])
changed = True changed = True
return True return changed
def remove_redundant_branch_jumps(statements): def remove_redundant_branch_jumps(statements):
"""Optimize statement sequences on a global level.""" """Optimize statement sequences on a global level."""
changed = False changed = False
statements.reset() statements.reset()
while not statements.end(): while not statements.end():
s = statements.read() s = statements.read()
......
...@@ -21,8 +21,8 @@ class Program(Block): ...@@ -21,8 +21,8 @@ class Program(Block):
if hasattr(self, 'statements'): if hasattr(self, 'statements'):
return self.statements return self.statements
# Only add block start and end comments when in debug mode # Only add block start and end comments when in verbose mode
if add_block_comments and self.debug: if add_block_comments and self.verbose:
get_id = lambda b: b.bid get_id = lambda b: b.bid
statements = [] statements = []
...@@ -75,7 +75,6 @@ class Program(Block): ...@@ -75,7 +75,6 @@ class Program(Block):
changed = False changed = False
for block in self.blocks: for block in self.blocks:
print 'block iteration'
if remove_redundancies(block) \ if remove_redundancies(block) \
| eliminate_common_subexpressions(block) \ | eliminate_common_subexpressions(block) \
| fold_constants(block) \ | fold_constants(block) \
...@@ -90,7 +89,7 @@ class Program(Block): ...@@ -90,7 +89,7 @@ class Program(Block):
self.blocks = find_basic_blocks(self.statements) self.blocks = find_basic_blocks(self.statements)
for b in self.blocks: for b in self.blocks:
b.debug = self.debug b.verbose = self.verbose
# Remove the old statement list, since it will probably change # Remove the old statement list, since it will probably change
del self.statements del self.statements
......
...@@ -231,7 +231,7 @@ class Statement: ...@@ -231,7 +231,7 @@ class Statement:
class Block: class Block:
bid = 1 bid = 1
def __init__(self, statements=[], debug=False): def __init__(self, statements=[], verbose=False):
self.statements = statements self.statements = statements
self.pointer = 0 self.pointer = 0
...@@ -239,7 +239,7 @@ class Block: ...@@ -239,7 +239,7 @@ class Block:
self.bid = Block.bid self.bid = Block.bid
Block.bid += 1 Block.bid += 1
self.debug = debug self.verbose = verbose
def __str__(self): def __str__(self):
return '<Block bid=%d statements=%d>' % (self.bid, len(self)) return '<Block bid=%d statements=%d>' % (self.bid, len(self))
...@@ -288,7 +288,7 @@ class Block: ...@@ -288,7 +288,7 @@ class Block:
start = self.pointer - 1 start = self.pointer - 1
# Add a message in inline comments # Add a message in inline comments
if self.debug: if self.verbose:
if len(message): if len(message):
message = ' ' + message message = ' ' + message
...@@ -313,7 +313,7 @@ class Block: ...@@ -313,7 +313,7 @@ class Block:
if index == None: if index == None:
index = self.pointer index = self.pointer
if self.debug and len(message): if self.verbose and len(message):
statement.set_inline_comment(' ' + message) statement.set_inline_comment(' ' + message)
self.statements.insert(index, statement) self.statements.insert(index, statement)
......
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