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

hakanardo at codespeak.net hakanardo at codespeak.net
Fri Oct 29 16:43:28 CEST 2010


Author: hakanardo
Date: Fri Oct 29 16:43:27 2010
New Revision: 78475

Modified:
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
(armin, hakanardo) separate into 3 loops

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 Oct 29 16:43:27 2010
@@ -9,8 +9,11 @@
     distinction anymore)"""
     
     def setup(self, virtuals):
-        self.enabled = virtuals
-
+        self.enabled = virtuals        
+        self.cloned_operations = []
+        for op in self.optimizer.loop.operations:
+            self.cloned_operations.append(op.clone())
+            
     def propagate_forward(self, op):
         if not self.enabled:
             self.emit_operation(op)
@@ -22,8 +25,7 @@
             self.optimizer.newoperations = []
             jump_args = op.getarglist()
             op.initarglist([])
-            inputargs = self.inline(loop.operations,
-                                    #loop.preamble.operations + [op],
+            inputargs = self.inline(self.cloned_operations,
                                     loop.inputargs, jump_args)
             loop.inputargs = inputargs
             jmp = ResOperation(rop.JUMP, loop.inputargs[:], None)
@@ -51,27 +53,24 @@
         self.snapshot_map ={None: None}
         
         inputargs = []
-        seen = {}
+        seen_inputargs = {}
         for arg in jump_args:
             boxes = []
-            self.getvalue(arg).enum_forced_boxes(boxes, seen)
+            self.getvalue(arg).enum_forced_boxes(boxes, seen_inputargs)
             for a in boxes:
                 if not isinstance(a, Const):
                     inputargs.append(a)
 
-        for op in loop_operations:
+        for newop in loop_operations:
             #import pdb; pdb.set_trace()
-            newop = op.clone()
             newop.initarglist([self.inline_arg(a) for a in newop.getarglist()])
-            if op.result:
-                newop.result = op.result.clonebox()
-                argmap[op.result] = newop.result
+            if newop.result:
+                old_result = newop.result
+                newop.result = newop.result.clonebox()
+                argmap[old_result] = newop.result
+
             descr = newop.getdescr()
             if isinstance(descr, ResumeGuardDescr):
-                orgdescr = op.getdescr()
-                assert isinstance(orgdescr, ResumeGuardDescr)
-                orgdescr.rd_snapshot = None #FIXME: In the right place?
-                descr.rd_numb = None
                 descr.rd_snapshot = self.inline_snapshot(descr.rd_snapshot)
                 
             if newop.getopnum() == rop.JUMP:
@@ -83,34 +82,55 @@
                 newop.initarglist(args + inputargs[len(args):])
 
             #print 'P: ', str(newop)
-            current = len(self.optimizer.newoperations)
+            #current = len(self.optimizer.newoperations)
             self.emit_operation(newop)
 
+
             # FIXME: force_lazy_setfield in heap.py may reorder last ops
-            current = max(current-1, 0)
-                
-            for op in self.optimizer.newoperations[current:]:
-                #print 'E: ', str(op)
-                if op.is_guard():
-                    descr = op.getdescr()
-                    assert isinstance(descr, ResumeGuardDescr)
-                    descr.rd_snapshot = None #FIXME: In the right place?
-                args = op.getarglist()
-                if op.is_guard():
-                    args = args + op.getfailargs()
-                #if op.getopnum() == rop.SETFIELD_GC:
-                #    import pdb; pdb.set_trace()
-                for a in args:
-                    if not isinstance(a, Const) and a in self.optimizer.values:
-                        v = self.getvalue(a)
-                        if v.fromstart and a not in inputargs:
+            #current = max(current-1, 0)
+        
+        jmp = self.optimizer.newoperations[-1]
+        assert jmp.getopnum() == rop.JUMP
+        jumpargs = jmp.getarglist()
+        for op in self.optimizer.newoperations:
+            print 'E: ', str(op)
+            #if op.is_guard():
+            #    descr = op.getdescr()
+            #    assert isinstance(descr, ResumeGuardDescr)
+            #    descr.rd_snapshot = None #FIXME: In the right place?
+            args = op.getarglist()
+            if op.is_guard():
+                #new_failargs = []
+                #for a in op.getfailargs():
+                #    new_failargs.append(self.getvalue(self.inline_arg(a)).force_box())
+                #op.setfailargs(new_failargs)
+                    
+                args = args + op.getfailargs()
+            print "Args: ", args
+            
+            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():
+                        a = v.force_box()
+                        if a not in inputargs:
                             inputargs.append(a)
-                            jmp = self.optimizer.newoperations[-1]
-                            if jmp.getopnum() == rop.JUMP:
-                                newval = self.getvalue(argmap[a])
-                                boxes = jmp.getarglist()
-                                boxes.append(newval.force_box())
-                                jmp.initarglist(boxes)
+                            newval = self.getvalue(argmap[a])
+                            jumpargs.append(newval.force_box())
+
+
+                        #boxes = []
+                        #v.enum_forced_boxes(boxes, seen_inputargs)
+                        #for b in boxes:
+                        #    if not isinstance(b, Const):
+                        #        inputargs.append(b)
+                        #        jumpargs.append(b)
+                                
+                        #newval = self.getvalue(argmap[a])
+                        #jumpargs.append(newval.force_box())
+        jmp.initarglist(jumpargs)
+
+        print "Inputargs: ", inputargs
 
         return inputargs
 

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py	Fri Oct 29 16:43:27 2010
@@ -298,7 +298,7 @@
         self.liveboxes_from_env = liveboxes_from_env
         self.liveboxes = {}
         storage.rd_numb = numb
-        #storage.rd_snapshot = None FIXME!!
+        storage.rd_snapshot = None
 
         # collect liveboxes and virtuals
         n = len(liveboxes_from_env) - v

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py	Fri Oct 29 16:43:27 2010
@@ -31,6 +31,9 @@
     def getopnum(self):
         return self.OPNUM
 
+    def clone(self):
+        return ESCAPE_OP(self.OPNUM, self.getarglist()[:], self.result, self.getdescr())
+
 class ExtendedTreeLoop(TreeLoop):
 
     def getboxes(self):

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 Oct 29 16:43:27 2010
@@ -3092,8 +3092,8 @@
         jump(i2)
         '''
         expected = '''
-        [i0]
-        jump(1)
+        []
+        jump()
         '''
         self.optimize_loop(ops, 'Not', expected)
 
@@ -3109,28 +3109,30 @@
         jump(i2)
         '''
         expected = '''
-        [i0]
-        jump(3)
+        []
+        jump()
         '''
         self.optimize_loop(ops, 'Not', expected)
 
     def test_arraycopy_not_virtual(self):
         ops = '''
-        [p0]
+        []
         p1 = new_array(3, descr=arraydescr)
         p2 = new_array(3, descr=arraydescr)
         setarrayitem_gc(p1, 2, 10, descr=arraydescr)
         setarrayitem_gc(p2, 2, 13, descr=arraydescr)
         call(0, p1, p2, 0, 0, 3, descr=arraycopydescr)
-        jump(p2)
+        escape(p2)
+        jump()
         '''
         expected = '''
-        [p0]
+        []
         p2 = new_array(3, descr=arraydescr)
         setarrayitem_gc(p2, 2, 10, descr=arraydescr)
-        jump(p2)
+        escape(p2)
+        jump()
         '''
-        self.optimize_loop(ops, 'Not', expected)
+        self.optimize_loop(ops, '', expected)
 
     def test_arraycopy_no_elem(self):
         """ this was actually observed in the wild



More information about the Pypy-commit mailing list