Exemple #1
0
 def test_rewrite_assembler_initialization_store_2(self):
     S = lltype.GcStruct('S', ('parent', OBJECT),
                         ('x', lltype.Signed))
     s_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
     wbdescr = self.gc_ll_descr.write_barrier_descr
     xdescr = get_field_descr(self.gc_ll_descr, S, 'x')
     ops = parse("""
     [p1]
     p0 = new_with_vtable(ConstClass(s_vtable))
     p3 = new_with_vtable(ConstClass(s_vtable))
     setfield_gc(p0, p1, descr=xdescr)
     jump()
     """, namespace=locals())
     expected = parse("""
     [p1]
     p0 = new_with_vtable(ConstClass(s_vtable))
     p3 = new_with_vtable(ConstClass(s_vtable))
     cond_call_gc_wb(p0, p1, descr=wbdescr)
     setfield_raw(p0, p1, descr=xdescr)
     jump()
     """, namespace=locals())
     operations = get_deep_immutable_oplist(ops.operations)
     operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
                                                     operations, [])
     equaloplists(operations, expected.operations)
Exemple #2
0
 def test_floats(self):
     inp = '''
     [f0]
     f1 = float_add(3.5, f0)
     '''
     _, loop, oloop = self.reparse(inp)
     equaloplists(loop.operations, oloop.operations)
Exemple #3
0
 def test_floats(self):
     inp = '''
     [f0]
     f1 = float_add(3.5, f0)
     '''
     _, loop, oloop = self.reparse(inp)
     equaloplists(loop.operations, oloop.operations)
Exemple #4
0
 def check_rewrite(self, frm_operations, to_operations, **namespace):
     S = lltype.GcStruct('S', ('x', lltype.Signed), ('y', lltype.Signed))
     sdescr = get_size_descr(self.gc_ll_descr, S)
     sdescr.tid = 1234
     #
     T = lltype.GcStruct('T', ('y', lltype.Signed), ('z', lltype.Ptr(S)),
                         ('t', lltype.Signed))
     tdescr = get_size_descr(self.gc_ll_descr, T)
     tdescr.tid = 5678
     tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
     #
     A = lltype.GcArray(lltype.Signed)
     adescr = get_array_descr(self.gc_ll_descr, A)
     adescr.tid = 4321
     alendescr = adescr.lendescr
     #
     B = lltype.GcArray(lltype.Char)
     bdescr = get_array_descr(self.gc_ll_descr, B)
     bdescr.tid = 8765
     blendescr = bdescr.lendescr
     #
     C = lltype.GcArray(lltype.Ptr(S))
     cdescr = get_array_descr(self.gc_ll_descr, C)
     cdescr.tid = 8111
     clendescr = cdescr.lendescr
     #
     E = lltype.GcStruct('Empty')
     edescr = get_size_descr(self.gc_ll_descr, E)
     edescr.tid = 9000
     #
     vtable_descr = self.gc_ll_descr.fielddescr_vtable
     O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
                         ('x', lltype.Signed))
     o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     register_known_gctype(self.cpu, o_vtable, O)
     #
     tiddescr = self.gc_ll_descr.fielddescr_tid
     wbdescr = self.gc_ll_descr.write_barrier_descr
     WORD = globals()['WORD']
     #
     strdescr = self.gc_ll_descr.str_descr
     unicodedescr = self.gc_ll_descr.unicode_descr
     strlendescr = strdescr.lendescr
     unicodelendescr = unicodedescr.lendescr
     #
     namespace.update(locals())
     #
     for funcname in self.gc_ll_descr._generated_functions:
         namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname)
         namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
                                                  '%s_descr' % funcname)
     #
     ops = parse(frm_operations, namespace=namespace)
     expected = parse(to_operations % Evaluator(namespace),
                      namespace=namespace)
     operations = self.gc_ll_descr.rewrite_assembler(
         self.cpu, ops.operations, [])
     equaloplists(operations, expected.operations)
Exemple #5
0
 def reparse(self, inp, namespace=None, check_equal=True):
     """ parse loop once, then log it and parse again.
     Checks that we get the same thing.
     """
     if namespace is None:
         namespace = {}
     loop = pure_parse(inp, namespace=namespace)
     logger = Logger(self.make_metainterp_sd())
     output = logger.log_loop(loop, namespace)
     oloop = pure_parse(output, namespace=namespace)
     if check_equal:
         equaloplists(loop.operations, oloop.operations)
         assert oloop.inputargs == loop.inputargs
     return logger, loop, oloop
