def split_variables(graph, lvars, DU, UD): treated = defaultdict(list) variables = defaultdict(list) for var, loc in sorted(DU): if var not in lvars: continue if loc in treated[var]: continue defs = [loc] uses = set(DU[(var, loc)]) change = True while change: change = False for use in uses: ldefs = UD[(var, use)] for ldef in ldefs: if ldef not in defs: defs.append(ldef) change = True for ldef in defs[1:]: luses = set(DU[(var, ldef)]) for use in luses: if use not in uses: uses.add(use) change = True treated[var].extend(defs) variables[var].append((defs, list(uses))) if lvars: nb_vars = max(lvars) + 1 else: nb_vars = 0 for var, versions in variables.iteritems(): nversions = len(versions) if nversions == 1: continue orig_var = lvars.pop(var) for i, (defs, uses) in enumerate(versions): if -1 in defs: # Param new_version = Param(var, orig_var.type) lvars[var] = new_version else: new_version = Variable(nb_vars) new_version.type = orig_var.type lvars[nb_vars] = new_version # add new version to variables nb_vars += 1 new_version.name = '%d_%d' % (var, i) for loc in defs: if loc == -1: continue ins = graph.get_ins_from_loc(loc) ins.replace_lhs(new_version) for loc in uses: ins = graph.get_ins_from_loc(loc) ins.replace_var(var, new_version)
def split_variables(graph, lvars, DU, UD): variables = group_variables(lvars, DU, UD) if lvars: nb_vars = max(lvars) + 1 else: nb_vars = 0 for var, versions in variables.items(): nversions = len(versions) if nversions == 1: continue orig_var = lvars.pop(var) for i, (defs, uses) in enumerate(versions): if min(defs) < 0: # Param if orig_var.this: new_version = ThisParam(var, orig_var.type) else: new_version = Param(var, orig_var.type) lvars[var] = new_version else: new_version = Variable(nb_vars) new_version.type = orig_var.type lvars[nb_vars] = new_version # add new version to variables nb_vars += 1 new_version.name = '%d_%d' % (var, i) for loc in defs: if loc < 0: continue ins = graph.get_ins_from_loc(loc) curlhs = ins.var_map[ins.get_lhs()] if isinstance(curlhs, Variable): lhsType = ins.var_map[ins.get_lhs()].get_type_with_ins(ins) else: lhsType = orig_var.type new_version.type = lhsType ins.replace_lhs(new_version) DU[(new_version.value(), loc)] = DU.pop((var, loc)) for loc in uses: ins = graph.get_ins_from_loc(loc) ins.replace_var(var, new_version) UD[(new_version.value(), loc)] = UD.pop((var, loc))
def new(self): self.num += 1 self.ret = Variable('tmp%d' % self.num) return self.ret