[pypy-svn] r74605 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test
arigo at codespeak.net
arigo at codespeak.net
Thu May 20 20:01:23 CEST 2010
Author: arigo
Date: Thu May 20 20:01:21 2010
New Revision: 74605
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/liveness.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py
Log:
In-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 Thu May 20 20:01:21 2010
@@ -105,6 +105,7 @@
return
if block in self.seen_blocks:
self.emitline("goto", TLabel(block))
+ self.emitline("---")
return
# inserting a goto not necessary, falling through
self.seen_blocks[block] = True
@@ -130,6 +131,7 @@
self.emitline("raise", self.getcolor(args[1]))
else:
raise Exception("?")
+ self.emitline("---")
def make_link(self, link):
if link.target.exits == ():
@@ -167,12 +169,13 @@
# An exception block. See test_exc_exitswitch in test_flatten.py
# for an example of what kind of code this makes.
lastopname = block.operations[-1].opname
- if lastopname == '-live-':
- lastopname = block.operations[-2].opname
+ assert lastopname != '-live-'
assert block.exits[0].exitcase is None # is this always True?
#
if not self._include_all_exc_links:
- if not lastopname.startswith('G_'): # cannot actually raise
+ if (len(block.operations) == 1 or
+ block.operations[-2].opname != '-live-'):
+ # cannot actually raise
self.make_link(block.exits[0])
return
#
@@ -182,7 +185,7 @@
for link in block.exits[1:]:
if (link.exitcase is Exception or
(link.exitcase is OverflowError and
- lastopname.startswith('G_int_') and
+ lastopname.startswith('int_') and
lastopname.endswith('_ovf'))):
# this link captures all exceptions
self.make_exception_link(link)
@@ -197,6 +200,7 @@
# no link captures all exceptions, so we have to put a reraise
# for the other exceptions
self.emitline("reraise")
+ self.emitline("---")
#
elif len(block.exits) == 2 and (
isinstance(block.exitswitch, tuple) or
@@ -230,7 +234,7 @@
if block.exits[-1].exitcase == 'default':
self.make_link(block.exits[-1])
else:
- self.emitline('unreachable')
+ self.emitline("---")
#
switches = [link for link in block.exits
if link.exitcase != 'default']
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 Thu May 20 20:01:21 2010
@@ -198,9 +198,6 @@
rewrite_op_int_gt = _rewrite_symmetric
rewrite_op_int_ge = _rewrite_symmetric
- rewrite_op_G_int_add_ovf = _rewrite_symmetric
- rewrite_op_G_int_mul_ovf = _rewrite_symmetric
-
rewrite_op_float_add = _rewrite_symmetric
rewrite_op_float_mul = _rewrite_symmetric
rewrite_op_float_lt = _rewrite_symmetric
@@ -208,6 +205,17 @@
rewrite_op_float_gt = _rewrite_symmetric
rewrite_op_float_ge = _rewrite_symmetric
+ def rewrite_op_int_add_ovf(self, op):
+ op0 = SpaceOperation('-live-', op.args[:], None)
+ op1 = self._rewrite_symmetric(op)
+ return [op0, op1]
+
+ rewrite_op_int_mul_ovf = rewrite_op_int_add_ovf
+
+ def rewrite_op_int_sub_ovf(self, op):
+ op0 = SpaceOperation('-live-', op.args[:], None)
+ return [op0, op]
+
# ----------
# Various kinds of calls
@@ -259,11 +267,11 @@
is calling a function that we don't want to JIT. The initial args
of 'residual_call_xxx' are the function to call, and its calldescr."""
calldescr = self.callcontrol.getcalldescr(op)
+ op1 = self.rewrite_call(op, 'residual_call',
+ [op.args[0], calldescr] + extraargs)
if self.callcontrol.calldescr_canraise(calldescr):
- name = 'G_residual_call'
- else:
- name = 'residual_call'
- return self.rewrite_call(op, name, [op.args[0], calldescr] + extraargs)
+ op1 = [SpaceOperation('-live-', [], None), op1]
+ return op1
def handle_regular_call(self, op):
"""A direct_call turns into the operation 'inline_call_xxx' if it
@@ -272,7 +280,9 @@
[targetgraph] = self.callcontrol.graphs_from(op)
jitcode = self.callcontrol.get_jitcode(targetgraph,
called_from=self.graph)
- return self.rewrite_call(op, 'G_inline_call', [jitcode])
+ op0 = SpaceOperation('-live-', [], None)
+ op1 = self.rewrite_call(op, 'inline_call', [jitcode])
+ return [op0, op1]
def handle_builtin_call(self, op):
oopspec_name, args = support.decode_builtin_call(op)
@@ -288,9 +298,15 @@
jitcode = self.callcontrol.get_jitcode(targetgraph,
called_from=self.graph)
lst.append(jitcode)
- op0 = SpaceOperation('G_int_guard_value', [op.args[0]], None)
- op1 = self.handle_residual_call(op, [IndirectCallTargets(lst)])
- return [op0, op1]
+ op0 = SpaceOperation('-live-', [op.args[0]], None)
+ op1 = SpaceOperation('int_guard_value', [op.args[0]], None)
+ op2 = self.handle_residual_call(op, [IndirectCallTargets(lst)])
+ result = [op0, op1]
+ if isinstance(op2, list):
+ result += op2
+ else:
+ result.append(op2)
+ return result
def _prepare_builtin_call(self, op, oopspec_name, args,
extra=None, extrakey=None):
@@ -329,15 +345,11 @@
if hints.get('promote') and op.args[0].concretetype is not lltype.Void:
assert op.args[0].concretetype != lltype.Ptr(rstr.STR)
kind = getkind(op.args[0].concretetype)
- # note: the 'G_' prefix tells that the operation might generate
- # a guard in pyjitpl (see liveness.py). The following 'keepalive'
- # is needed to ensure that op.args[0] is restored on guard failure.
- op1 = SpaceOperation('G_%s_guard_value' % kind,
- [op.args[0]], None)
- op2 = SpaceOperation('keepalive', [op.args[0]], None)
- # this special return value forces op.result to be considered
+ op0 = SpaceOperation('-live-', [op.args[0]], None)
+ op1 = SpaceOperation('%s_guard_value' % kind, [op.args[0]], None)
+ # the special return value None forces op.result to be considered
# equal to op.args[0]
- return [op1, op2, None]
+ return [op0, op1, None]
else:
log.WARNING('ignoring hint %r at %r' % (hints, self.graph))
@@ -451,11 +463,9 @@
op.args[0].concretetype.TO._hints.get('typeptr'))
def handle_getfield_typeptr(self, op):
- # note: the 'G_' prefix tells that the operation might generate
- # a guard in pyjitpl (see liveness.py). The following 'keepalive'
- # is needed to ensure that op.args[0] is restored on guard failure.
- return [SpaceOperation('G_guard_class', [op.args[0]], op.result),
- SpaceOperation('keepalive', [op.args[0]], None)]
+ op0 = SpaceOperation('-live-', [op.args[0]], None)
+ op1 = SpaceOperation('guard_class', [op.args[0]], op.result)
+ return [op0, op1]
def rewrite_op_malloc(self, op):
assert op.args[1].value == {'flavor': 'gc'}
@@ -569,10 +579,7 @@
('cast_uint_to_float', 'cast_int_to_float'),
('cast_float_to_uint', 'cast_float_to_int'),
- ('int_add_ovf', 'G_int_add_ovf'),
- ('int_add_nonneg_ovf', 'G_int_add_ovf'),
- ('int_sub_ovf', 'G_int_sub_ovf'),
- ('int_mul_ovf', 'G_int_mul_ovf'),
+ ('int_add_nonneg_ovf', 'int_add_ovf'),
('char_lt', 'int_lt'),
('char_le', 'int_le'),
@@ -649,7 +656,8 @@
for v in op.args[2:2+num_green_args]:
if isinstance(v, Variable) and v.concretetype is not lltype.Void:
kind = getkind(v.concretetype)
- ops.append(SpaceOperation('G_%s_guard_value' % kind,
+ ops.append(SpaceOperation('-live-', [v], None))
+ ops.append(SpaceOperation('%s_guard_value' % kind,
[v], None))
args = (self.make_three_lists(op.args[2:2+num_green_args]) +
self.make_three_lists(op.args[2+num_green_args:]))
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py Thu May 20 20:01:21 2010
@@ -43,8 +43,9 @@
if insn[0] == '-live-':
assert prevalive is not None
for x in insn[1:]:
- prevalive.discard(x)
- ssarepr.insns[i] = insn + tuple(prevalive)
+ if isinstance(x, Register):
+ prevalive.add(x)
+ ssarepr.insns[i] = insn[:1] + tuple(prevalive)
prevalive = None
continue
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 Thu May 20 20:01:21 2010
@@ -152,7 +152,6 @@
'uint_le': ('int_le', 'int_ge'),
'char_ne': 'int_ne',
'char_lt': ('int_lt', 'int_gt'),
- 'int_add_nonneg_ovf': 'G_int_add_ovf',
'uint_xor': 'int_xor',
'float_mul': 'float_mul',
'float_gt': ('float_gt', 'float_lt'),
@@ -174,6 +173,24 @@
assert op1.result == v3
assert op1.opname == name2[0]
+def test_symmetric_int_add_ovf():
+ v3 = varoftype(lltype.Signed)
+ for v1 in [varoftype(lltype.Signed), Constant(42, lltype.Signed)]:
+ for v2 in [varoftype(lltype.Signed), Constant(43, lltype.Signed)]:
+ op = SpaceOperation('int_add_nonneg_ovf', [v1, v2], v3)
+ oplist = Transformer(FakeCPU()).rewrite_operation(op)
+ op0, op1 = oplist
+ assert op0.opname == '-live-'
+ assert op0.args == [v1, v2]
+ assert op0.result is None
+ assert op1.opname == 'int_add_ovf'
+ if isinstance(v1, Constant) and isinstance(v2, Variable):
+ assert op1.args == [v2, v1]
+ assert op1.result == v3
+ else:
+ assert op1.args == [v1, v2]
+ assert op1.result == v3
+
def test_calls():
for RESTYPE in [lltype.Signed, rclass.OBJECTPTR,
lltype.Float, lltype.Void]:
@@ -208,9 +225,12 @@
def residual_call_test(argtypes, restype, expectedkind):
op = get_direct_call_op(argtypes, restype)
tr = Transformer(FakeCPU(), FakeResidualCallControl())
- op1 = tr.rewrite_operation(op)
+ oplist = tr.rewrite_operation(op)
+ op0, op1 = oplist
+ assert op0.opname == '-live-'
+ assert op0.args == []
reskind = getkind(restype)[0]
- assert op1.opname == 'G_residual_call_%s_%s' % (expectedkind, reskind)
+ assert op1.opname == 'residual_call_%s_%s' % (expectedkind, reskind)
assert op1.result == op.result
assert op1.args[0] == op.args[0]
assert op1.args[1] == 'calldescr'
@@ -227,9 +247,12 @@
op = get_direct_call_op(argtypes, restype)
tr = Transformer(FakeCPU(), FakeRegularCallControl())
tr.graph = 'someinitialgraph'
- op1 = tr.rewrite_operation(op)
+ oplist = tr.rewrite_operation(op)
+ op0, op1 = oplist
+ assert op0.opname == '-live-'
+ assert op0.args == []
reskind = getkind(restype)[0]
- assert op1.opname == 'G_inline_call_%s_%s' % (expectedkind, reskind)
+ assert op1.opname == 'inline_call_%s_%s' % (expectedkind, reskind)
assert op1.result == op.result
assert op1.args[0] == 'somejitcode'
assert len(op1.args) == 1 + len(expectedkind)
@@ -250,9 +273,12 @@
op.args.append(Constant(['somegraph1', 'somegraph2'], lltype.Void))
tr = Transformer(FakeCPU(), FakeResidualIndirectCallControl())
tr.graph = 'someinitialgraph'
- op1 = tr.rewrite_operation(op)
+ oplist = tr.rewrite_operation(op)
+ op0, op1 = oplist
+ assert op0.opname == '-live-'
+ assert op0.args == []
reskind = getkind(restype)[0]
- assert op1.opname == 'G_residual_call_%s_%s' % (expectedkind, reskind)
+ assert op1.opname == 'residual_call_%s_%s' % (expectedkind, reskind)
assert op1.result == op.result
assert op1.args[0] == op.args[0]
assert op1.args[1] == 'calldescr'
@@ -275,14 +301,18 @@
op.args.append(Constant(['somegraph1', 'somegraph2'], lltype.Void))
tr = Transformer(FakeCPU(), FakeRegularIndirectCallControl())
tr.graph = 'someinitialgraph'
- op1 = tr.rewrite_operation(op)
- assert type(op1) is list
- op0, op1 = op1
- assert op0.opname == 'G_int_guard_value'
- assert op0.args[0] == op.args[0]
- assert op0.result is None
+ oplist = tr.rewrite_operation(op)
+ op0gv, op1gv, op0, op1 = oplist
+ assert op0gv.opname == '-live-'
+ assert op0gv.args == [op.args[0]]
+ assert op1gv.opname == 'int_guard_value'
+ assert op1gv.args == [op.args[0]]
+ assert op1gv.result is None
+ #
+ assert op0.opname == '-live-'
+ assert op0.args == []
reskind = getkind(restype)[0]
- assert op1.opname == 'G_residual_call_%s_%s' % (expectedkind, reskind)
+ assert op1.opname == 'residual_call_%s_%s' % (expectedkind, reskind)
assert op1.result == op.result
assert op1.args[0] == op.args[0]
assert op1.args[1] == 'calldescr'
@@ -332,13 +362,13 @@
c_name = Constant('typeptr', lltype.Void)
v_result = varoftype(rclass.OBJECT.typeptr)
op = SpaceOperation('getfield', [v_parent, c_name], v_result)
- op1, op2 = Transformer(FakeCPU()).rewrite_operation(op)
- assert op1.opname == 'G_guard_class'
+ oplist = Transformer(FakeCPU()).rewrite_operation(op)
+ op0, op1 = oplist
+ assert op0.opname == '-live-'
+ assert op0.args == [v_parent]
+ assert op1.opname == 'guard_class'
assert op1.args == [v_parent]
assert op1.result == v_result
- assert op2.opname == 'keepalive'
- assert op2.args == [v_parent]
- assert op2.result == None
def test_setfield():
# XXX a more compact encoding would be possible; see test_getfield()
@@ -404,8 +434,11 @@
op = SpaceOperation('malloc', [Constant(S, lltype.Void),
Constant({'flavor': 'gc'}, lltype.Void)], v)
tr = Transformer(FakeCPU(), FakeResidualCallControl())
- op1 = tr.rewrite_operation(op)
- assert op1.opname == 'G_residual_call_r_r'
+ oplist = tr.rewrite_operation(op)
+ op0, op1 = oplist
+ assert op0.opname == '-live-'
+ assert op0.args == []
+ assert op1.opname == 'residual_call_r_r'
assert op1.args[0].value == 'alloc_with_del' # pseudo-function as a str
assert list(op1.args[2]) == []
@@ -581,13 +614,13 @@
[v1, Constant({'promote': True}, lltype.Void)],
v2)
oplist = Transformer().rewrite_operation(op)
- assert len(oplist) == 3
- assert oplist[0].opname == 'G_int_guard_value'
- assert oplist[0].args == [v1]
- assert oplist[0].result is None
- assert oplist[1].opname == 'keepalive'
- assert oplist[1].args == [v1]
- assert oplist[2] is None
+ op0, op1, op2 = oplist
+ assert op0.opname == '-live-'
+ assert op0.args == [v1]
+ assert op1.opname == 'int_guard_value'
+ assert op1.args == [v1]
+ assert op1.result is None
+ assert op2 is None
def test_promote_2():
v1 = varoftype(lltype.Signed)
@@ -602,9 +635,9 @@
block.closeblock(Link([v2], returnblock))
Transformer().optimize_block(block)
assert len(block.operations) == 2
- assert block.operations[0].opname == 'G_int_guard_value'
+ assert block.operations[0].opname == '-live-'
assert block.operations[0].args == [v1]
- assert block.operations[0].result is None
- assert block.operations[1].opname == 'keepalive'
+ assert block.operations[1].opname == 'int_guard_value'
assert block.operations[1].args == [v1]
+ assert block.operations[1].result is None
assert block.exits[0].args == [v1]
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py Thu May 20 20:01:21 2010
@@ -187,3 +187,14 @@
L2:
int_return %i3
""")
+
+ def test_already_some(self):
+ self.liveness_test("""
+ -live- %i0, $52, %i2, %i0
+ foo %i0, %i1, %i2
+ bar %i3, %i4, %i5
+ """, """
+ -live- %i0, %i2, %i3, %i4, %i5
+ foo %i0, %i1, %i2
+ bar %i3, %i4, %i5
+ """)
More information about the Pypy-commit
mailing list