def test_random():
    for _ in range(20):
        import random

        NVAR = random.randrange(1000)
        heap = TheHeap(NVAR)
        varlist = range(NVAR)
        tar2src = {}
        src2loc = {}
        tar2loc = {}
        for i in varlist:
            tar2src[i] = random.randrange(NVAR)
        srcs = list(dict.fromkeys(tar2src.values()))
        srclocs = srcs[:]
        random.shuffle(srclocs)
        for j, k in zip(srcs, srclocs):
            src2loc[j] = k
        varlist2 = varlist[:]
        random.shuffle(varlist2)
        for i, j in zip(varlist, varlist2):
            tar2loc[i] = j
        for i in range(10):
            random.shuffle(varlist)
            heap1 = TheHeap(NVAR)
            emit_moves(heap1, varlist, tar2src.copy(), tar2loc.copy(), src2loc.copy())
            heap2 = TheHeap(NVAR)
            emit_moves_safe(heap2, varlist, tar2src.copy(), tar2loc.copy(), src2loc.copy())
            for i in range(NVAR):
                assert heap1.data[i] == heap2.data[i]
Exemple #2
0
def test_random():
    for _ in range(20):
        import random
        NVAR = random.randrange(1000)
        heap = TheHeap(NVAR)
        varlist = range(NVAR)
        tar2src = {}
        src2loc = {}
        tar2loc = {}
        for i in varlist:
            tar2src[i] = random.randrange(NVAR)
        srcs = list(dict.fromkeys(tar2src.values()))
        srclocs = srcs[:]
        random.shuffle(srclocs)
        for j, k in zip(srcs, srclocs):
            src2loc[j] = k
        varlist2 = varlist[:]
        random.shuffle(varlist2)
        for i, j in zip(varlist, varlist2):
            tar2loc[i] = j
        for i in range(10):
            random.shuffle(varlist)
            heap1 = TheHeap(NVAR)
            emit_moves(heap1, varlist, tar2src.copy(), tar2loc.copy(),
                       src2loc.copy())
            heap2 = TheHeap(NVAR)
            emit_moves_safe(heap2, varlist, tar2src.copy(), tar2loc.copy(),
                            src2loc.copy())
            for i in range(NVAR):
                assert heap1.data[i] == heap2.data[i]
Exemple #3
0
def prepare_for_jump(insns, sourcevars, src2loc, target, allocator):

    tar2src = {}  # tar var -> src var
    tar2loc = {}

    # construct mapping of targets to sources; note that "target vars"
    # and "target locs" are the same thing right now
    targetlocs = target.arg_locations
    tarvars = []

    ##     if DEBUG_PRINT:
    ##         print targetlocs
    ##         print allocator.var2loc

    for i in range(len(targetlocs)):
        tloc = targetlocs[i]
        src = sourcevars[i]
        if isinstance(src, Var):
            tar2loc[tloc] = tloc
            tar2src[tloc] = src
            tarvars.append(tloc)
        if not tloc.is_register:
            if tloc in allocator.free_stack_slots:
                allocator.free_stack_slots.remove(tloc)

    gen = JumpPatchupGenerator(insns, allocator)
    emit_moves(gen, tarvars, tar2src, tar2loc, src2loc)

    for i in range(len(targetlocs)):
        tloc = targetlocs[i]
        src = sourcevars[i]
        if not isinstance(src, Var):
            insns.append(insn.Load(tloc, src))
Exemple #4
0
def prepare_for_jump(insns, sourcevars, src2loc, target, allocator):

    tar2src = {}     # tar var -> src var
    tar2loc = {}

    # construct mapping of targets to sources; note that "target vars"
    # and "target locs" are the same thing right now
    targetlocs = target.arg_locations
    tarvars = []

