def main(): # test code from asmyacc import parser flat = [] for line in open('../benchmarks/pi.s', 'r').readlines(): if not line.strip(): continue flat.append(parser.parse(line)) flat = parse_instr.parse(flat) c = CFG(flat) d = Dataflow(c) d.print_sets() #d.get_reach(c.get_block("$L7")) return c
def __init__(self, lines, verbosity = 0): """ Convert expressions to IR. """ self.verbosity = verbosity self.stats = {'cp':0,'cf':0,'dc':0} self.logger = logging.getLogger('Optimiser') self.logger.info('parsing assembly') # Parse assembly and store in flat. self.flat = [] for line in lines: if not line.strip(): # We skip empty lines. We could also tell yacc to put them in a Raw. continue self.flat.append(parser.parse(line)) self.flat = parse_instr.parse(self.flat)
def main(): # test code from asmyacc import parser flat = [] for line in open('../benchmarks/pi.s', 'r').readlines(): if not line.strip(): continue flat.append(parser.parse(line)) flat = parse_instr.parse(flat) c = CFG(flat) d = Dataflow(c) l = Liveness(c) change = True while change: l.analyse() change = l.optimise() for ins in flat: print ins #1d.print_sets() #d.get_reach(c.get_block("$L7")) return c
def __init__(self, lines, verbosity = 0, enabled_optimisations = None): """ Convert expressions to IR. """ self.verbosity = verbosity self.logger = logging.getLogger('Optimiser') if enabled_optimisations == None: self.enabled_optimisations = 'abcdefghijkl' else: self.enabled_optimisations = enabled_optimisations self.stats = {'cp':0, 'cf':0, 'dc':0} self.logger.info('parsing assembly') # Parse assembly and store in flat. self.flat = [] for line in lines: if not line.strip(): # We skip empty lines. We could also tell yacc to put them in a Raw. # TODO: skippet yacc dit niet sowieso? continue self.flat.append(parser.parse(line)) self.flat = parse_instr.parse(self.flat)
def optimise(self): """ Optimise the IR. Procedure: 1. split in frames 2. convert frames to graphs 3. optimise graphs 4. convert graphs to (flat) frames 5. concatenate frames to get optimised program. Store result in flat. """ # top loop flat_orig = None top_loop_counter = 0 while True: if flat_orig == self.flat: self.logger.info('optimisation is stable') break if top_loop_counter == 10000: self.logger.warning('top loop limit reached (10000 iterations)') break flat_orig = self.flat[:] top_loop_counter += 1 self.logger.info('top pass %s' % str(top_loop_counter)) # a. if 'a' in self.enabled_optimisations: self.logger.info('optimising global control flow graph') cfg = CFG(self.flat) #if self.verbosity > 2: # cfg.cfg_to_diagram("allinstr_graph_before.png") optimise_tree.optimise(cfg) #if self.verbosity > 2: # cfg.cfg_to_diagram("allinstr_graph_after.png") self.flat = cfg.cfg_to_flat() # b. jump optimisations if 'b' in self.enabled_optimisations: self.logger.info('optimising flat (jumps and branches)') self.flat = flat_opt.optimise(self.flat) self.flat = parse_instr.parse(self.flat) self.logger.info('splitting flat in frames') frames = split_frames(self.flat) self.logger.info('creating graph for each frame') graphs = [CFG(frame) for frame in frames] self.logger.info('optimising blocks') for graphnr, graph in enumerate(graphs): self.logger.info('graph %d of %d' % (graphnr + 1, len(graphs))) #Dataflow(graph) if 'f' in self.enabled_optimisations: l = Liveness(graph,self.verbosity) self.logger.info('Performing liveness optimalisation on graph') change = True while change: l.analyse() change = l.optimise() for blocknr, block in enumerate(graph.blocks): self.logger.debug('block %d of %d' % (blocknr + 1, len(graph.blocks))) cf_opt = b_opt.ConstantFold(block) cp_opt = b_opt.CopyPropagation(block) dc_opt = b_opt.DeadCode(block) done = False subopt_changes = False i = 0 while (not done): done = True i += 1 self.logger.debug('\t pass '+str(i)) # c. constant folding if 'c' in self.enabled_optimisations: subopt_changes = cf_opt.optimise() if subopt_changes: self.stats['cf'] += cf_opt.stats['cf'] done = done & (not subopt_changes) # d. copy propagation if 'd' in self.enabled_optimisations: subopt_changes = cp_opt.optimise() if subopt_changes:self.stats['cp'] += cp_opt.stats['cp'] done = done & (not subopt_changes) # e. dead code removal if 'e' in self.enabled_optimisations: subopt_changes = dc_opt.optimise() if subopt_changes:self.stats['dc'] += dc_opt.stats['dc'] done = done & (not subopt_changes) self.logger.info('basic-block peephole optimisations done:') self.logger.info('\t constant folds: %d' % (self.stats['cf'])) self.logger.info('\t copy propagations: %d' % (self.stats['cp'])) self.logger.info('\t dead code removes: %d' % (self.stats['dc'])) self.logger.info('joining graphs to frames') frames = [graph.cfg_to_flat() for graph in graphs] self.logger.info('joining frames to flat') self.flat = sum(frames, [])