def __parse_literal_expression(string_expr): if tac.is_stackvar(string_expr): return ast.Name body = ast.parse(string_expr).body assert len(body) == 1 expr = body[0] return type(expr.value)
def single_block_update(block, in_cons_map): cons_map = in_cons_map.copy() for i, ins in enumerate(block): if ins.is_assign and len(ins.gens) == len(ins.uses) == 1 and is_stackvar(ins.gens[0]): [lhs], [rhs] = ins.gens, ins.uses if rhs in cons_map: rhs = cons_map[rhs] cons_map[lhs] = rhs else: uses = [(cons_map.get(v, v)) for v in ins.uses] if ins.is_inplace: uses[1] = ins.uses[1] uses = tuple(uses) block[i] = ins._replace(uses=tuple(uses)) for v in chain(ins.gens, ins.kills): if v in cons_map: del cons_map[v] return cons_map
def undef(kills, gens): return tuple(('_' if v in kills and tac.is_stackvar(v) else v) for v in gens)