Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77625:bb48cb213dc0
Date: 2015-05-27 12:22 +0200
http://bitbucket.org/pypy/pypy/changeset/bb48cb213dc0/

Log:    fight with rewriting quite a bit more

diff --git a/rpython/jit/backend/llsupport/descr.py 
b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -36,11 +36,13 @@
     tid = llop.combine_ushort(lltype.Signed, 0, 0)
 
     def __init__(self, size, count_fields_if_immut=-1,
-                 gc_fielddescrs=None, all_fielddescrs=None):
+                 gc_fielddescrs=None, all_fielddescrs=None,
+                 vtable=0):
         self.size = size
         self.count_fields_if_immut = count_fields_if_immut
         self.gc_fielddescrs = gc_fielddescrs
         self.all_fielddescrs = all_fielddescrs
+        self.vtable = vtable
 
     def count_fields_if_immutable(self):
         return self.count_fields_if_immut
@@ -58,9 +60,12 @@
     def is_object(self):
         return True
 
+    def get_vtable(self):
+        return self.vtable
+
 BaseSizeDescr = SizeDescr
 
-def get_size_descr(gccache, STRUCT):
+def get_size_descr(cpu, gccache, STRUCT, is_object):
     cache = gccache._cache_size
     try:
         return cache[STRUCT]
@@ -70,9 +75,12 @@
         gc_fielddescrs = heaptracker.gc_fielddescrs(gccache, STRUCT)
         all_fielddescrs = heaptracker.all_fielddescrs(gccache, STRUCT)
         if heaptracker.has_gcstruct_a_vtable(STRUCT):
+            assert is_object
             sizedescr = SizeDescrWithVTable(size, count_fields_if_immut,
-                                            gc_fielddescrs, all_fielddescrs)
+                                            gc_fielddescrs, all_fielddescrs,
+                heaptracker.get_vtable_for_gcstruct(cpu, GCSTRUCT))
         else:
+            assert not is_object
             sizedescr = SizeDescr(size, count_fields_if_immut,
                                   gc_fielddescrs, all_fielddescrs)
         gccache.init_size_descr(STRUCT, sizedescr)
diff --git a/rpython/jit/backend/llsupport/llmodel.py 
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -299,7 +299,7 @@
         return rffi.cast(TYPE, x)
 
     def sizeof(self, S, is_object):
-        return get_size_descr(self.gc_ll_descr, S)
+        return get_size_descr(self, self.gc_ll_descr, S, is_object)
 
     def fielddescrof(self, STRUCT, fieldname):
         return get_field_descr(self.gc_ll_descr, STRUCT, fieldname)
diff --git a/rpython/jit/backend/llsupport/rewrite.py 
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -57,14 +57,17 @@
         return op
 
     def emit_op(self, op):
-        if op.type != 'v':
-            op = self.get_box_replacement(op)
-            # XXX specialize on number of args
-            for i in range(op.numargs()):
-                orig_arg = op.getarg(i)
-                arg = self.get_box_replacement(orig_arg)
-                if orig_arg is not arg:
-                    xxx
+        op = self.get_box_replacement(op)
+        # XXX specialize on number of args
+        replaced = False
+        for i in range(op.numargs()):
+            orig_arg = op.getarg(i)
+            arg = self.get_box_replacement(orig_arg)
+            if orig_arg is not arg:
+                if not replaced:
+                    op = op.copy_and_change(op.getopnum())
+                    replaced = True
+                op.setarg(i, arg)
         self._newops.append(op)
 
     def replace_op_with(self, op, newop):
@@ -147,14 +150,13 @@
         if opnum == rop.NEW:
             self.handle_new_fixedsize(op.getdescr(), op)
         elif opnum == rop.NEW_WITH_VTABLE:
-            classint = op.getarg(0).getint()
-            descr = heaptracker.vtable2descr(self.cpu, classint)
+            descr = op.getdescr()
             self.handle_new_fixedsize(descr, op)
             if self.gc_ll_descr.fielddescr_vtable is not None:
                 op = ResOperation(rop.SETFIELD_GC,
-                                  [op.result, ConstInt(classint)], None,
+                                  [op, ConstInt(descr.get_vtable())],
                                   descr=self.gc_ll_descr.fielddescr_vtable)
-                self.newops.append(op)
+                self.emit_op(op)
         elif opnum == rop.NEW_ARRAY or opnum == rop.NEW_ARRAY_CLEAR:
             descr = op.getdescr()
             assert isinstance(descr, ArrayDescr)
@@ -220,7 +222,7 @@
         assert isinstance(descr, SizeDescr)
         size = descr.size
         if self.gen_malloc_nursery(size, op):
-            self.gen_initialize_tid(op.result, descr.tid)
+            self.gen_initialize_tid(op, descr.tid)
         else:
             self.gen_malloc_fixedsize(size, descr.tid, op)
         self.clear_gc_fields(descr, op)
@@ -399,13 +401,14 @@
         for v, d in self.delayed_zero_setfields.iteritems():
             for ofs in d.iterkeys():
                 op = ResOperation(rop.ZERO_PTR_FIELD, [v, ConstInt(ofs)], None)
