[pypy-svn] r74634 - in pypy/branch/blackhole-improvement/pypy/jit: codewriter codewriter/test metainterp

arigo at codespeak.net arigo at codespeak.net
Fri May 21 16:56:30 CEST 2010


Author: arigo
Date: Fri May 21 16:56:28 2010
New Revision: 74634

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
Log:
Still progress.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	Fri May 21 16:56:28 2010
@@ -214,17 +214,24 @@
             if linkfalse.llexitcase == True:
                 linkfalse, linktrue = linktrue, linkfalse
             opname = 'goto_if_not'
+            livebefore = False
             if isinstance(block.exitswitch, tuple):
                 # special case produced by jtransform.optimize_goto_if_not()
                 opname = 'goto_if_not_' + block.exitswitch[0]
                 opargs = block.exitswitch[1:]
+                if opargs[-1] == '-live-before':
+                    livebefore = True
+                    opargs = opargs[:-1]
             else:
                 assert block.exitswitch.concretetype == lltype.Bool
                 opargs = [block.exitswitch]
             #
             lst = self.flatten_list(opargs) + [TLabel(linkfalse)]
+            if livebefore:
+                self.emitline('-live-')
             self.emitline(opname, *lst)
-            self.emitline('-live-', TLabel(linkfalse))
+            if not livebefore:
+                self.emitline('-live-', TLabel(linkfalse))
             # true path:
             self.make_link(linktrue)
             # false path:

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Fri May 21 16:56:28 2010
@@ -136,6 +136,8 @@
                 # ok! optimize this case
                 block.operations.remove(op)
                 block.exitswitch = (op.opname,) + tuple(op.args)
+                if op.opname in ('ptr_iszero', 'ptr_nonzero'):
+                    block.exitswitch += ('-live-before',)
                 # if the variable escape to the next block along a link,
                 # replace it with a constant, because we know its value
                 for link in block.exits:

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	Fri May 21 16:56:28 2010
@@ -541,3 +541,18 @@
             -live- %i0, %r1
             int_return %i0
         """, transform=True, liveness=True)
+
+    def test_ptr_nonzero(self):
+        def f(p):
+            if p:
+                return 12
+            return 34
+        S = lltype.GcStruct('S')
+        self.encoding_test(f, [lltype.malloc(S)], """
+            -live- %r0
+            goto_if_not_ptr_nonzero %r0, L1
+            int_return $12
+            ---
+            L1:
+            int_return $34
+        """, transform=True, liveness=True)

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	Fri May 21 16:56:28 2010
@@ -142,7 +142,7 @@
         res = Transformer().optimize_goto_if_not(block)
         assert res == True
         assert block.operations == []
-        assert block.exitswitch == (opname, v1)
+        assert block.exitswitch == (opname, v1, '-live-before')
         assert block.exits == exits
 
 def test_symmetric():

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	Fri May 21 16:56:28 2010
@@ -1010,8 +1010,13 @@
             # (so it will be redone).
             pass
         #
-        elif opnum == rop.GUARD_NONNULL or opnum == rop.GUARD_ISNULL:
-            xxx
+        elif (opnum == rop.GUARD_NONNULL or
+              opnum == rop.GUARD_ISNULL or
+              opnum == rop.GUARD_NONNULL_CLASS):
+            # Produced by goto_if_not_ptr_{non,is}zero().  The pc is at the
+            # start of the opcode (so it will be redone).  This is needed
+            # because of GUARD_NONNULL_CLASS.
+            pass
         elif (opnum == rop.GUARD_NO_EXCEPTION or
               opnum == rop.GUARD_EXCEPTION or
               opnum == rop.GUARD_NOT_FORCED or

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Fri May 21 16:56:28 2010
@@ -66,6 +66,7 @@
         self.copy_constants(self.registers_i, jitcode.constants_i, ConstInt)
         self.copy_constants(self.registers_r, jitcode.constants_r, ConstPtr)
         self.copy_constants(self.registers_f, jitcode.constants_f, ConstFloat)
+        self._result_argcode = 'v'
 
     def copy_constants(self, registers, constants, ConstClass):
         """Copy jitcode.constants[0] to registers[255],
@@ -113,6 +114,7 @@
             if   argcode == 'i': self.registers_i[index] = None
             elif argcode == 'r': self.registers_r[index] = None
             elif argcode == 'f': self.registers_f[index] = None
+            self._result_argcode = 'v'     # done
         #
         self._tmp_count = 0
         count = self.jitcode.enumerate_live_vars(
@@ -297,25 +299,25 @@
                 self.opimpl_goto_if_not(condbox, target)
         ''' % (_opimpl, _opimpl.upper())).compile()
 
-    @arguments("box", "label")
-    def opimpl_goto_if_not_ptr_nonzero(self, box, target):
+    @arguments("orgpc", "box", "label")
+    def opimpl_goto_if_not_ptr_nonzero(self, orgpc, box, target):
         value = box.nonnull()
         if value:
             opnum = rop.GUARD_NONNULL
         else:
             opnum = rop.GUARD_ISNULL
-        self.generate_guard(opnum, box)
+        self.generate_guard(opnum, box, resumepc=orgpc)
         if not value:
             self.pc = target
 
-    @arguments("box", "label")
-    def opimpl_goto_if_not_ptr_iszero(self, box, target):
+    @arguments("orgpc", "box", "label")
+    def opimpl_goto_if_not_ptr_iszero(self, orgpc, box, target):
         value = box.nonnull()
         if value:
             opnum = rop.GUARD_NONNULL
         else:
             opnum = rop.GUARD_ISNULL
-        self.generate_guard(opnum, box)
+        self.generate_guard(opnum, box, resumepc=orgpc)
         if value:
             self.pc = target
 
@@ -1567,8 +1569,10 @@
             pass
         elif opnum == rop.GUARD_VALUE or opnum == rop.GUARD_CLASS:
             pass        # the pc is already set to the *start* of the opcode
-        elif opnum == rop.GUARD_NONNULL or opnum == rop.GUARD_ISNULL:
-            xxx #self.framestack[-1].ignore_next_guard_nullness(opnum)
+        elif (opnum == rop.GUARD_NONNULL or
+              opnum == rop.GUARD_ISNULL or
+              opnum == rop.GUARD_NONNULL_CLASS):
+            pass        # the pc is already set to the *start* of the opcode
         elif (opnum == rop.GUARD_NO_EXCEPTION or opnum == rop.GUARD_EXCEPTION
               or opnum == rop.GUARD_NOT_FORCED):
             exception = self.cpu.grab_exc_value()



More information about the Pypy-commit mailing list