Exemple #6
0
 def reparse(self, inp, namespace=None, check_equal=True):
     """ parse loop once, then log it and parse again.
     Checks that we get the same thing.
     """
     if namespace is None:
         namespace = {}
     loop = pure_parse(inp, namespace=namespace)
     logger = Logger(self.make_metainterp_sd())
     output = logger.log_loop(loop, namespace)
     oloop = pure_parse(output, namespace=namespace)
     if check_equal:
         equaloplists(loop.operations, oloop.operations)
         assert oloop.inputargs == loop.inputargs
     return logger, loop, oloop
Exemple #7
0
 def assert_equal(self, optimized, expected, text_right=None):
     from pypy.jit.metainterp.optimizeopt.util import equaloplists
     assert len(optimized.inputargs) == len(expected.inputargs)
     remap = {}
     for box1, box2 in zip(optimized.inputargs, expected.inputargs):
         assert box1.__class__ == box2.__class__
         remap[box2] = box1
     assert equaloplists(optimized.operations,
                         expected.operations, False, remap, text_right)
Exemple #8
0
 def assert_equal(self, optimized, expected, text_right=None):
     from pypy.jit.metainterp.optimizeopt.util import equaloplists
     assert len(optimized.inputargs) == len(expected.inputargs)
     remap = {}
     for box1, box2 in zip(optimized.inputargs, expected.inputargs):
         assert box1.__class__ == box2.__class__
         remap[box2] = box1
     assert equaloplists(optimized.operations,
                         expected.operations, False, remap, text_right)
Exemple #9
0
 def test_rewrite_assembler_initialization_store_3(self):
     A = lltype.GcArray(lltype.Ptr(lltype.GcStruct('S')))
     arraydescr = get_array_descr(self.gc_ll_descr, A)
     ops = parse("""
     [p1]
     p0 = new_array(3, descr=arraydescr)
     setarrayitem_gc(p0, 0, p1, descr=arraydescr)
     jump()
     """, namespace=locals())
     expected = parse("""
     [p1]
     p0 = new_array(3, descr=arraydescr)
     setarrayitem_gc(p0, 0, p1, descr=arraydescr)
     jump()
     """, namespace=locals())
     operations = get_deep_immutable_oplist(ops.operations)
     operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
                                                     operations, [])
     equaloplists(operations, expected.operations)
Exemple #10
0
def test_equaloplists():
    ops = """
    [i0]
    i1 = int_add(i0, 1)
    i2 = int_add(i1, 1)
    guard_true(i1) [i2]
    jump(i1)
    """
    namespace = {}
    loop1 = pure_parse(ops, namespace=namespace)
    loop2 = pure_parse(ops, namespace=namespace)
    loop3 = pure_parse(ops.replace("i2 = int_add", "i2 = int_sub"), namespace=namespace)
    assert equaloplists(loop1.operations, loop2.operations)
    py.test.raises(AssertionError, "equaloplists(loop1.operations, loop3.operations)")
Exemple #11
0
def test_remove_consts_and_duplicates():
    class FakeStaticData:
        cpu = None
        warmrunnerdesc = None
    def is_another_box_like(box, referencebox):
        assert box is not referencebox
        assert isinstance(box, referencebox.clonebox().__class__)
        assert box.value == referencebox.value
        return True
    metainterp = pyjitpl.MetaInterp(FakeStaticData(), None)
    metainterp.history = History()
    b1 = BoxInt(1)
    b2 = BoxInt(2)
    c3 = ConstInt(3)
    boxes = [b1, b2, b1, c3]
    dup = {}
    metainterp.remove_consts_and_duplicates(boxes, 4, dup)
    assert boxes[0] is b1
    assert boxes[1] is b2
    assert is_another_box_like(boxes[2], b1)
    assert is_another_box_like(boxes[3], c3)
    assert equaloplists(metainterp.history.operations, [
        ResOperation(rop.SAME_AS, [b1], boxes[2]),
        ResOperation(rop.SAME_AS, [c3], boxes[3]),
        ])
    assert dup == {b1: None, b2: None}
    #
    del metainterp.history.operations[:]
    b4 = BoxInt(4)
    boxes = [b2, b4, "something random"]
    metainterp.remove_consts_and_duplicates(boxes, 2, dup)
    assert is_another_box_like(boxes[0], b2)
    assert boxes[1] is b4
    assert equaloplists(metainterp.history.operations, [
        ResOperation(rop.SAME_AS, [b2], boxes[0]),
        ])