-                self.newops.append(op)
+                self.emit_op(op)
         self.delayed_zero_setfields.clear()
 
     def _gen_call_malloc_gc(self, args, v_result, descr):
         """Generate a CALL_MALLOC_GC with the given args."""
         self.emitting_an_operation_that_can_collect()
         op = ResOperation(rop.CALL_MALLOC_GC, args, descr)
+        self.replace_op_with(v_result, op)
         self.emit_op(op)
         # In general, don't add v_result to write_barrier_applied:
         # v_result might be a large young array.
@@ -529,29 +532,28 @@
                 self._op_malloc_nursery.setarg(0, ConstInt(total_size))
                 op = ResOperation(rop.INT_ADD,
                                   [self._v_last_malloced_nursery,
-                                   ConstInt(self._previous_size)],
-                                  v_result)
+                                   ConstInt(self._previous_size)])
         if op is None:
             # if we failed to merge with a previous MALLOC_NURSERY, emit one
             self.emitting_an_operation_that_can_collect()
             op = ResOperation(rop.CALL_MALLOC_NURSERY,
-                              [ConstInt(size)],
-                              v_result)
+                              [ConstInt(size)])
+            self.replace_op_with(v_result, op)
             self._op_malloc_nursery = op
         #
-        self.newops.append(op)
+        self.emit_op(op)
         self._previous_size = size
-        self._v_last_malloced_nursery = v_result
-        self.write_barrier_applied[v_result] = None
+        self._v_last_malloced_nursery = op
+        self.write_barrier_applied[op] = None
         return True
 
     def gen_initialize_tid(self, v_newgcobj, tid):
         if self.gc_ll_descr.fielddescr_tid is not None:
             # produce a SETFIELD to initialize the GC header
             op = ResOperation(rop.SETFIELD_GC,
-                              [v_newgcobj, ConstInt(tid)], None,
+                              [v_newgcobj, ConstInt(tid)],
                               descr=self.gc_ll_descr.fielddescr_tid)
-            self.newops.append(op)
+            self.emit_op(op)
 
     def gen_initialize_len(self, v_newgcobj, v_length, arraylen_descr):
         # produce a SETFIELD to initialize the array length
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py 
b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -28,13 +28,13 @@
     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 = get_size_descr(self.cpu, self.gc_ll_descr, S, False)
         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 = get_size_descr(self.cpu, self.gc_ll_descr, T, False)
         tdescr.tid = 5678
         tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
         #
@@ -54,13 +54,14 @@
         clendescr = cdescr.lendescr
         #
         E = lltype.GcStruct('Empty')
-        edescr = get_size_descr(self.gc_ll_descr, E)
+        edescr = get_size_descr(self.cpu, self.gc_ll_descr, E, False)
         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)
+        o_descr = self.cpu.sizeof(O, True)
         register_known_gctype(self.cpu, o_vtable, O)
         #
         tiddescr = self.gc_ll_descr.fielddescr_tid
@@ -111,7 +112,10 @@
         operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
                                                         ops.operations,
                                                         [])
-        equaloplists(operations, expected.operations)
+        remap = {}
+        for a, b in zip(ops.inputargs, expected.inputargs):
+            remap[b] = a
+        equaloplists(operations, expected.operations, remap=remap)
         lltype.free(frame_info, flavor='raw')
 
 class FakeTracker(object):
@@ -159,7 +163,8 @@
         class FakeCPU(BaseFakeCPU):
             def sizeof(self, STRUCT, is_object):
                 assert is_object
-                return SizeDescrWithVTable(102, gc_fielddescrs=[])
+                return SizeDescrWithVTable(102, gc_fielddescrs=[],
+                                           vtable=12)
         self.cpu = FakeCPU()
         self.gc_ll_descr = GcLLDescr_boehm(None, None, None)
 
@@ -230,13 +235,13 @@
     def test_new_with_vtable(self):
         self.check_rewrite("""
             []
-            p0 = new_with_vtable(ConstClass(o_vtable))
+            p0 = new_with_vtable(descr=o_descr)
             jump()
         """, """
             [p1]
             p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 102, \
                                 descr=malloc_fixedsize_descr)
-            setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
+            setfield_gc(p0, 12, descr=vtable_descr)
             jump()
         """)
 
@@ -295,7 +300,7 @@
         self.gc_ll_descr.malloc_zero_filled = False
         #
         class FakeCPU(BaseFakeCPU):
-            def sizeof(self, STRUCT):
+            def sizeof(self, STRUCT, is_object):
                 descr = SizeDescrWithVTable(104, gc_fielddescrs=[])
                 descr.tid = 9315
                 return descr
diff --git a/rpython/jit/metainterp/optimizeopt/util.py 
b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -167,7 +167,8 @@
         if op2 in remap:
             assert op1.same_box(remap[op2])
         else:
-            remap[op2] = op1
+            if op1.type != 'v':
+                remap[op2] = op1
         if op1.getopnum() not in [rop.JUMP, rop.LABEL, rop.FINISH] and not 
op1.is_guard():
             assert op1.getdescr() == op2.getdescr()
         if op1.getfailargs() or op2.getfailargs():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to