[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