[pypy-commit] pypy jit-targets: use TargetToken to refere to a target
hakanardo
noreply at buildbot.pypy.org
Thu Nov 3 19:19:08 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-targets
Changeset: r48711:1860421891fe
Date: 2011-11-03 19:18 +0100
http://bitbucket.org/pypy/pypy/changeset/1860421891fe/
Log: use TargetToken to refere to a target
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -8,6 +8,7 @@
from pypy.objspace.flow.model import Variable, Constant
from pypy.annotation import model as annmodel
from pypy.jit.metainterp.history import REF, INT, FLOAT
+from pypy.jit.metainterp import history
from pypy.jit.codewriter import heaptracker
from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr, rffi
from pypy.rpython.ootypesystem import ootype
@@ -339,16 +340,20 @@
assert isinstance(type, str) and len(type) == 1
op.args.append(Descr(ofs, type, arg_types=arg_types))
-def compile_add_loop_token(loop, descr, clt):
+def compile_add_loop_token(loop, descr):
if we_are_translated():
raise ValueError("CALL_ASSEMBLER not supported")
loop = _from_opaque(loop)
op = loop.operations[-1]
op.descr = weakref.ref(descr)
- if op.opnum == rop.TARGET:
- descr.compiled_loop_token = clt
- descr.target_opindex = len(loop.operations)
- descr.target_arguments = op.args
+
+def compile_add_target_token(loop, descr):
+ compiled_version = loop
+ loop = _from_opaque(loop)
+ op = loop.operations[-1]
+ descr.compiled_version = compiled_version
+ descr.target_opindex = len(loop.operations)
+ descr.target_arguments = op.args
def compile_add_var(loop, intvar):
loop = _from_opaque(loop)
@@ -384,11 +389,19 @@
_variables.append(v)
return r
-def compile_add_jump_target(loop, loop_target, target_opindex, target_inputargs):
+def compile_add_jump_target(loop, targettoken):
loop = _from_opaque(loop)
- loop_target = _from_opaque(loop_target)
- if not target_inputargs:
+ if isinstance(targettoken, history.LoopToken):
+ loop_target = _from_opaque(targettoken.compiled_loop_token.compiled_version)
+ target_opindex = 0
target_inputargs = loop_target.inputargs
+ elif isinstance(targettoken, history.TargetToken):
+ loop_target = _from_opaque(targettoken.compiled_version)
+ target_opindex = targettoken.target_opindex
+ target_inputargs = targettoken.target_arguments
+ else:
+ assert False
+
op = loop.operations[-1]
op.jump_target = loop_target
op.jump_target_opindex = target_opindex
diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -136,7 +136,7 @@
clt = original_loop_token.compiled_loop_token
clt.loop_and_bridges.append(c)
clt.compiling_a_bridge()
- self._compile_loop_or_bridge(c, inputargs, operations, clt)
+ self._compile_loop_or_bridge(c, inputargs, operations)
old, oldindex = faildescr._compiled_fail
llimpl.compile_redirect_fail(old, oldindex, c)
@@ -151,16 +151,14 @@
clt.loop_and_bridges = [c]
clt.compiled_version = c
looptoken.compiled_loop_token = clt
- looptoken.target_opindex = 0
- looptoken.target_arguments = None
- self._compile_loop_or_bridge(c, inputargs, operations, clt)
+ self._compile_loop_or_bridge(c, inputargs, operations)
def free_loop_and_bridges(self, compiled_loop_token):
for c in compiled_loop_token.loop_and_bridges:
llimpl.mark_as_free(c)
model.AbstractCPU.free_loop_and_bridges(self, compiled_loop_token)
- def _compile_loop_or_bridge(self, c, inputargs, operations, clt):
+ def _compile_loop_or_bridge(self, c, inputargs, operations):
var2index = {}
for box in inputargs:
if isinstance(box, history.BoxInt):
@@ -172,10 +170,10 @@
var2index[box] = llimpl.compile_start_float_var(c)
else:
raise Exception("box is: %r" % (box,))
- self._compile_operations(c, operations, var2index, clt)
+ self._compile_operations(c, operations, var2index)
return c
- def _compile_operations(self, c, operations, var2index, clt):
+ def _compile_operations(self, c, operations, var2index):
for op in operations:
llimpl.compile_add(c, op.getopnum())
descr = op.getdescr()
@@ -184,7 +182,9 @@
descr.arg_types)
if isinstance(descr, history.LoopToken):
if op.getopnum() != rop.JUMP:
- llimpl.compile_add_loop_token(c, descr, clt)
+ llimpl.compile_add_loop_token(c, descr)
+ if isinstance(descr, history.TargetToken) and op.getopnum() == rop.TARGET:
+ llimpl.compile_add_target_token(c, descr)
if self.is_oo and isinstance(descr, (OODescr, MethDescr)):
# hack hack, not rpython
c._obj.externalobj.operations[-1].setdescr(descr)
@@ -238,10 +238,7 @@
assert op.is_final()
if op.getopnum() == rop.JUMP:
targettoken = op.getdescr()
- assert isinstance(targettoken, history.LoopToken)
- compiled_version = targettoken.compiled_loop_token.compiled_version
- opindex = targettoken.target_opindex
- llimpl.compile_add_jump_target(c, compiled_version, opindex, targettoken.target_arguments)
+ llimpl.compile_add_jump_target(c, targettoken)
elif op.getopnum() == rop.FINISH:
faildescr = op.getdescr()
index = self.get_fail_descr_number(faildescr)
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -3,7 +3,7 @@
AbstractDescr,
BasicFailDescr,
BoxInt, Box, BoxPtr,
- LoopToken,
+ LoopToken, TargetToken,
ConstInt, ConstPtr,
BoxObj,
ConstObj, BoxFloat, ConstFloat)
@@ -2971,7 +2971,7 @@
i2 = BoxInt()
i3 = BoxInt()
looptoken = LoopToken()
- targettoken = LoopToken()
+ targettoken = TargetToken()
faildescr = BasicFailDescr(2)
operations = [
ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -765,6 +765,9 @@
def dump(self):
self.compiled_loop_token.cpu.dump_loop_token(self)
+class TargetToken(AbstractDescr):
+ pass
+
class TreeLoop(object):
inputargs = None
operations = None
More information about the pypy-commit
mailing list