__init__.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from src.dataflow import find_basic_blocks, generate_flow_graph
  2. import src.liveness as liveness
  3. import src.reaching_definitions as reaching_definitions
  4. from redundancies import remove_redundant_jumps, move_1, move_2, move_3, \
  5. move_4, load, shift, add
  6. from advanced import eliminate_common_subexpressions, fold_constants, \
  7. copy_propagation, eliminate_dead_code
  8. def remove_redundancies(block):
  9. """Execute all functions that remove redundant statements."""
  10. callbacks = [move_1, move_2, move_3, move_4, load, shift, add]
  11. old_len = -1
  12. changed = False
  13. while old_len != len(block):
  14. old_len = len(block)
  15. block.reset()
  16. while not block.end():
  17. s = block.read()
  18. for callback in callbacks:
  19. if callback(s, block):
  20. changed = True
  21. break
  22. return changed
  23. def optimize_block(block):
  24. """Optimize a basic block."""
  25. #changed = True
  26. #while changed:
  27. # changed = False
  28. # if remove_redundancies(block): changed = True
  29. # if eliminate_common_subexpressions(block): changed = True
  30. # if fold_constants(block): changed = True
  31. # if copy_propagation(block): changed = True
  32. # if eliminate_dead_code(block): changed = True
  33. # print 'iteration'
  34. while remove_redundancies(block) \
  35. | eliminate_common_subexpressions(block) \
  36. | fold_constants(block) \
  37. | copy_propagation(block) \
  38. | eliminate_dead_code(block):
  39. #| algebraic_transformations(block) \
  40. #print 'iteration'
  41. pass
  42. from copy import deepcopy
  43. def optimize(statements, verbose=0):
  44. """Optimization wrapper function, calls global and basic-block level
  45. optimization functions."""
  46. # Optimize on a global level
  47. # TODO: only count instructions (no directives)
  48. statements = deepcopy(statements)
  49. o = len(statements)
  50. remove_redundant_jumps(statements)
  51. g = len(statements)
  52. # Divide into basic blocks
  53. blocks = find_basic_blocks(statements)
  54. # Perform dataflow analysis
  55. generate_flow_graph(blocks)
  56. liveness.create_in_out(blocks)
  57. reaching_definitions.create_in_out(blocks)
  58. # Optimize basic blocks
  59. map(optimize_block, blocks)
  60. # Concatenate optimized blocks to obtain
  61. block_statements = map(lambda b: b.statements, blocks)
  62. opt_blocks = reduce(lambda a, b: a + b, block_statements)
  63. b = len(opt_blocks)
  64. # Print results
  65. if verbose:
  66. print 'Original statements: %d' % o
  67. print 'After global optimization: %d (%d removed)' % (g, o - g)
  68. print 'After basic block optimization: %d (%d removed)' % (b, g - b)
  69. print 'Statements removed: %d (%d%%)' \
  70. % (o - b, int((o - b) / float(b) * 100))
  71. return opt_blocks