[pypy-svn] r78723 - in pypy/branch/jit-unroll-loops/pypy/jit/metainterp: optimizeopt test

hakanardo at codespeak.net hakanardo at codespeak.net
Fri Nov 5 11:49:06 CET 2010


Author: hakanardo
Date: Fri Nov  5 11:49:05 2010
New Revision: 78723

Modified:
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
Keep track of boxes created in second iteration insted of trying to figure out all places where boxes were stored during the first. Fixes a problem with boxes proven to be consatant first after 2 iterations.

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py	Fri Nov  5 11:49:05 2010
@@ -40,15 +40,9 @@
         assert len(loop_args) == len(jump_args)
         for i in range(len(loop_args)):
            argmap[loop_args[i]] = jump_args[i]
-
+           
         for v in self.optimizer.values.values():
             v.last_guard_index = -1 # FIXME: Are there any more indexes stored?
-            if not v.is_constant() and v.box:
-                v.fromstart = True # XXX do we really need to use an attribute?
-
-        for op in self.optimizer.pure_operations.values():
-            v = self.getvalue(op.result)
-            v.fromstart = True
 
         self.snapshot_map = {None: None}
         inputargs = []
@@ -83,29 +77,34 @@
             #print 'P: ', str(newop)
             self.emit_operation(newop)
 
-        jmp = self.optimizer.newoperations[-1]
+        # Remove jump to make sure forced code are placed before it
+        newoperations = self.optimizer.newoperations
+        jmp = newoperations[-1]
         assert jmp.getopnum() == rop.JUMP
+        self.optimizer.newoperations = newoperations[:-1]
+
+        boxes_created_this_iteration = {}
         jumpargs = jmp.getarglist()
-        for op in self.optimizer.newoperations:
+
+        # FIXME: Should also loop over operations added by forcing things in this loop 
+        for op in newoperations: 
             #print 'E: ', str(op)
+            boxes_created_this_iteration[op.result] = True
             args = op.getarglist()
             if op.is_guard():
                 args = args + op.getfailargs()
             
             for a in args:
-                if not isinstance(a, Const) and a in self.optimizer.values:
-                    v = self.getvalue(a)
-                    if v.fromstart and not v.is_constant():
-                        b = v.force_box()
-                        if b not in inputargs:
-                        #boxes = []
-                        #v.enum_forced_boxes(boxes, seen_inputargs)
-                        #for b in boxes:
-                            inputargs.append(b)
-                            newval = self.getvalue(argmap[b])
-                            jumpargs.append(newval.force_box())
+                if not isinstance(a, Const) and not a in boxes_created_this_iteration:
+                    if a not in inputargs:
+                        inputargs.append(a)
+                        b = self.getvalue(a).force_box()
+                        if not isinstance(b, Const):
+                            b = self.getvalue(argmap[b]).force_box()
+                        jumpargs.append(b)
 
         jmp.initarglist(jumpargs)
+        self.optimizer.newoperations.append(jmp)
         return inputargs
 
     def inline_arg(self, arg):

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py	Fri Nov  5 11:49:05 2010
@@ -3932,6 +3932,69 @@
         """
         self.optimize_loop(ops, expected, preamble)
 
+    def test_value_proven_to_be_constant_after_two_iterations(self):
+        class FakeDescr(AbstractDescr):
+            def __init__(self, name):
+                self.name = name
+            def sort_key(self):
+                return id(self)
+
+                
+        for n in ('inst_w_seq', 'inst_index', 'inst_w_list', 'inst_length',
+                  'inst_start', 'inst_step'):
+            self.namespace[n] = FakeDescr(n)
+        ops = """
+        [p0, p1, p2, p3, i4, p5, i6, p7, p8, p9, p14]
+        guard_value(i4, 3) []
+        guard_class(p9, 17278984) []
+        guard_class(p9, 17278984) []
+        p22 = getfield_gc(p9, descr=inst_w_seq)
+        guard_nonnull(p22) []
+        i23 = getfield_gc(p9, descr=inst_index)
+        p24 = getfield_gc(p22, descr=inst_w_list)
+        guard_isnull(p24) []
+        i25 = getfield_gc(p22, descr=inst_length)
+        i26 = int_ge(i23, i25)
+        guard_true(i26) []
+        setfield_gc(p9, ConstPtr(myptr), descr=inst_w_seq)
+
+        guard_nonnull(p14)  []
+        guard_class(p14, 17273920) []
+        guard_class(p14, 17273920) []
+
+        p75 = new_with_vtable(17278984)
+        setfield_gc(p75, p14, descr=inst_w_seq)
+        setfield_gc(p75, 0, descr=inst_index)
+        guard_class(p75, 17278984) []
+        guard_class(p75, 17278984) []
+        p79 = getfield_gc(p75, descr=inst_w_seq)
+        guard_nonnull(p79) []
+        i80 = getfield_gc(p75, descr=inst_index)
+        p81 = getfield_gc(p79, descr=inst_w_list)
+        guard_isnull(p81) []
+        i82 = getfield_gc(p79, descr=inst_length)
+        i83 = int_ge(i80, i82)
+        guard_false(i83) []
+        i84 = getfield_gc(p79, descr=inst_start)
+        i85 = getfield_gc(p79, descr=inst_step)
+        i86 = int_mul(i80, i85)
+        i87 = int_add(i84, i86)
+        i91 = int_add(i80, 1)
+        setfield_gc(p75, i91, descr=inst_index)
+        
+        p110 = same_as(ConstPtr(myptr))
+        i112 = same_as(3)
+        i114 = same_as(39)
+        jump(p0, p1, p110, p3, i112, p5, i114, p7, p8, p75, p14)
+        """
+        expected = """
+        [p0, p1, p3, p5, p7, p8, p14, i82]
+        i115 = int_ge(1, i82)
+        guard_true(i115) []
+        jump(p0, p1, p3, p5, p7, p8, p14, 1)
+        """
+        self.optimize_loop(ops, expected)
+        
     # ----------
     def optimize_strunicode_loop(self, ops, optops, preamble=None):
         if not preamble:



More information about the Pypy-commit mailing list