##     if DEBUG_PRINT:
##         print targetlocs
##         print allocator.var2loc

    for i in range(len(targetlocs)):
        tloc = targetlocs[i]
        src = sourcevars[i]
        if isinstance(src, Var):
            tar2loc[tloc] = tloc
            tar2src[tloc] = src
            tarvars.append(tloc)
        if not tloc.is_register:
            if tloc in allocator.free_stack_slots:
                allocator.free_stack_slots.remove(tloc)

    gen = JumpPatchupGenerator(insns, allocator)
    emit_moves(gen, tarvars, tar2src, tar2loc, src2loc)

    for i in range(len(targetlocs)):
        tloc = targetlocs[i]
        src = sourcevars[i]
        if not isinstance(src, Var):
            insns.append(insn.Load(tloc, src))
def test_simple_cycle():
    heap = TheHeap(2)
    tar2src = {"A": "b", "B": "a"}
    tar2loc = {"A": 0, "B": 1}
    src2loc = {"a": 0, "b": 1}
    assert heap.data[0] == 0
    assert heap.data[1] == 1
    emit_moves(heap, tar2src.keys(), tar2src, tar2loc, src2loc)
    assert heap.data[0] == 1
    assert heap.data[1] == 0
    assert heap.numlocs == 3  # only creates 1 extra loc
Exemple #6
0
def test_simple_cycle():
    heap = TheHeap(2)
    tar2src = {'A': 'b', 'B': 'a'}
    tar2loc = {'A': 0, 'B': 1}
    src2loc = {'a': 0, 'b': 1}
    assert heap.data[0] == 0
    assert heap.data[1] == 1
    emit_moves(heap, tar2src.keys(), tar2src, tar2loc, src2loc)
    assert heap.data[0] == 1
    assert heap.data[1] == 0
    assert heap.numlocs == 3  # only creates 1 extra loc
def test_one_to_many():
    heap = TheHeap(4)
    tar2src = {"A": "a", "B": "b", "C": "a"}
    tar2loc = {"A": 2, "B": 1, "C": 3}
    src2loc = {"a": 1, "b": 0}
    assert heap.data[0] == 0  # b
    assert heap.data[1] == 1  # a
    assert heap.data[2] == 2
    assert heap.data[3] == 3
    emit_moves(heap, ["B", "A", "C"], tar2src, tar2loc, src2loc)
    assert heap.data[1] == 0  # B
    assert heap.data[2] == 1  # A
    assert heap.data[3] == 1  # C
def test_dag():
    heap = TheHeap(3)
    tar2src = {"A": "a", "B": "b"}
    tar2loc = {"A": 0, "B": 1}
    src2loc = {"a": 1, "b": 2}
    assert heap.data[0] == 0
    assert heap.data[1] == 1
    assert heap.data[2] == 2
    emit_moves(heap, tar2src.keys(), tar2src, tar2loc, src2loc)
    assert heap.data[0] == 1
    assert heap.data[1] == 2
    assert heap.data[2] == 2
    assert heap.numlocs == 3  # only creates 1 extra loc
Exemple #9
0
def test_one_to_many():
    heap = TheHeap(4)
    tar2src = {'A': 'a', 'B': 'b', 'C': 'a'}
    tar2loc = {'A': 2, 'B': 1, 'C': 3}
    src2loc = {'a': 1, 'b': 0}
    assert heap.data[0] == 0  # b
    assert heap.data[1] == 1  # a
    assert heap.data[2] == 2
    assert heap.data[3] == 3
    emit_moves(heap, ['B', 'A', 'C'], tar2src, tar2loc, src2loc)
    assert heap.data[1] == 0  # B
    assert heap.data[2] == 1  # A
    assert heap.data[3] == 1  # C
Exemple #10
0
def test_dag():
    heap = TheHeap(3)
    tar2src = {'A': 'a', 'B': 'b'}
    tar2loc = {'A': 0, 'B': 1}
    src2loc = {'a': 1, 'b': 2}
    assert heap.data[0] == 0
    assert heap.data[1] == 1
    assert heap.data[2] == 2
    emit_moves(heap, tar2src.keys(), tar2src, tar2loc, src2loc)
    assert heap.data[0] == 1
    assert heap.data[1] == 2
    assert heap.data[2] == 2
    assert heap.numlocs == 3  # only creates 1 extra loc