[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