[pypy-svn] r74161 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Apr 28 13:57:41 CEST 2010
Author: arigo
Date: Wed Apr 28 13:57:39 2010
New Revision: 74161
Modified:
pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
Log:
Uniformize the reductions:
int_eq(x,0) => int_is_zero(x)
int_ne(x,0) => int_is_true(x)
ptr_eq(x,0) => ptr_iszero(x)
ptr_ne(x,0) => ptr_nonzero(x)
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py Wed Apr 28 13:57:39 2010
@@ -105,28 +105,7 @@
return False # not a supported operation
# ok! optimize this case
block.operations.remove(op)
- opname = op.opname
- args = op.args
- if op.opname in ('int_ne', 'int_eq'):
- if isinstance(args[0], Constant):
- args = args[::-1]
- if isinstance(args[1], Constant) and args[1].value == 0:
- if opname == 'int_eq':
- # must invert the two exit links
- link = block.exits[0]
- link.llexitcase = link.exitcase = not link.exitcase
- link = block.exits[1]
- link.llexitcase = link.exitcase = not link.exitcase
- opname = 'int_is_true'
- args = [args[0]]
- elif op.opname in ('ptr_eq', 'ptr_ne'):
- if isinstance(args[0], Constant):
- args = args[::-1]
- if isinstance(args[1], Constant) and not args[1].value:
- opname = {'ptr_eq': 'ptr_iszero',
- 'ptr_ne': 'ptr_nonzero'}[op.opname]
- args = [args[0]]
- block.exitswitch = (opname,) + tuple(args)
+ block.exitswitch = (op.opname,) + tuple(op.args)
return True
return False
@@ -361,7 +340,7 @@
sizedescr = self.cpu.sizeof(STRUCT)
return SpaceOperation('new', [sizedescr], op.result)
- def _rewrite_op_ptr_eq(self, op, opname):
+ def _rewrite_equality(self, op, opname):
arg0, arg1 = op.args
if isinstance(arg0, Constant) and not arg0.value:
return SpaceOperation(opname, [arg1], op.result)
@@ -370,11 +349,17 @@
else:
return op
+ def rewrite_op_int_eq(self, op):
+ return self._rewrite_equality(op, 'int_is_zero')
+
+ def rewrite_op_int_ne(self, op):
+ return self._rewrite_equality(op, 'int_is_true')
+
def rewrite_op_ptr_eq(self, op):
- return self._rewrite_op_ptr_eq(op, 'ptr_iszero')
+ return self._rewrite_equality(op, 'ptr_iszero')
def rewrite_op_ptr_ne(self, op):
- return self._rewrite_op_ptr_eq(op, 'ptr_nonzero')
+ return self._rewrite_equality(op, 'ptr_nonzero')
# ____________________________________________________________
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py Wed Apr 28 13:57:39 2010
@@ -69,32 +69,6 @@
block.exits = [FakeLink(False), FakeLink(True)]
assert not Transformer().optimize_goto_if_not(block)
-def test_optimize_goto_if_not__int_ne():
- c0 = Constant(0, lltype.Signed)
- v1 = Variable()
- v3 = Variable(); v3.concretetype = lltype.Bool
- for linkcase1 in [False, True]:
- linkcase2 = not linkcase1
- for op, args in [('int_ne', [v1, c0]),
- ('int_ne', [c0, v1]),
- ('int_eq', [v1, c0]),
- ('int_eq', [c0, v1])]:
- block = Block([v1])
- block.operations = [SpaceOperation(op, args, v3)]
- block.exitswitch = v3
- block.exits = exits = [FakeLink(linkcase1), FakeLink(linkcase2)]
- res = Transformer().optimize_goto_if_not(block)
- assert res == True
- assert block.operations == []
- assert block.exitswitch == ('int_is_true', v1)
- assert block.exits == exits
- if op == 'int_ne':
- assert exits[0].exitcase == exits[0].llexitcase == linkcase1
- assert exits[1].exitcase == exits[1].llexitcase == linkcase2
- else:
- assert exits[0].exitcase == exits[0].llexitcase == linkcase2
- assert exits[1].exitcase == exits[1].llexitcase == linkcase1
-
def test_optimize_goto_if_not__ptr_eq():
for opname in ['ptr_eq', 'ptr_ne']:
v1 = Variable()
@@ -124,25 +98,6 @@
assert block.exitswitch == (opname, v1)
assert block.exits == exits
-def test_optimize_goto_if_not__ptr_eq_reduced():
- c0 = Constant(lltype.nullptr(rclass.OBJECT), rclass.OBJECTPTR)
- for opname, reducedname in [('ptr_eq', 'ptr_iszero'),
- ('ptr_ne', 'ptr_nonzero')]:
- for nullindex in [0, 1]:
- v1 = Variable()
- v3 = Variable(); v3.concretetype = lltype.Bool
- block = Block([v1])
- args = [v1, v1]
- args[nullindex] = c0
- block.operations = [SpaceOperation(opname, args, v3)]
- block.exitswitch = v3
- block.exits = exits = [FakeLink(False), FakeLink(True)]
- res = Transformer().optimize_goto_if_not(block)
- assert res == True
- assert block.operations == []
- assert block.exitswitch == (reducedname, v1)
- assert block.exits == exits
-
def test_residual_call():
for RESTYPE in [lltype.Signed, rclass.OBJECTPTR,
lltype.Float, lltype.Void]:
@@ -307,6 +262,29 @@
assert block.exits[0].target is block2
assert block.exits[0].args == [v1]
+def test_int_eq():
+ v1 = varoftype(lltype.Signed)
+ v2 = varoftype(lltype.Signed)
+ v3 = varoftype(lltype.Bool)
+ c0 = Constant(0, lltype.Signed)
+ #
+ for opname, reducedname in [('int_eq', 'int_is_zero'),
+ ('int_ne', 'int_is_true')]:
+ op = SpaceOperation(opname, [v1, v2], v3)
+ op1 = Transformer().rewrite_operation(op)
+ assert op1.opname == opname
+ assert op1.args == [v1, v2]
+ #
+ op = SpaceOperation(opname, [v1, c0], v3)
+ op1 = Transformer().rewrite_operation(op)
+ assert op1.opname == reducedname
+ assert op1.args == [v1]
+ #
+ op = SpaceOperation(opname, [c0, v2], v3)
+ op1 = Transformer().rewrite_operation(op)
+ assert op1.opname == reducedname
+ assert op1.args == [v2]
+
def test_ptr_eq():
v1 = varoftype(rclass.OBJECTPTR)
v2 = varoftype(rclass.OBJECTPTR)
@@ -329,3 +307,26 @@
op1 = Transformer().rewrite_operation(op)
assert op1.opname == reducedname
assert op1.args == [v2]
+
+def test_nongc_ptr_eq():
+ v1 = varoftype(rclass.NONGCOBJECTPTR)
+ v2 = varoftype(rclass.NONGCOBJECTPTR)
+ v3 = varoftype(lltype.Bool)
+ c0 = Constant(lltype.nullptr(rclass.NONGCOBJECT), rclass.NONGCOBJECTPTR)
+ #
+ for opname, reducedname in [('int_eq', 'int_is_zero'),
+ ('int_ne', 'int_is_true')]:
+ op = SpaceOperation(opname, [v1, v2], v3)
+ op1 = Transformer().rewrite_operation(op)
+ assert op1.opname == opname
+ assert op1.args == [v1, v2]
+ #
+ op = SpaceOperation(opname, [v1, c0], v3)
+ op1 = Transformer().rewrite_operation(op)
+ assert op1.opname == reducedname
+ assert op1.args == [v1]
+ #
+ op = SpaceOperation(opname, [c0, v2], v3)
+ op1 = Transformer().rewrite_operation(op)
+ assert op1.opname == reducedname
+ assert op1.args == [v2]
More information about the Pypy-commit
mailing list