Exemple #12
0
def test_equaloplists_fail_args():
    ops = """
    [i0]
    i1 = int_add(i0, 1)
    i2 = int_add(i1, 1)
    guard_true(i1) [i2, i1]
    jump(i1)
    """
    namespace = {}
    loop1 = pure_parse(ops, namespace=namespace)
    loop2 = pure_parse(ops.replace("[i2, i1]", "[i1, i2]"), namespace=namespace)
    py.test.raises(AssertionError, "equaloplists(loop1.operations, loop2.operations)")
    assert equaloplists(loop1.operations, loop2.operations, strict_fail_args=False)
    loop3 = pure_parse(ops.replace("[i2, i1]", "[i2, i0]"), namespace=namespace)
    py.test.raises(AssertionError, "equaloplists(loop1.operations, loop3.operations)")
Exemple #13
0
def test_equaloplists():
    ops = """
    [i0]
    i1 = int_add(i0, 1)
    i2 = int_add(i1, 1)
    guard_true(i1) [i2]
    jump(i1)
    """
    namespace = {}
    loop1 = pure_parse(ops, namespace=namespace)
    loop2 = pure_parse(ops, namespace=namespace)
    loop3 = pure_parse(ops.replace("i2 = int_add", "i2 = int_sub"),
                       namespace=namespace)
    assert equaloplists(loop1.operations, loop2.operations)
    py.test.raises(AssertionError,
                   "equaloplists(loop1.operations, loop3.operations)")
Exemple #14
0
def test_equaloplists_fail_args():
    ops = """
    [i0]
    i1 = int_add(i0, 1)
    i2 = int_add(i1, 1)
    guard_true(i1) [i2, i1]
    jump(i1)
    """
    namespace = {}
    loop1 = pure_parse(ops, namespace=namespace)
    loop2 = pure_parse(ops.replace("[i2, i1]", "[i1, i2]"),
                       namespace=namespace)
    py.test.raises(AssertionError,
                   "equaloplists(loop1.operations, loop2.operations)")
    assert equaloplists(loop1.operations, loop2.operations,
                        strict_fail_args=False)
    loop3 = pure_parse(ops.replace("[i2, i1]", "[i2, i0]"),
                       namespace=namespace)
    py.test.raises(AssertionError,
                   "equaloplists(loop1.operations, loop3.operations)")
Exemple #15
0
 def check_rewrite(self, frm_operations, to_operations, **namespace):
     S = lltype.GcStruct('S', ('x', lltype.Signed),
                              ('y', lltype.Signed))
     sdescr = get_size_descr(self.gc_ll_descr, S)
     sdescr.tid = 1234
     #
     T = lltype.GcStruct('T', ('y', lltype.Signed),
                              ('z', lltype.Ptr(S)),
                              ('t', lltype.Signed))
     tdescr = get_size_descr(self.gc_ll_descr, T)
     tdescr.tid = 5678
     tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
     #
     A = lltype.GcArray(lltype.Signed)
     adescr = get_array_descr(self.gc_ll_descr, A)
     adescr.tid = 4321
     alendescr = adescr.lendescr
     #
     B = lltype.GcArray(lltype.Char)
     bdescr = get_array_descr(self.gc_ll_descr, B)
     bdescr.tid = 8765
     blendescr = bdescr.lendescr
     #
     C = lltype.GcArray(lltype.Ptr(S))
     cdescr = get_array_descr(self.gc_ll_descr, C)
     cdescr.tid = 8111
     clendescr = cdescr.lendescr
     #
     E = lltype.GcStruct('Empty')
     edescr = get_size_descr(self.gc_ll_descr, E)
     edescr.tid = 9000
     #
     vtable_descr = self.gc_ll_descr.fielddescr_vtable
     O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
                              ('x', lltype.Signed))
     o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     register_known_gctype(self.cpu, o_vtable, O)
     #
     tiddescr = self.gc_ll_descr.fielddescr_tid
     wbdescr = self.gc_ll_descr.write_barrier_descr
     WORD = globals()['WORD']
     #
     strdescr     = self.gc_ll_descr.str_descr
     unicodedescr = self.gc_ll_descr.unicode_descr
     strlendescr     = strdescr.lendescr
     unicodelendescr = unicodedescr.lendescr
     #
     namespace.update(locals())
     #
     for funcname in self.gc_ll_descr._generated_functions:
         namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname)
         namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
                                                  '%s_descr' % funcname)
     #
     ops = parse(frm_operations, namespace=namespace)
     expected = parse(to_operations % Evaluator(namespace),
                      namespace=namespace)
     operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
                                                     ops.operations,
                                                     [])
     equaloplists(operations, expected.operations)