Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77622:3e70605b03b9
Date: 2015-05-27 11:35 +0200
http://bitbucket.org/pypy/pypy/changeset/3e70605b03b9/

Log:    start fighting with rewriting

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
@@ -44,13 +44,33 @@
     def __init__(self, gc_ll_descr, cpu):
         self.gc_ll_descr = gc_ll_descr
         self.cpu = cpu
-        self.newops = []
+        self._newops = []
         self.known_lengths = {}
         self.write_barrier_applied = {}
         self.delayed_zero_setfields = {}
         self.last_zero_arrays = []
         self.setarrayitems_occurred = {}   # {box: {set-of-indexes}}
 
+    def get_box_replacement(self, op):
+        while op.get_forwarded():
+            op = op.get_forwarded()
+        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
+        self._newops.append(op)
+
+    def replace_op_with(self, op, newop):
+        assert not op.get_forwarded()
+        op.set_forwarded(newop)
+
     def rewrite(self, operations):
         # we can only remember one malloc since the next malloc can possibly
         # collect; but we can try to collapse several known-size mallocs into
@@ -102,8 +122,8 @@
             if op.getopnum() == rop.JUMP or op.getopnum() == rop.FINISH:
                 self.emit_pending_zeros()
             #
-            self.newops.append(op)
-        return self.newops
+            self.emit_op(op)
+        return self._newops
 
     def could_merge_with_next_guard(self, op, i, operations):
         # return True in cases where the operation and the following guard
@@ -206,11 +226,11 @@
         self.clear_gc_fields(descr, op)
 
     def handle_new_array(self, arraydescr, op, kind=FLAG_ARRAY):
-        v_length = op.getarg(0)
+        v_length = self.get_box_replacement(op.getarg(0))
         total_size = -1
         if isinstance(v_length, ConstInt):
             num_elem = v_length.getint()
-            self.known_lengths[op.result] = num_elem
+            self.known_lengths[op] = num_elem
             try:
                 var_size = ovfcheck(arraydescr.itemsize * num_elem)
                 total_size = ovfcheck(arraydescr.basesize + var_size)
@@ -220,7 +240,8 @@
             total_size = arraydescr.basesize
         elif (self.gc_ll_descr.can_use_nursery_malloc(1) and
               self.gen_malloc_nursery_varsize(arraydescr.itemsize,
-              v_length, op.result, arraydescr, kind=kind)):
+              v_length, op, arraydescr, kind=kind)):
+            xxx
             # note that we cannot initialize tid here, because the array
             # might end up being allocated by malloc_external or some
             # stuff that initializes GC header fields differently
@@ -229,12 +250,14 @@
                                          v_length, op.getopnum())
             return
         if (total_size >= 0 and
-                self.gen_malloc_nursery(total_size, op.result)):
+                self.gen_malloc_nursery(total_size, op)):
+            xxx
             self.gen_initialize_tid(op.result, arraydescr.tid)
             self.gen_initialize_len(op.result, v_length, arraydescr.lendescr)
         elif self.gc_ll_descr.kind == 'boehm':
-            self.gen_boehm_malloc_array(arraydescr, v_length, op.result)
+            self.gen_boehm_malloc_array(arraydescr, v_length, op)
         else:
+            zzz
             opnum = op.getopnum()
             if opnum == rop.NEW_ARRAY or opnum == rop.NEW_ARRAY_CLEAR:
                 self.gen_malloc_array(arraydescr, v_length, op.result)
@@ -244,7 +267,7 @@
                 self.gen_malloc_unicode(v_length, op.result)
             else:
                 raise NotImplementedError(op.getopname())
-        self.clear_varsize_gc_fields(kind, op.getdescr(), op.result, v_length,
+        self.clear_varsize_gc_fields(kind, op.getdescr(), op, v_length,
                                      op.getopnum())
 
     def handle_clear_array_contents(self, arraydescr, v_arr, v_length):
@@ -383,7 +406,7 @@
         """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.newops.append(op)
+        self.emit_op(op)
         # In general, don't add v_result to write_barrier_applied:
         # v_result might be a large young array.
 
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
@@ -157,7 +157,8 @@
 class TestBoehm(RewriteTests):
     def setup_method(self, meth):
         class FakeCPU(BaseFakeCPU):
-            def sizeof(self, STRUCT):
+            def sizeof(self, STRUCT, is_object):
+                assert is_object
                 return SizeDescrWithVTable(102, gc_fielddescrs=[])
         self.cpu = FakeCPU()
         self.gc_ll_descr = GcLLDescr_boehm(None, None, None)
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -702,6 +702,7 @@
         assert not op.is_call_pure()
         orig_op = op
         op = self.replace_op_with(op, op.getopnum())
+        # XXX look in C and maybe specialize on number of args
         for i in range(op.numargs()):
             arg = self.force_box(op.getarg(i))
             #self.ensure_imported(value)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to