[pypy-svn] r70405 - in pypy/trunk/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Mon Jan 4 20:57:20 CET 2010


Author: arigo
Date: Mon Jan  4 20:57:20 2010
New Revision: 70405

Modified:
   pypy/trunk/pypy/jit/metainterp/codewriter.py
   pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py
Log:
Constant-fold some paths, e.g. "if we_are_jitted:" paths,
when producing jitcodes.


Modified: pypy/trunk/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/codewriter.py	Mon Jan  4 20:57:20 2010
@@ -417,7 +417,6 @@
         """Generate a constant of the given value.
         Returns its index in the list self.positions[].
         """
-        if constvalue is _we_are_jitted: constvalue = True
         const = Const._new(constvalue, self.cpu)
         return self.get_position(const)
 
@@ -496,9 +495,22 @@
             linkfalse, linktrue = block.exits
             if linkfalse.llexitcase == True:
                 linkfalse, linktrue = linktrue, linkfalse
+            vpos = self.var_position(block.exitswitch)
+            #
+            # constant-fold an exitswitch
+            cv = self.get_constant_value(vpos)
+            if cv is not None:
+                if cv.value:
+                    link = linktrue
+                else:
+                    link = linkfalse
+                self.emit(*self.insert_renaming(link))
+                self.make_bytecode_block(link.target)
+                return
+            #
             self.emit("goto_if_not",
                       tlabel(linkfalse),
-                      self.var_position(block.exitswitch))
+                      vpos)
             self.minimize_variables(argument_only=True, exitswitch=False)
             truerenaming = self.insert_renaming(linktrue)
             falserenaming = self.insert_renaming(linkfalse)
@@ -818,15 +830,21 @@
             self.serialize_op_same_as(op)
 
     def serialize_op_int_is_true(self, op):
-        if isinstance(op.args[0], Constant):
-            if op.args[0].value is objectmodel.malloc_zero_filled:
+        vpos = self.var_position(op.args[0])
+        cv = self.get_constant_value(vpos)
+        if cv is not None:
+            if cv.value is objectmodel.malloc_zero_filled:
                 # always True for now
                 warmrunnerdesc = self.codewriter.metainterp_sd.warmrunnerdesc
                 if warmrunnerdesc is not None:
                     assert warmrunnerdesc.gcdescr.malloc_zero_filled
                 self.var_positions[op.result] = self.var_position(Constant(1))
                 return
-        self.emit('int_is_true', self.var_position(op.args[0]))
+            if cv.value is _we_are_jitted:
+                # always True
+                self.var_positions[op.result] = self.var_position(Constant(1))
+                return
+        self.emit('int_is_true', vpos)
         self.register_var(op.result)
 
     serialize_op_uint_is_true = serialize_op_int_is_true
@@ -1612,6 +1630,14 @@
                     raise VirtualizableArrayField(self.graph)
                 raise
 
+    def get_constant_value(self, vpos):
+        """Reverse of var_position().  Returns either None or a Constant."""
+        if vpos & 1:
+            value = self.constants[vpos // 2].value
+            return Constant(value)
+        else:
+            return None
+
     def emit(self, *stuff):
         self.assembler.extend(stuff)
 

Modified: pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py	Mon Jan  4 20:57:20 2010
@@ -2,6 +2,7 @@
 from pypy.rlib import jit
 from pypy.jit.metainterp import support, typesystem
 from pypy.jit.metainterp.policy import JitPolicy
+from pypy.jit.metainterp.history import ConstInt
 from pypy.jit.metainterp.codewriter import CodeWriter
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
 from pypy.translator.translator import graphof
@@ -476,6 +477,21 @@
         # itself a copy of the call.
         assert 'residual_call' in jitcode._source
 
+    def test_we_are_jitted(self):
+        def f():
+            if jit.we_are_jitted():
+                return 55
+            else:
+                return 66
+        graphs = self.make_graphs(f, [])
+        cw = CodeWriter(self.rtyper)
+        cw.candidate_graphs = [graphs[0]]
+        cw._start(self.metainterp_sd, None)
+        jitcode = cw.make_one_bytecode((graphs[0], None), False)
+        assert 'goto_if_not' not in jitcode._source
+        assert ConstInt(55) in jitcode.constants
+        assert ConstInt(66) not in jitcode.constants
+
 
 class ImmutableFieldsTests:
 



More information about the Pypy-commit mailing list