| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- from src.dataflow import find_basic_blocks, generate_flow_graph
- import src.liveness as liveness
- import src.reaching_definitions as reaching_definitions
- from redundancies import remove_redundant_jumps, move_1, move_2, move_3, \
- move_4, load, shift, add
- from advanced import eliminate_common_subexpressions, fold_constants, \
- copy_propagation, eliminate_dead_code
- def remove_redundancies(block):
- """Execute all functions that remove redundant statements."""
- callbacks = [move_1, move_2, move_3, move_4, load, shift, add]
- old_len = -1
- changed = False
- while old_len != len(block):
- old_len = len(block)
- block.reset()
- while not block.end():
- s = block.read()
- for callback in callbacks:
- if callback(s, block):
- changed = True
- break
- return changed
- 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)
- # Divide into basic blocks
- blocks = find_basic_blocks(statements)
- # Perform dataflow analysis
- generate_flow_graph(blocks)
- liveness.create_in_out(blocks)
- reaching_definitions.create_in_out(blocks)
- # Optimize basic blocks
- map(optimize_block, blocks)
- # Concatenate optimized blocks to obtain
- block_statements = map(lambda b: b.statements, blocks)
- opt_blocks = reduce(lambda a, b: a + b, block_statements)
- b = len(opt_blocks)
- # Print results
- if verbose:
- 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
|