[pypy-svn] r68014 - in pypy/branch/kill-jumptarget/pypy/jit: backend/llgraph backend/test metainterp metainterp/test
arigo at codespeak.net
arigo at codespeak.net
Wed Sep 30 11:35:26 CEST 2009
Author: arigo
Date: Wed Sep 30 11:35:25 2009
New Revision: 68014
Modified:
pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py
pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py
pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py
pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py
pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py
Log:
Start the refactoring.
Modified: pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py Wed Sep 30 11:35:25 2009
@@ -104,17 +104,22 @@
llimpl.set_class_size(self.memo_cast, vtable, size)
def compile_bridge(self, faildescr, inputargs, operations):
- c = self.compile_loop(inputargs, operations)
+ c = llimpl.compile_start()
+ self._compile_loop_or_bridge(c, inputargs, operations)
old, oldindex = faildescr._compiled_fail
llimpl.compile_redirect_fail(old, oldindex, c)
- def compile_loop(self, inputargs, operations):
+ def compile_loop(self, inputargs, operations, loopdescr):
"""In a real assembler backend, this should assemble the given
list of operations. Here we just generate a similar CompiledLoop
instance. The code here is RPython, whereas the code in llimpl
is not.
"""
c = llimpl.compile_start()
+ loopdescr._llgraph_compiled_version = c
+ self._compile_loop_or_bridge(c, inputargs, operations)
+
+ def _compile_loop_or_bridge(self, c, inputargs, operations):
var2index = {}
for box in inputargs:
if isinstance(box, history.BoxInt):
@@ -174,12 +179,10 @@
op = operations[-1]
assert op.is_final()
if op.opnum == rop.JUMP:
- target = op.jump_target
- if target is None:
- target = c
- else:
- target = target.executable_token
- llimpl.compile_add_jump_target(c, target)
+ targettoken = op.descr
+ assert isinstance(targettoken, history.LoopToken)
+ compiled_version = targettoken._llgraph_compiled_version
+ llimpl.compile_add_jump_target(c, compiled_version)
elif op.opnum == rop.FINISH:
llimpl.compile_add_fail(c, len(self.fail_descrs))
faildescr = op.descr
@@ -188,10 +191,11 @@
else:
assert False, "unknown operation"
- def execute_token(self, compiled_version):
+ def execute_token(self, loop_token):
"""Calls the assembler generated for the given loop.
Returns the ResOperation that failed, of type rop.FAIL.
"""
+ compiled_version = loop_token._llgraph_compiled_version
frame = llimpl.new_frame(self.memo_cast, self.is_oo)
# setup the frame
llimpl.frame_clear(frame, compiled_version)
Modified: pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py (original)
+++ pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py Wed Sep 30 11:35:25 2009
@@ -24,7 +24,8 @@
result_type,
valueboxes,
descr)
- executable_token = self.cpu.compile_loop(inputargs, operations)
+ looptoken = LoopToken()
+ self.cpu.compile_loop(inputargs, operations, looptoken)
j = 0
for box in valueboxes:
if isinstance(box, BoxInt):
@@ -38,7 +39,7 @@
j += 1
else:
assert isinstance(box, Const)
- res = self.cpu.execute_token(executable_token)
+ res = self.cpu.execute_token(looptoken)
if res is operations[-1].descr:
self.guard_failed = False
else:
@@ -96,9 +97,10 @@
ResOperation(rop.FINISH, [i1], None, descr=faildescr)
]
inputargs = [i0]
- executable_token = self.cpu.compile_loop(inputargs, operations)
+ looptoken = LoopToken()
+ self.cpu.compile_loop(inputargs, operations, looptoken)
self.cpu.set_future_value_int(0, 2)
- fail = self.cpu.execute_token(executable_token)
+ fail = self.cpu.execute_token(looptoken)
res = self.cpu.get_latest_value_int(0)
assert res == 3
assert fail is faildescr
@@ -108,19 +110,19 @@
i1 = BoxInt()
i2 = BoxInt()
faildescr = BasicFailDescr()
+ looptoken = LoopToken()
operations = [
ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr),
- ResOperation(rop.JUMP, [i1], None),
+ ResOperation(rop.JUMP, [i1], None, descr=looptoken),
]
inputargs = [i0]
operations[2].fail_args = [i1]
- operations[-1].jump_target = None
- executable_token = self.cpu.compile_loop(inputargs, operations)
+ self.cpu.compile_loop(inputargs, operations, looptoken)
self.cpu.set_future_value_int(0, 2)
- fail = self.cpu.execute_token(executable_token)
+ fail = self.cpu.execute_token(looptoken)
assert fail is faildescr
res = self.cpu.get_latest_value_int(0)
assert res == 10
@@ -131,19 +133,19 @@
i0 = BoxInt()
i1 = BoxInt()
i2 = BoxInt()
- faildescr = BasicFailDescr()
+ faildescr = BasicFailDescr()
+ looptoken = LoopToken()
operations = [
ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr),
- ResOperation(rop.JUMP, [i1], None),
+ ResOperation(rop.JUMP, [i1], None, descr=looptoken),
]
inputargs = [i0]
operations[2].fail_args = [i1]
- operations[-1].jump_target = None
wr_i1 = weakref.ref(i1)
wr_guard = weakref.ref(operations[2])
- executable_token = self.cpu.compile_loop(inputargs, operations)
+ self.cpu.compile_loop(inputargs, operations, looptoken)
del i0, i1, i2
del inputargs
del operations
@@ -156,33 +158,30 @@
i2 = BoxInt()
faildescr1 = BasicFailDescr()
faildescr2 = BasicFailDescr()
+ looptoken = LoopToken()
operations = [
ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr1),
- ResOperation(rop.JUMP, [i1], None),
+ ResOperation(rop.JUMP, [i1], None, descr=looptoken),
]
inputargs = [i0]
operations[2].fail_args = [i1]
- operations[-1].jump_target = None
- executable_token = self.cpu.compile_loop(inputargs, operations)
- loop_token = LoopToken()
- loop_token.executable_token = executable_token
+ self.cpu.compile_loop(inputargs, operations, looptoken)
i1b = BoxInt()
i3 = BoxInt()
bridge = [
ResOperation(rop.INT_LE, [i1b, ConstInt(19)], i3),
ResOperation(rop.GUARD_TRUE, [i3], None, descr=faildescr2),
- ResOperation(rop.JUMP, [i1b], None),
+ ResOperation(rop.JUMP, [i1b], None, descr=looptoken),
]
bridge[1].fail_args = [i1b]
- bridge[-1].jump_target = loop_token
self.cpu.compile_bridge(faildescr1, [i1b], bridge)
self.cpu.set_future_value_int(0, 2)
- fail = self.cpu.execute_token(executable_token)
+ fail = self.cpu.execute_token(looptoken)
assert fail is faildescr2
res = self.cpu.get_latest_value_int(0)
assert res == 20
@@ -193,30 +192,33 @@
def __setattr__(self, name, value):
py.test.fail("finish descrs should not be touched")
faildescr = UntouchableFailDescr() # to check that is not touched
+ looptoken = LoopToken()
operations = [
ResOperation(rop.FINISH, [i0], None, descr=faildescr)
]
- executable_token = self.cpu.compile_loop([i0], operations)
+ self.cpu.compile_loop([i0], operations, looptoken)
self.cpu.set_future_value_int(0, 99)
- fail = self.cpu.execute_token(executable_token)
+ fail = self.cpu.execute_token(looptoken)
assert fail is faildescr
res = self.cpu.get_latest_value_int(0)
assert res == 99
+ looptoken = LoopToken()
operations = [
ResOperation(rop.FINISH, [ConstInt(42)], None, descr=faildescr)
]
- executable_token = self.cpu.compile_loop([], operations)
- fail = self.cpu.execute_token(executable_token)
+ self.cpu.compile_loop([], operations, looptoken)
+ fail = self.cpu.execute_token(looptoken)
assert fail is faildescr
res = self.cpu.get_latest_value_int(0)
assert res == 42
+ looptoken = LoopToken()
operations = [
ResOperation(rop.FINISH, [], None, descr=faildescr)
]
- executable_token = self.cpu.compile_loop([], operations)
- fail = self.cpu.execute_token(executable_token)
+ self.cpu.compile_loop([], operations, looptoken)
+ fail = self.cpu.execute_token(looptoken)
assert fail is faildescr
def test_do_call(self):
@@ -406,13 +408,14 @@
]
ops[1].fail_args = [v_res]
#
- executable_token = self.cpu.compile_loop([v1, v2], ops)
+ looptoken = LoopToken()
+ self.cpu.compile_loop([v1, v2], ops, looptoken)
for x, y, z in testcases:
assert not self.cpu.get_exception()
assert not self.cpu.get_exc_value()
self.cpu.set_future_value_int(0, x)
self.cpu.set_future_value_int(1, y)
- fail = self.cpu.execute_token(executable_token)
+ fail = self.cpu.execute_token(looptoken)
if (z == boom) ^ reversed:
assert fail is ops[1].descr
else:
@@ -1045,15 +1048,14 @@
exc_tp = xtp
exc_ptr = xptr
loop = parse(ops, self.cpu, namespace=locals())
- executable_token = self.cpu.compile_loop(loop.inputargs,
- loop.operations)
+ self.cpu.compile_loop(loop.inputargs, loop.operations, loop.token)
self.cpu.set_future_value_int(0, 1)
- self.cpu.execute_token(executable_token)
+ self.cpu.execute_token(loop.token)
assert self.cpu.get_latest_value_int(0) == 0
assert self.cpu.get_latest_value_ref(1) == xptr
self.cpu.clear_exception()
self.cpu.set_future_value_int(0, 0)
- self.cpu.execute_token(executable_token)
+ self.cpu.execute_token(loop.token)
assert self.cpu.get_latest_value_int(0) == 1
self.cpu.clear_exception()
@@ -1069,10 +1071,9 @@
exc_tp = ytp
exc_ptr = yptr
loop = parse(ops, self.cpu, namespace=locals())
- executable_token = self.cpu.compile_loop(loop.inputargs,
- loop.operations)
+ self.cpu.compile_loop(loop.inputargs, loop.operations, loop.token)
self.cpu.set_future_value_int(0, 1)
- self.cpu.execute_token(executable_token)
+ self.cpu.execute_token(loop.token)
assert self.cpu.get_latest_value_int(0) == 1
self.cpu.clear_exception()
@@ -1086,14 +1087,13 @@
finish(0)
'''
loop = parse(ops, self.cpu, namespace=locals())
- executable_token = self.cpu.compile_loop(loop.inputargs,
- loop.operations)
+ self.cpu.compile_loop(loop.inputargs, loop.operations, loop.token)
self.cpu.set_future_value_int(0, 1)
- self.cpu.execute_token(executable_token)
+ self.cpu.execute_token(loop.token)
assert self.cpu.get_latest_value_int(0) == 1
self.cpu.clear_exception()
self.cpu.set_future_value_int(0, 0)
- self.cpu.execute_token(executable_token)
+ self.cpu.execute_token(loop.token)
assert self.cpu.get_latest_value_int(0) == 0
self.cpu.clear_exception()
Modified: pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py (original)
+++ pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py Wed Sep 30 11:35:25 2009
@@ -644,16 +644,18 @@
# of operations. Each branch ends in a jump which can go either to
# the top of the same loop, or to another TreeLoop; or it ends in a FINISH.
-class Base(object):
- """Common base class for TreeLoop and History."""
-
-class LoopToken(object):
- """loop token"""
+class LoopToken(AbstractDescr):
+ """Used for rop.JUMP, giving the target of the jump.
+ This is different from TreeLoop: the TreeLoop class contains the
+ whole loop, including 'operations', and goes away after the loop
+ was compiled; but the LoopDescr remains alive and points to the
+ generated assembler.
+ """
terminating = False # see TerminatingLoopToken in compile.py
# specnodes
# executable_token
-class TreeLoop(Base):
+class TreeLoop(object):
inputargs = None
specnodes = None
operations = None
@@ -764,7 +766,7 @@
# ____________________________________________________________
-class History(Base):
+class History(object):
def __init__(self, cpu):
self.cpu = cpu
self.inputargs = None
Modified: pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py (original)
+++ pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py Wed Sep 30 11:35:25 2009
@@ -5,16 +5,13 @@
"""The central ResOperation class, representing one operation."""
# for 'jump': points to the target loop;
- jump_target = None
+ jump_target = property(lambda x: crash, lambda x, y: crash) # XXX temp
# for 'guard_*'
suboperations = property(lambda x: crash, lambda x, y: crash) # XXX temp
optimized = property(lambda x: crash, lambda x, y: crash) # XXX temp
fail_args = None
- # for x86 backend and guards
- inputargs = None
-
# debug
name = ""
pc = 0
Modified: pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py (original)
+++ pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py Wed Sep 30 11:35:25 2009
@@ -4,7 +4,7 @@
"""
from pypy.jit.metainterp.history import TreeLoop, BoxInt, ConstInt,\
- ConstAddr, ConstObj, ConstPtr, Box, BasicFailDescr
+ ConstAddr, ConstObj, ConstPtr, Box, BasicFailDescr, LoopToken
from pypy.jit.metainterp.resoperation import rop, ResOperation
from pypy.jit.metainterp.typesystem import llhelper
from pypy.rpython.lltypesystem import lltype, llmemory
@@ -49,15 +49,14 @@
class OpParser(object):
- def __init__(self, descr, cpu, namespace, type_system, boxkinds, jump_target, invent_fail_descr=default_fail_descr):
+ def __init__(self, descr, cpu, namespace, type_system, boxkinds,
+ invent_fail_descr=default_fail_descr):
self.descr = descr
self.vars = {}
self.cpu = cpu
self.consts = namespace
self.type_system = type_system
self.boxkinds = boxkinds or {}
- self.jumps = []
- self.jump_target = jump_target
self._cache = namespace.setdefault('_CACHE_', {})
self.invent_fail_descr = invent_fail_descr
@@ -208,7 +207,7 @@
res = ResOperation(opnum, args, None, descr)
res.fail_args = fail_args
if opnum == rop.JUMP:
- self.jumps.append(res)
+ assert res.descr is not None
return res
def parse_next_op(self, line):
@@ -240,12 +239,7 @@
if num < len(newlines):
raise ParseError("unexpected dedent at line: %s" % newlines[num])
loop = ExtendedTreeLoop("loop")
- if len(self.jumps) > 1:
- raise ParseError("Multiple jumps??")
- if self.jump_target is not None and len(self.jumps) != 1:
- raise ParseError("A jump is expected if a jump_target is given")
- for jump in self.jumps:
- jump.jump_target = self.jump_target
+ loop.token = LoopToken()
loop.operations = ops
loop.inputargs = inpargs
return loop
@@ -276,11 +270,10 @@
return base_indent, inpargs
def parse(descr, cpu=None, namespace=None, type_system='lltype',
- boxkinds=None, jump_target=None,
- invent_fail_descr=default_fail_descr):
+ boxkinds=None, invent_fail_descr=default_fail_descr):
if namespace is None:
namespace = {}
- return OpParser(descr, cpu, namespace, type_system, boxkinds, jump_target,
+ return OpParser(descr, cpu, namespace, type_system, boxkinds,
invent_fail_descr).parse()
def pure_parse(*args, **kwds):
More information about the Pypy-commit
mailing list