[pypy-svn] r77473 - in pypy/branch/jit-loop-invaraints/pypy/jit/metainterp: . optimizeopt test

hakanardo at codespeak.net hakanardo at codespeak.net
Wed Sep 29 19:36:46 CEST 2010


Author: hakanardo
Date: Wed Sep 29 19:36:45 2010
New Revision: 77473

Added:
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py.try1
      - copied unchanged from r77374, pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
Modified:
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py
Log:
Made mess of trying to pass data from a loop to its bridges using VInvariantOpInfo :(

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py	Wed Sep 29 19:36:45 2010
@@ -3,7 +3,24 @@
 from pypy.jit.metainterp.compile import prebuiltNotSpecNode
 from pypy.rlib.debug import debug_print
 from pypy.jit.metainterp.history import Const
+from pypy.jit.metainterp.optimizeopt.virtualize import AbstractVirtualValue
 
+class VInvariantOpValue(AbstractVirtualValue):
+    def setup(self, op):
+        self.op = op
+        v = self.optimizer.getvalue(self.keybox)
+        self.intbound = v.intbound
+
+    def get_args_for_fail(self, modifier):
+        if self.box is None and not modifier.already_seen_virtual(self.keybox):
+            modifier.register_virtual_fields(self.keybox, [self.keybox])
+
+    def _make_virtual(self, modifier):
+        return modifier.make_vinvop(self.op)
+
+    def force_box(self):
+        return self.keybox
+    
 class OptInvariant(Optimization):
     """Move loop invariant code into a preamble.
     """
@@ -74,6 +91,11 @@
                     box = v.force_box() 
                     if box and box not in self.invariant_boxes:
                         self.invariant_boxes.append(box)
+                    box = op.result
+                    vvalue = VInvariantOpValue(self.optimizer, box, op)
+                    vvalue.setup(op)
+                    del self.optimizer.values[box]
+                    self.make_equal_to(box, vvalue)
 
                 return
 

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py	Wed Sep 29 19:36:45 2010
@@ -354,6 +354,7 @@
         assert isinstance(descr, compile.ResumeGuardDescr)
         modifier = resume.ResumeDataVirtualAdder(descr, self.resumedata_memo)
         newboxes = modifier.finish(self.values, self.pendingfields)
+        debug_print('\ndescr:', descr)
         if len(newboxes) > self.metainterp_sd.options.failargs_limit: # XXX be careful here
             compile.giveup()
         descr.store_final_boxes(op, newboxes)

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py	Wed Sep 29 19:36:45 2010
@@ -244,6 +244,9 @@
         self.storage = storage
         self.memo = memo
 
+    def make_vinvop(self, op):
+        return VInvariantOpInfo(op)
+
     def make_virtual(self, known_class, fielddescrs):
         return VirtualInfo(known_class, fielddescrs)
 
@@ -313,6 +316,8 @@
 
         storage.rd_consts = self.memo.consts
         dump_storage(storage, liveboxes)
+        debug_print('liveboxes:', liveboxes)
+        debug_print('liveboxes:', [l.__class__ for l in liveboxes])
         return liveboxes[:]
 
     def _number_virtuals(self, liveboxes, values, num_env_virtuals):
@@ -409,6 +414,11 @@
     def debug_prints(self):
         raise NotImplementedError
 
+class VFromStartInfo(AbstractVirtualInfo):
+    def __init__(self, box, idx=-1):
+        self.set_content([fieldnums])
+        self.index = idx
+
 class AbstractVirtualStructInfo(AbstractVirtualInfo):
     def __init__(self, fielddescrs):
         self.fielddescrs = fielddescrs
@@ -440,6 +450,23 @@
         debug_print("\tvirtualinfo", self.known_class.repr_rpython())
         AbstractVirtualStructInfo.debug_prints(self)
 
+class VInvariantOpInfo(AbstractVirtualInfo):
+    def __init__(self, op):
+        self.op = op
+
+    @specialize.argtype(1)
+    def allocate(self, decoder):
+        #return decoder.allocate_op(self.op)
+        #raise
+        return None
+
+    def debug_prints(self):
+        debug_print("\tVInvariantOpInfo", self.op)
+
+    @specialize.argtype(1)
+    def setfields(self, decoder, array):
+        pass
+
 class VStructInfo(AbstractVirtualStructInfo):
     def __init__(self, typedescr, fielddescrs):
         AbstractVirtualStructInfo.__init__(self, fielddescrs)
@@ -536,6 +563,7 @@
         self.cur_numb = self.cur_numb.prev
 
     def _callback_i(self, index, register_index):
+        print "I: ", self.cur_numb.nums[index]
         value = self.decode_int(self.cur_numb.nums[index])
         self.write_an_int(register_index, value)
 
@@ -614,6 +642,9 @@
     def allocate_with_vtable(self, known_class):
         return self.metainterp.execute_and_record(rop.NEW_WITH_VTABLE,
                                                   None, known_class)
+    #def allocate_op(self, op):
+    #    return self.metainterp.execute_and_record_varargs(
+    #        op.opnum, op.args, op.descr)
 
     def allocate_struct(self, typedescr):
         return self.metainterp.execute_and_record(rop.NEW, typedescr)

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py	Wed Sep 29 19:36:45 2010
@@ -356,7 +356,7 @@
         assert res == 919
         self.check_loop_count(3)
 
-    def test_loop_invariant_mul_bridge_maintaining(self):
+    def test_loop_invariant_mul_bridge_maintaining1(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
         def f(x, y):
             res = 0
@@ -376,6 +376,27 @@
                           'int_sub': 2, 'int_mul': 2, 'int_add': 2,
                           'jump': 3})
 
+    def test_loop_invariant_mul_bridge_maintaining2(self):
+        myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
+        def f(x, y):
+            res = 0
+            while y > 0:
+                myjitdriver.can_enter_jit(x=x, y=y, res=res)
+                myjitdriver.jit_merge_point(x=x, y=y, res=res)
+                z = x * x
+                res += z
+                if y<8:
+                    res += z
+                y -= 1
+            return res
+        res = self.meta_interp(f, [6, 16])
+        assert res == 828
+        self.check_loop_count(3)
+        self.check_loops({'int_lt': 1, 'int_gt': 1,
+                          'guard_false': 1, 'guard_true': 1,
+                          'int_sub': 2, 'int_mul': 2, 'int_add': 2,
+                          'jump': 3})
+
     def test_loop_invariant_intbox(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
         class I:

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py	Wed Sep 29 19:36:45 2010
@@ -12,7 +12,7 @@
     def _freeze_(self):
         return True
 
-    def test_virtualized(self):
+    def test_virtualized1(self):
         myjitdriver = JitDriver(greens = [], reds = ['n', 'node'])
         def f(n):
             node = self._new()



More information about the Pypy-commit mailing list