[pypy-svn] r66966 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test
micke at codespeak.net
micke at codespeak.net
Wed Aug 19 12:39:53 CEST 2009
Author: micke
Date: Wed Aug 19 12:39:53 2009
New Revision: 66966
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
(cfbolz, micke): optimize series of ooisnull and oononnull on the same object
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimizeopt.py Wed Aug 19 12:39:53 2009
@@ -85,12 +85,27 @@
if self.level < LEVEL_NONNULL:
self.level = LEVEL_NONNULL
+ def make_null_or_nonnull(self):
+ if self.box.nonnull():
+ self.make_nonnull()
+ else:
+ self.make_constant()
+
def is_virtual(self):
# Don't check this with 'isinstance(_, VirtualValue)'!
# Even if it is a VirtualValue, the 'box' can be non-None,
# meaning it has been forced.
return self.box is None
+class BoolValue(OptValue):
+
+ def __init__(self, box, fromvalue):
+ OptValue.__init__(self, box)
+ self.fromvalue = fromvalue
+
+ def make_constant(self):
+ OptValue.make_constant(self)
+ self.fromvalue.make_null_or_nonnull()
class ConstantValue(OptValue):
level = LEVEL_CONSTANT
@@ -364,6 +379,11 @@
self.make_equal_to(box, vvalue)
return vvalue
+ def make_bool(self, box, fromvalue):
+ value = BoolValue(box, fromvalue)
+ self.make_equal_to(box, value)
+ return value
+
def new_ptr_box(self):
if not self.cpu.is_oo:
return BoxPtr()
@@ -536,19 +556,22 @@
self.emit_operation(op)
self.exception_might_have_happened = False
- def optimize_OONONNULL(self, op):
+ def _optimize_nullness(self, op, expect_nonnull):
if self.known_nonnull(op.args[0]):
- assert op.result.getint() == 1
+ assert op.result.getint() == expect_nonnull
+ self.make_constant(op.result)
+ elif self.is_constant(op.args[0]): # known to be null
+ assert op.result.getint() == (not expect_nonnull)
self.make_constant(op.result)
else:
- self.optimize_default(op)
+ self.make_bool(op.result, self.getvalue(op.args[0]))
+ self.emit_operation(op)
+
+ def optimize_OONONNULL(self, op):
+ self._optimize_nullness(op, True)
def optimize_OOISNULL(self, op):
- if self.known_nonnull(op.args[0]):
- assert op.result.getint() == 0
- self.make_constant(op.result)
- else:
- self.optimize_default(op)
+ self._optimize_nullness(op, False)
def optimize_OOISNOT(self, op):
value0 = self.getvalue(op.args[0])
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizeopt.py Wed Aug 19 12:39:53 2009
@@ -245,7 +245,6 @@
self.optimize_loop(ops, 'Not', expected, i0=1, i1=0)
def test_ooisnull_oononnull_2(self):
- py.test.skip("less important")
ops = """
[p0]
i0 = oononnull(p0) # p0 != NULL
@@ -263,7 +262,32 @@
fail()
jump(p0)
"""
- self.optimize_loop(ops, 'Not', expected, i0=1, i1=0)
+ self.optimize_loop(ops, 'Not', expected, i0=1, i1=0,
+ p0=self.nodebox.value)
+
+ def test_ooisnull_oononnull_via_virtual(self):
+ ops = """
+ [p0]
+ pv = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(pv, p0, descr=valuedescr)
+ i0 = oononnull(p0) # p0 != NULL
+ guard_true(i0)
+ fail()
+ p1 = getfield_gc(pv, descr=valuedescr)
+ i1 = ooisnull(p1)
+ guard_false(i1)
+ fail()
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ i0 = oononnull(p0)
+ guard_true(i0)
+ fail()
+ jump(p0)
+ """
+ self.optimize_loop(ops, 'Not', expected, i0=1, i1=0,
+ p0=self.nodebox.value)
def test_oois_1(self):
ops = """
@@ -556,21 +580,6 @@
i1 = oononnull(p0)
guard_true(i1)
fail()
- i2 = ooisnull(p0)
- guard_false(i2)
- fail()
- i3 = oononnull(p0)
- guard_true(i3)
- fail()
- i4 = ooisnull(p0)
- guard_false(i4)
- fail()
- i5 = oononnull(p0)
- guard_true(i5)
- fail()
- i6 = ooisnull(p0)
- guard_false(i6)
- fail()
i7 = ooisnot(p0, p1)
guard_true(i7)
fail()
More information about the Pypy-commit
mailing list