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]
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
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
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