Ejemplo n.º 1
0
def convert_to_ssa(func):
    # return labeled blocks
    blocks = block_map(form_blocks(func['instrs']))
    # add entry block if required
    add_entry(blocks)
    # add terminators to block if required
    add_terminators(blocks)
    # get the successor of each block
    succ = {name: successors(block[-1]) for name, block in blocks.items()}
    # get the predecessor of each block
    pred = map_inv(succ)
    # get dominator of each block
    dom = get_dom(succ, list(blocks.keys())[0])
    # get dominate frontier of each block
    df = dom_fronts(dom, succ)
    # varaible map to block label
    defs = def_blocks(blocks)
    # get function type
    types = get_types(func)
    # get argument name
    arg_names = {a['name'] for a in func['args']} if 'args' in func else set()
    # find phi nodes
    phis = get_phis(blocks, df, defs)
    # rename variables
    phi_args, phi_dests = ssa_rename(blocks, phis, succ, dom_tree(dom),
                                     arg_names)
    # inserte phi nodes
    insert_phis(blocks, phi_args, phi_dests, types)
    # rebuild the updated blocks
    func['instrs'] = reassemble(blocks)
Ejemplo n.º 2
0
def print_dom(bril, mode):
  for func in bril['functions']:
    # return labeled blocks
    blocks = block_map(form_blocks(func['instrs']))
    #for name, block in blocks.items():
    #  print(str(name)+":"+str(block))
    # add entry block if required
    add_entry(blocks)
    # add terminators to every block if required
    add_terminators(blocks)
    # get the successor of each block 
    succ = {name: successors(block[-1]) for name, block in blocks.items()}

    #for name, block in succ.items():
    #  print(str(name)+": "+str(block))
    dom = get_dom(succ, list(blocks.keys())[0])

    if mode == 'front':
      res = dom_fronts(dom, succ)
    elif mode == 'tree':
      res = dom_tree(dom)
    else:
      res = dom

    # Format as JSON for stable output.
    print(json.dumps(
      {k: sorted(list(v)) for k, v in res.items()},
      indent=2, sort_keys=True,
    ))
Ejemplo n.º 3
0
def func_from_ssa(func):
    blocks = block_map(form_blocks(func['instrs']))
    add_entry(blocks)
    add_terminators(blocks)

    # Replace each phi-node.
    for block in blocks.values():
        # Insert copies for each phi.
        for instr in block:
            if instr.get('op') == 'phi':
                dest = instr['dest']
                type = instr['type']
                for i, label in enumerate(instr['labels']):
                    var = instr['args'][i]

                    # Insert a copy in the predecessor block, before the
                    # terminator.
                    pred = blocks[label]
                    pred.insert(-1, {
                        'op': 'id',
                        'type': type,
                        'args': [var],
                        'dest': dest,
                    })

        # Remove all phis.
        new_block = [i for i in block if i.get('op') != 'phi']
        block[:] = new_block

    func['instrs'] = reassemble(blocks)
Ejemplo n.º 4
0
def to_ssa(json_input):
    inp = json.loads(json_input)
    for func in inp['functions']:
        blocks = block_map(form_blocks(func['instrs']))
        add_entry(blocks)
        add_terminators(blocks)
        blocks = insert_phi(blocks)
        blocks = rename_vars(blocks)
        func['instrs'] = reassemble(blocks)
    return json.dumps(inp)
Ejemplo n.º 5
0
def func_to_ssa(func):
    blocks = block_map(form_blocks(func['instrs']))
    add_entry(blocks)
    add_terminators(blocks)
    succ = {name: successors(block[-1]) for name, block in blocks.items()}
    dom = get_dom(succ, list(blocks.keys())[0])

    df = dom_fronts(dom, succ)
    defs = def_blocks(blocks)
    types = get_types(func)
    arg_names = {a['name'] for a in func['args']} if 'args' in func else set()

    phis = get_phis(blocks, df, defs)
    phi_args, phi_dests = ssa_rename(blocks, phis, succ, dom_tree(dom),
                                     arg_names)
    insert_phis(blocks, phi_args, phi_dests, types)

    func['instrs'] = reassemble(blocks)
Ejemplo n.º 6
0
def print_dom(bril, mode):
    for func in bril['functions']:
        blocks = block_map(form_blocks(func['instrs']))
        add_entry(blocks)
        add_terminators(blocks)
        succ = {name: successors(block[-1]) for name, block in blocks.items()}
        dom = get_dom(succ, list(blocks.keys())[0])

        if mode == 'front':
            res = dom_fronts(dom, succ)
        elif mode == 'tree':
            res = dom_tree(dom)
        else:
            res = dom

        # Format as JSON for stable output.
        print(json.dumps(
            {k: sorted(list(v)) for k, v in res.items()},
            indent=2, sort_keys=True,
        ))