Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68855:8e03695f39ba
Date: 2014-01-18 15:41 +0100
http://bitbucket.org/pypy/pypy/changeset/8e03695f39ba/
Log: Refactor the world again - we don't try hard to store stuff on
inputframes, instead we reconstruct stuff when making a bridge
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -2,7 +2,7 @@
from rpython.jit.backend import model
from rpython.jit.backend.llgraph import support
from rpython.jit.resume.backend import ResumeBuilder,\
- LivenessAnalyzer, compute_vars_longevity, flatten
+ LivenessAnalyzer, compute_vars_longevity
from rpython.jit.metainterp.history import AbstractDescr
from rpython.jit.metainterp.history import Const, getkind
from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID
@@ -30,12 +30,13 @@
self.start_pos = start_pos
class LLGraphResumeBuilder(ResumeBuilder):
- def __init__(self, frontend_liveness, descr, inputframes, inputlocs):
+ def __init__(self, frontend_liveness, descr, inputargs, inputlocs):
self.liveness = LivenessAnalyzer()
self.numbering = {}
self.framestack = []
locs = None
start_pos = 0
+ xxx
if inputlocs is not None:
locs = []
for frame_pos, frame in enumerate(inputframes):
@@ -101,7 +102,7 @@
has_been_freed = False
invalid = False
- def __init__(self, inputframes, operations, descr, locs=None):
+ def __init__(self, inputargs, operations, descr, locs=None):
# We need to clone the list of operations because the
# front-end will mutate them under our feet again. We also
# need to make sure things get freed.
@@ -114,13 +115,13 @@
newbox = _cache[box] = box.__class__()
return newbox
#
- self.inputargs = map(mapping, flatten(inputframes))
+ self.inputargs = map(mapping, inputargs)
self.operations = []
- x = compute_vars_longevity(inputframes, operations, descr)
+ x = compute_vars_longevity(inputargs, operations, descr)
longevity, last_real_usage, frontend_liveness = x
resumebuilder = LLGraphResumeBuilder(frontend_liveness, descr,
- inputframes, locs)
+ inputargs, locs)
for op in operations:
if op.is_resume():
resumebuilder.process(op)
@@ -295,11 +296,11 @@
clt._llgraph_alltraces = [lltrace]
self._record_labels(lltrace)
- def compile_bridge(self, logger, faildescr, inputframes, locs, operations,
+ def compile_bridge(self, logger, faildescr, inputargs, locs, operations,
original_loop_token, log=True):
clt = original_loop_token.compiled_loop_token
clt.compiling_a_bridge()
- lltrace = LLTrace(inputframes, operations, faildescr, locs)
+ lltrace = LLTrace(inputargs, operations, faildescr, locs)
faildescr._llgraph_bridge = lltrace
clt._llgraph_alltraces.append(lltrace)
self._record_labels(lltrace)
diff --git a/rpython/jit/backend/llsupport/assembler.py
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -110,7 +110,7 @@
self._debug = v
return r
- def rebuild_faillocs_from_descr(self, descr, inputframes, loc_positions):
+ def rebuild_faillocs_from_descr(self, descr, inputargs, loc_positions):
locs = []
GPR_REGS = len(self.cpu.gen_regs)
XMM_REGS = len(self.cpu.float_regs)
@@ -118,27 +118,23 @@
coeff = 1
else:
coeff = 2
- all = {}
- for i, frame in enumerate(inputframes):
- inputlocs = loc_positions[i]
- assert len(inputlocs) == len(frame)
- for j, item in enumerate(frame):
- if item is None or isinstance(item, Const) or item in all:
- continue
- all[item] = None
- pos = inputlocs[j]
- if pos < GPR_REGS:
- locs.append(self.cpu.gen_regs[pos])
- elif pos < (GPR_REGS + XMM_REGS * coeff):
- pos = (pos - GPR_REGS) // coeff
- locs.append(self.cpu.float_regs[pos])
- else:
- stack_pos = pos - self.cpu.JITFRAME_FIXED_SIZE
- assert stack_pos >= 0
- tp = item.type
- locs.append(self.new_stack_loc(stack_pos,
- pos * WORD, tp))
- return locs[:]
+ assert len(inputargs) == len(loc_positions)
+ locs = [None] * len(inputargs)
+ for i in range(len(inputargs)):
+ pos = loc_positions[i]
+ item = inputargs[i]
+ if pos < GPR_REGS:
+ locs[i] = self.cpu.gen_regs[pos]
+ elif pos < (GPR_REGS + XMM_REGS * coeff):
+ pos = (pos - GPR_REGS) // coeff
+ locs[i] = self.cpu.float_regs[pos]
+ else:
+ stack_pos = pos - self.cpu.JITFRAME_FIXED_SIZE
+ assert stack_pos >= 0
+ tp = item.type
+ locs[i] = self.new_stack_loc(stack_pos,
+ pos * WORD, tp)
+ return locs
def store_info_on_descr(self, startspos, guardtok, resume_bytecode):
withfloats = guardtok.has_floats
diff --git a/rpython/jit/backend/test/runner_test.py
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -258,7 +258,7 @@
staticdata = MockStaticData([jitcode], [])
locs = rebuild_locs_from_resumedata(faildescr1, staticdata)
- self.cpu.compile_bridge(None, faildescr1, [[i1b]], locs, bridge,
looptoken)
+ self.cpu.compile_bridge(None, faildescr1, [i1b], locs, bridge,
looptoken)
deadframe = self.cpu.execute_token(looptoken, 2)
fail = self.cpu.get_latest_descr(deadframe)
@@ -299,6 +299,10 @@
i3 = BoxInt()
staticdata = MockStaticData([jitcode], [])
bridge = [
+ ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None,
+ descr=jitcode),
+ ResOperation(rop.RESUME_PUT, [i1b, ConstInt(0), ConstInt(1)],
+ None),
ResOperation(rop.INT_LE, [i1b, ConstInt(19)], i3),
ResOperation(rop.RESUME_PUT, [i3, ConstInt(0), ConstInt(2)],
None),
@@ -307,14 +311,14 @@
]
locs = rebuild_locs_from_resumedata(faildescr1, staticdata)
- self.cpu.compile_bridge(None, faildescr1, [[None, i1b, None]],
+ self.cpu.compile_bridge(None, faildescr1, [i1b],
locs, bridge, looptoken)
deadframe = self.cpu.execute_token(looptoken, 2)
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 2
locs = rebuild_locs_from_resumedata(fail, staticdata)
- res = self.cpu.get_int_value(deadframe, locs[0][1])
+ res = self.cpu.get_int_value(deadframe, locs[0])
assert res == 20
def test_compile_big_bridge_out_of_small_loop(self):
@@ -337,6 +341,8 @@
staticdata.alljitcodes.append(jitcode1)
i1list = [BoxInt() for i in range(150)]
bridge = [
+ ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None, descr=jitcode),
+ ResOperation(rop.RESUME_PUT, [i0, ConstInt(0), ConstInt(0)], None),
ResOperation(rop.ENTER_FRAME, [ConstInt(13)], None, descr=jitcode1)
]
iprev = i0
@@ -351,14 +357,14 @@
descr=BasicFinalDescr(4)))
faillocs = rebuild_locs_from_resumedata(faildescr1, staticdata)
- self.cpu.compile_bridge(None, faildescr1, [[i0]], faillocs, bridge,
looptoken)
+ self.cpu.compile_bridge(None, faildescr1, [i0], faillocs, bridge,
looptoken)
deadframe = self.cpu.execute_token(looptoken, 1)
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
assert fail.identifier == 3
for i in range(len(i1list)):
- res = self.cpu.get_int_value(deadframe, locs[1][i])
+ res = self.cpu.get_int_value(deadframe, locs[i + 1])
assert res == 2 + i
def test_finish(self):
@@ -455,8 +461,8 @@
deadframe = self.cpu.execute_token(looptoken, 0, 10)
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 0
- assert self.cpu.get_int_value(deadframe, locs[0][1]) == 55
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 0
+ assert self.cpu.get_int_value(deadframe, locs[1]) == 55
def test_int_operations(self):
from rpython.jit.metainterp.test.test_executor import get_int_tests
@@ -526,7 +532,7 @@
fail = self.cpu.get_latest_descr(deadframe)
if (z == boom) ^ reversed:
locs = rebuild_locs_from_resumedata(fail, staticdata)
- pos = locs[0][0]
+ pos = locs[0]
assert fail.identifier == 1
else:
pos = 0
@@ -1303,10 +1309,10 @@
assert fail.identifier == 42
#
for k in range(intboxes):
- got = self.cpu.get_int_value(deadframe, locs[0][k])
+ got = self.cpu.get_int_value(deadframe, locs[k])
assert got == expvalues[k]
for k in range(floatboxes):
- got = self.cpu.get_float_value(deadframe, locs[0][k +
intboxes])
+ got = self.cpu.get_float_value(deadframe, locs[k + intboxes])
assert got == expvalues[k + intboxes]
def test_jump(self):
@@ -1433,13 +1439,13 @@
else:
refvals.append(val)
for i, val in enumerate(intvals):
- got = self.cpu.get_int_value(deadframe, locs[0][i])
+ got = self.cpu.get_int_value(deadframe, locs[i])
assert got == val
for i, val in enumerate(refvals):
- got = self.cpu.get_ref_value(deadframe, locs[0][i +
len(intvals)])
+ got = self.cpu.get_ref_value(deadframe, locs[i + len(intvals)])
assert got == val
for i, val in enumerate(floatvals):
- got = self.cpu.get_float_value(deadframe, locs[0][
+ got = self.cpu.get_float_value(deadframe, locs[
i + len(intvals) +
len(refvals)])
assert got == val
@@ -1478,7 +1484,7 @@
ResOperation(rop.JUMP, [f3]+fboxes2[1:], None, descr=targettoken),
]
- self.cpu.compile_bridge(None, faildescr1, [fboxes2],
+ self.cpu.compile_bridge(None, faildescr1, fboxes2,
rebuild_locs_from_resumedata(faildescr1,
staticdata),
bridge, looptoken)
@@ -1490,11 +1496,11 @@
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 2
locs = rebuild_locs_from_resumedata(fail, staticdata)
- res = self.cpu.get_float_value(deadframe, locs[0][0])
+ res = self.cpu.get_float_value(deadframe, locs[0])
assert longlong.getrealfloat(res) == 8.5
for i in range(1, len(fboxes)):
got = longlong.getrealfloat(self.cpu.get_float_value(
- deadframe, locs[0][i]))
+ deadframe, locs[i]))
assert got == 13.5 + 6.73 * i
def test_compile_bridge_spilled_float(self):
@@ -1526,9 +1532,9 @@
fail = self.cpu.get_latest_descr(deadframe)
assert loop.operations[-3].getdescr() is fail is faildescr1
locs = rebuild_locs_from_resumedata(fail, staticdata)
- f1 = self.cpu.get_float_value(deadframe, locs[0][0])
- f2 = self.cpu.get_float_value(deadframe, locs[0][1])
- f3 = self.cpu.get_float_value(deadframe, locs[0][2])
+ f1 = self.cpu.get_float_value(deadframe, locs[0])
+ f2 = self.cpu.get_float_value(deadframe, locs[1])
+ f3 = self.cpu.get_float_value(deadframe, locs[2])
assert longlong.getrealfloat(f1) == 132.25
assert longlong.getrealfloat(f2) == 0.75
assert longlong.getrealfloat(f3) == 133.0
@@ -1537,12 +1543,19 @@
faildescr3 = BasicFailDescr(103)
zero = BoxInt()
bridgeops = [
+ ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None, descr=jitcode),
+ ResOperation(rop.RESUME_PUT, [fboxes[0], ConstInt(0), ConstInt(0)],
+ None),
+ ResOperation(rop.RESUME_PUT, [fboxes[1], ConstInt(0), ConstInt(1)],
+ None),
+ ResOperation(rop.RESUME_PUT, [fboxes[2], ConstInt(0), ConstInt(2)],
+ None),
ResOperation(rop.SAME_AS, [ConstInt(0)], zero),
ResOperation(rop.GUARD_TRUE, [zero], None, descr=faildescr3),
ResOperation(rop.LEAVE_FRAME, [], None),
ResOperation(rop.FINISH, [], None, descr=faildescr2),
]
- self.cpu.compile_bridge(None, faildescr1, [fboxes],
+ self.cpu.compile_bridge(None, faildescr1, fboxes,
locs, bridgeops, looptoken)
args = [1,
longlong.getfloatstorage(132.25),
@@ -1551,9 +1564,9 @@
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 103
locs = rebuild_locs_from_resumedata(fail, staticdata)
- f1 = self.cpu.get_float_value(deadframe, locs[0][0])
- f2 = self.cpu.get_float_value(deadframe, locs[0][1])
- f3 = self.cpu.get_float_value(deadframe, locs[0][2])
+ f1 = self.cpu.get_float_value(deadframe, locs[0])
+ f2 = self.cpu.get_float_value(deadframe, locs[1])
+ f3 = self.cpu.get_float_value(deadframe, locs[2])
assert longlong.getrealfloat(f1) == 132.25
assert longlong.getrealfloat(f2) == 0.75
assert longlong.getrealfloat(f3) == 133.0
@@ -2187,7 +2200,7 @@
assert not excvalue
deadframe = self.cpu.execute_token(looptoken, 0)
locs = rebuild_locs_from_resumedata(faildescr, staticdata)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 1
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 1
excvalue = self.cpu.grab_exc_value(deadframe)
assert not excvalue
@@ -2206,7 +2219,7 @@
looptoken = JitCellToken()
self.cpu.compile_loop(None, loop.inputargs, loop.operations, looptoken)
deadframe = self.cpu.execute_token(looptoken, 1)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 1
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 1
excvalue = self.cpu.grab_exc_value(deadframe)
assert excvalue == yptr
@@ -2227,11 +2240,11 @@
self.cpu.compile_loop(None, loop.inputargs, loop.operations, looptoken)
deadframe = self.cpu.execute_token(looptoken, 1)
locs = rebuild_locs_from_resumedata(faildescr, staticdata)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 1
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 1
excvalue = self.cpu.grab_exc_value(deadframe)
assert excvalue == xptr
deadframe = self.cpu.execute_token(looptoken, 0)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 0
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 0
excvalue = self.cpu.grab_exc_value(deadframe)
assert not excvalue
@@ -2427,15 +2440,15 @@
assert not called
locs = rebuild_locs_from_resumedata(faildescr, staticdata)
for j in range(5):
- assert self.cpu.get_int_value(frame, locs[0][j]) == j
- assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[0][6])) == 1.2
- assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[0][7])) == 3.4
+ assert self.cpu.get_int_value(frame, locs[j]) == j
+ assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[6])) == 1.2
+ assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[7])) == 3.4
frame = self.cpu.execute_token(looptoken, 1, 1, 1, 2, 3, 4, 5, f1,
f2)
assert called == [tuple(range(1, i + 1))]
for j in range(4):
- assert self.cpu.get_int_value(frame, locs[0][j + 1]) == j + 1
- assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[0][6])) == 1.2
- assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[0][7])) == 3.4
+ assert self.cpu.get_int_value(frame, locs[j + 1]) == j + 1
+ assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[6])) == 1.2
+ assert longlong.getrealfloat(self.cpu.get_float_value(frame,
locs[7])) == 3.4
def test_force_operations_returning_void(self):
values = []
@@ -2445,8 +2458,8 @@
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
values.append(fail)
- values.append(self.cpu.get_int_value(deadframe, locs[0][0]))
- values.append(self.cpu.get_int_value(deadframe, locs[0][1]))
+ values.append(self.cpu.get_int_value(deadframe, locs[0]))
+ values.append(self.cpu.get_int_value(deadframe, locs[1]))
self.cpu.set_savedata_ref(deadframe, random_gcref)
FUNC = self.FuncType([llmemory.GCREF, lltype.Signed], lltype.Void)
@@ -2482,8 +2495,8 @@
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 1
locs = rebuild_locs_from_resumedata(fail, staticdata)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 1
- assert self.cpu.get_int_value(deadframe, locs[0][1]) == 10
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 1
+ assert self.cpu.get_int_value(deadframe, locs[1]) == 10
assert values == [faildescr, 1, 10]
assert self.cpu.get_savedata_ref(deadframe) # not NULL
assert self.cpu.get_savedata_ref(deadframe) == random_gcref
@@ -2495,8 +2508,8 @@
deadframe = self.cpu.force(token)
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
- values.append(self.cpu.get_int_value(deadframe, locs[0][0]))
- values.append(self.cpu.get_int_value(deadframe, locs[0][2]))
+ values.append(self.cpu.get_int_value(deadframe, locs[0]))
+ values.append(self.cpu.get_int_value(deadframe, locs[2]))
self.cpu.set_savedata_ref(deadframe, random_gcref)
return 42
@@ -2535,9 +2548,9 @@
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 1
locs = rebuild_locs_from_resumedata(fail, staticdata)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 1
- assert self.cpu.get_int_value(deadframe, locs[0][1]) == 42
- assert self.cpu.get_int_value(deadframe, locs[0][2]) == 10
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 1
+ assert self.cpu.get_int_value(deadframe, locs[1]) == 42
+ assert self.cpu.get_int_value(deadframe, locs[2]) == 10
assert values == [1, 10]
assert self.cpu.get_savedata_ref(deadframe) == random_gcref
@@ -2550,8 +2563,8 @@
deadframe = self.cpu.force(token)
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
- values.append(self.cpu.get_int_value(deadframe, locs[0][0]))
- values.append(self.cpu.get_int_value(deadframe, locs[0][1]))
+ values.append(self.cpu.get_int_value(deadframe, locs[0]))
+ values.append(self.cpu.get_int_value(deadframe, locs[1]))
self.cpu.set_savedata_ref(deadframe, random_gcref)
return 42.5
@@ -2591,10 +2604,10 @@
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 1
locs = rebuild_locs_from_resumedata(fail, staticdata)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 1
- x = self.cpu.get_float_value(deadframe, locs[0][2])
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 1
+ x = self.cpu.get_float_value(deadframe, locs[2])
assert longlong.getrealfloat(x) == 42.5
- assert self.cpu.get_int_value(deadframe, locs[0][1]) == 10
+ assert self.cpu.get_int_value(deadframe, locs[1]) == 10
assert values == [1, 10]
assert self.cpu.get_savedata_ref(deadframe) == random_gcref
@@ -2987,7 +3000,7 @@
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
assert fail is faildescr
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 9
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 9
print 'step 2 ok'
print '-'*79
@@ -2998,7 +3011,7 @@
ResOperation(rop.GUARD_NOT_INVALIDATED, [],None, descr=faildescr2),
ResOperation(rop.FINISH, [i2], None, descr=BasicFinalDescr(3))
]
- self.cpu.compile_bridge(None, faildescr, [[i2]], locs, ops, looptoken)
+ self.cpu.compile_bridge(None, faildescr, [i2], locs, ops, looptoken)
deadframe = self.cpu.execute_token(looptoken, -42, 9)
fail = self.cpu.get_latest_descr(deadframe)
@@ -3038,7 +3051,7 @@
ops2 = [
ResOperation(rop.JUMP, [ConstInt(333)], None, descr=labeldescr),
]
- self.cpu.compile_bridge(None, faildescr, [[]], [[]], ops2, looptoken)
+ self.cpu.compile_bridge(None, faildescr, [], [], ops2, looptoken)
# run: must not be caught in an infinite loop
deadframe = self.cpu.execute_token(looptoken, 16)
fail = self.cpu.get_latest_descr(deadframe)
@@ -3908,7 +3921,7 @@
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
assert fail.identifier == 2
- res = self.cpu.get_int_value(deadframe, locs[0][0])
+ res = self.cpu.get_int_value(deadframe, locs[0])
assert res == 10
inputargs2 = [i0]
@@ -3916,13 +3929,13 @@
ResOperation(rop.INT_SUB, [i0, ConstInt(20)], i2),
ResOperation(rop.JUMP, [i2], None, descr=targettoken2),
]
- self.cpu.compile_bridge(None, faildescr, [inputargs2], locs,
operations2, looptoken)
+ self.cpu.compile_bridge(None, faildescr, inputargs2, locs,
operations2, looptoken)
deadframe = self.cpu.execute_token(looptoken, 2)
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
assert fail.identifier == 3
- res = self.cpu.get_int_value(deadframe, locs[0][0])
+ res = self.cpu.get_int_value(deadframe, locs[0])
assert res == -10
def test_int_force_ge_zero(self):
@@ -3968,7 +3981,7 @@
self.cpu.assembler.set_debug(False)
info = self.cpu.compile_loop(None, loop.inputargs, loop.operations,
looptoken)
locs = rebuild_locs_from_resumedata(faildescr, staticdata)
- bridge_info = self.cpu.compile_bridge(None, faildescr,
[bridge.inputargs],
+ bridge_info = self.cpu.compile_bridge(None, faildescr,
bridge.inputargs,
locs, bridge.operations,
looptoken)
self.cpu.assembler.set_debug(True) # always on untranslated
@@ -4069,7 +4082,7 @@
ResOperation(rop.JUMP, [i19], None, descr=targettoken1),
]
locs = rebuild_locs_from_resumedata(faildescr1, staticdata)
- self.cpu.compile_bridge(None, faildescr1, [inputargs], locs,
operations2, looptoken1)
+ self.cpu.compile_bridge(None, faildescr1, inputargs, locs,
operations2, looptoken1)
looptoken2 = JitCellToken()
inputargs = [BoxInt()]
@@ -4096,7 +4109,7 @@
operations = [
ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(99))
]
- self.cpu.compile_bridge(None, faildescr, [[]], [[]], operations,
looptoken)
+ self.cpu.compile_bridge(None, faildescr, [], [], operations, looptoken)
deadframe = self.cpu.execute_token(looptoken, null_box.getref_base())
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 99
@@ -4297,7 +4310,7 @@
deadframe = self.cpu.force(token)
fail = self.cpu.get_latest_descr(deadframe)
locs = rebuild_locs_from_resumedata(fail, staticdata)
- values.append(self.cpu.get_int_value(deadframe, locs[0][0]))
+ values.append(self.cpu.get_int_value(deadframe, locs[0]))
return 42
FUNC = self.FuncType([llmemory.GCREF, lltype.Signed], lltype.Signed)
@@ -4326,7 +4339,7 @@
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 23
locs = rebuild_locs_from_resumedata(fail, staticdata)
- assert self.cpu.get_int_value(deadframe, locs[0][0]) == 42
+ assert self.cpu.get_int_value(deadframe, locs[0]) == 42
# make sure that force reads the registers from a zeroed piece of
# memory
assert values[0] == 0
@@ -4341,6 +4354,10 @@
bridge = parse("""
[i1, i2, px]
+ enter_frame(-1, descr=jitcode)
+ resume_put(i1, 0, 0)
+ resume_put(i2, 0, 1)
+ resume_put(px, 0, 2)
i3 = int_add(i1, i2)
i4 = int_add(i1, i3)
i5 = int_add(i1, i4)
@@ -4372,9 +4389,9 @@
finish(i1, descr=finaldescr)
""", namespace={'finaldescr': finaldescr, 'calldescr2': calldescr2,
'guarddescr': guarddescr, 'func2_ptr': func2_ptr,
- 'jitcode2': jitcode2})
+ 'jitcode2': jitcode2, 'jitcode': jitcode})
locs = rebuild_locs_from_resumedata(faildescr, staticdata)
- self.cpu.compile_bridge(None, faildescr, [bridge.inputargs], locs,
+ self.cpu.compile_bridge(None, faildescr, bridge.inputargs, locs,
bridge.operations, looptoken)
cpu = self.cpu
@@ -4424,7 +4441,7 @@
frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, frame)
assert len(frame.jf_frame) == frame.jf_frame_info.jfi_frame_depth
locs = rebuild_locs_from_resumedata(guarddescr, staticdata)
- ref = self.cpu.get_ref_value(frame, locs[0][2])
+ ref = self.cpu.get_ref_value(frame, locs[2])
token = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, ref)
assert token != frame
token = token.resolve()
@@ -4440,6 +4457,9 @@
def raising():
bridge = parse("""
[i1, i2]
+ enter_frame(-1, descr=jitcode)
+ resume_put(i1, 0, 0)
+ resume_put(i2, 0, 1)
enter_frame(1, descr=jitcode2)
px = guard_exception(ConstClass(xtp), descr=faildescr2)
i3 = int_add(i1, i2)
@@ -4471,9 +4491,10 @@
""", namespace={'finaldescr': BasicFinalDescr(42),
'faildescr2': BasicFailDescr(1),
'xtp': xtp, 'jitcode2': jitcode2,
+ 'jitcode': jitcode,
})
locs = rebuild_locs_from_resumedata(faildescr, staticdata)
- self.cpu.compile_bridge(None, faildescr, [bridge.inputargs], locs,
+ self.cpu.compile_bridge(None, faildescr, bridge.inputargs, locs,
bridge.operations, looptoken)
raise LLException(xtp, xptr)
diff --git a/rpython/jit/backend/x86/assembler.py
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -5,7 +5,6 @@
from rpython.jit.backend.llsupport.assembler import (GuardToken, BaseAssembler,
debug_bridge)
from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
-from rpython.jit.resume.backend import flatten
from rpython.jit.metainterp.history import Const, Box, VOID
from rpython.jit.metainterp.history import AbstractFailDescr, INT, REF, FLOAT
from rpython.rtyper.lltypesystem import lltype, rffi, rstr, llmemory
@@ -475,7 +474,7 @@
self.update_frame_depth(frame_depth_no_fixed_size +
JITFRAME_FIXED_SIZE)
#
size_excluding_failure_stuff = self.mc.get_relative_pos()
- self.resume_bytecode = regalloc.resumebuilder.finish(None, 0,
looptoken)
+ self.resume_bytecode = regalloc.resumebuilder.finish(looptoken)
self.write_pending_failure_recoveries()
full_size = self.mc.get_relative_pos()
#
@@ -513,7 +512,7 @@
return AsmInfo(ops_offset, rawstart + looppos,
size_excluding_failure_stuff - looppos)
- def assemble_bridge(self, logger, faildescr, inputframes,
backend_positions,
+ def assemble_bridge(self, logger, faildescr, inputargs, backend_positions,
operations, original_loop_token, log):
self.setup(original_loop_token)
@@ -522,12 +521,11 @@
operations = self._inject_debugging_code(faildescr, operations,
'b', descr_number)
- arglocs = self.rebuild_faillocs_from_descr(faildescr, inputframes,
+ arglocs = self.rebuild_faillocs_from_descr(faildescr, inputargs,
backend_positions)
- inputargs = flatten(inputframes)
regalloc = RegAlloc(self, self.cpu.translate_support_code)
startpos = self.mc.get_relative_pos()
- operations = regalloc.prepare_bridge(inputframes, arglocs,
+ operations = regalloc.prepare_bridge(inputargs, arglocs,
operations,
self.current_clt.allgcrefs,
self.current_clt.frame_info,
@@ -536,7 +534,7 @@
frame_depth_no_fixed_size = self._assemble(regalloc, inputargs,
operations)
codeendpos = self.mc.get_relative_pos()
self.resume_bytecode = regalloc.resumebuilder.finish(
- faildescr.rd_resume_bytecode, faildescr.rd_bytecode_position,
original_loop_token)
+ original_loop_token)
self.write_pending_failure_recoveries()
fullsize = self.mc.get_relative_pos()
#
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -8,7 +8,7 @@
unpack_arraydescr, unpack_fielddescr, unpack_interiorfielddescr)
from rpython.jit.backend.llsupport.gcmap import allocate_gcmap
from rpython.jit.resume.backend import ResumeBuilder,\
- compute_vars_longevity, flatten
+ compute_vars_longevity
from rpython.jit.backend.llsupport.regalloc import (FrameManager, BaseRegalloc,
RegisterManager, TempBox, is_comparison_or_ovf_op)
from rpython.jit.backend.x86 import rx86
@@ -133,17 +133,16 @@
self.jump_target_descr = None
self.final_jump_op = None
- def _prepare(self, inputframes, operations, allgcrefs, descr=None,
+ def _prepare(self, inputargs, operations, allgcrefs, descr=None,
locs=None):
cpu = self.assembler.cpu
self.fm = X86FrameManager(cpu.get_baseofs_of_frame_field())
operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations,
allgcrefs)
# compute longevity of variables
- x = compute_vars_longevity(inputframes, operations, descr)
+ x = compute_vars_longevity(inputargs, operations, descr)
longevity, last_real_usage, frontend_liveness = x
- self.resumebuilder = ResumeBuilder(self, frontend_liveness, descr,
- inputframes, locs)
+ self.resumebuilder = ResumeBuilder(self, frontend_liveness, descr)
self.longevity = longevity
self.last_real_usage = last_real_usage
self.rm = gpr_reg_mgr_cls(self.longevity,
@@ -154,7 +153,7 @@
return operations
def prepare_loop(self, inputargs, operations, looptoken, allgcrefs):
- operations = self._prepare([inputargs], operations, allgcrefs)
+ operations = self._prepare(inputargs, operations, allgcrefs)
self._set_initial_bindings(inputargs, looptoken)
# note: we need to make a copy of inputargs because possibly_free_vars
# is also used on op args, which is a non-resizable list
@@ -165,11 +164,11 @@
self.min_bytes_before_label = 13
return operations
- def prepare_bridge(self, inputframes, arglocs, operations, allgcrefs,
+ def prepare_bridge(self, inputargs, arglocs, operations, allgcrefs,
frame_info, descr):
- operations = self._prepare(inputframes, operations, allgcrefs, descr,
+ operations = self._prepare(inputargs, operations, allgcrefs, descr,
locs=arglocs)
- self._update_bindings(arglocs, inputframes)
+ self._update_bindings(arglocs, inputargs)
self.min_bytes_before_label = 0
return operations
@@ -233,11 +232,10 @@
else:
return self.xrm.make_sure_var_in_reg(var, forbidden_vars)
- def _update_bindings(self, locs, inputframes):
+ def _update_bindings(self, locs, inputargs):
# XXX this should probably go to llsupport/regalloc.py
used = {}
i = 0
- inputargs = flatten(inputframes)
assert len(inputargs) == len(locs)
for loc in locs:
if loc is None: # xxx bit kludgy
diff --git a/rpython/jit/backend/x86/test/test_runner.py
b/rpython/jit/backend/x86/test/test_runner.py
--- a/rpython/jit/backend/x86/test/test_runner.py
+++ b/rpython/jit/backend/x86/test/test_runner.py
@@ -301,7 +301,7 @@
pos = 0
else:
locs = rebuild_locs_from_resumedata(descr, staticdata)
- pos = locs[0][0]
+ pos = locs[0]
result = self.cpu.get_int_value(deadframe, pos)
if guard == rop.GUARD_FALSE:
assert result == execute(self.cpu, None,
@@ -359,7 +359,7 @@
pos = 0
else:
locs = rebuild_locs_from_resumedata(descr, staticdata)
- pos = locs[0][0]
+ pos = locs[0]
result = self.cpu.get_int_value(deadframe, pos)
expected = execute(self.cpu, None, op, None, a, b).value
if guard == rop.GUARD_FALSE:
diff --git a/rpython/jit/metainterp/compile.py
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -15,7 +15,7 @@
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.inliner import Inliner
from rpython.jit.codewriter import heaptracker, longlong
-from rpython.jit.resume.backend import flatten
+
def giveup():
from rpython.jit.metainterp.pyjitpl import SwitchToBlackhole
@@ -300,13 +300,13 @@
inputargs, operations, looptoken,
log=log, name=name)
-def do_compile_bridge(metainterp_sd, faildescr, inputframes,
+def do_compile_bridge(metainterp_sd, faildescr, inputargs,
inputlocs, operations, original_loop_token, log=True):
- metainterp_sd.logger_ops.log_bridge(flatten(inputframes), operations,
+ metainterp_sd.logger_ops.log_bridge(inputargs, operations,
"compiling")
assert isinstance(faildescr, AbstractFailDescr)
return metainterp_sd.cpu.compile_bridge(metainterp_sd.logger_ops,
- faildescr, inputframes,
+ faildescr, inputargs,
inputlocs, operations,
original_loop_token, log=log)
@@ -364,11 +364,11 @@
if metainterp_sd.warmrunnerdesc is not None: # for tests
metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(original_jitcell_token)
-def send_bridge_to_backend(jitdriver_sd, metainterp_sd, faildescr, inputframes,
+def send_bridge_to_backend(jitdriver_sd, metainterp_sd, faildescr, inputargs,
inputlocs, operations, original_loop_token):
if not we_are_translated():
show_procedures(metainterp_sd)
- seen = dict.fromkeys(flatten(inputframes))
+ seen = dict.fromkeys(inputargs)
TreeLoop.check_consistency_of_branch(operations, seen)
if metainterp_sd.warmrunnerdesc is not None:
hooks = metainterp_sd.warmrunnerdesc.hooks
@@ -400,7 +400,7 @@
ops_offset = asminfo.ops_offset
else:
ops_offset = None
- metainterp_sd.logger_ops.log_bridge(flatten(inputframes), operations,
+ metainterp_sd.logger_ops.log_bridge(inputargs, operations,
None, faildescr, ops_offset)
#
#if metainterp_sd.warmrunnerdesc is not None: # for tests
diff --git a/rpython/jit/metainterp/history.py
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -615,7 +615,6 @@
return 'TargetToken(%d)' % compute_unique_id(self)
class TreeLoop(object):
- inputframes = None
inputargs = None
inputlocs = None
operations = None
@@ -657,7 +656,7 @@
return self.operations
def get_display_text(self): # for graphpage.py
- return self.name + '\n' + repr(self.inputframes)
+ return self.name + '\n' + repr(self.inputargs)
def show(self, errmsg=None):
"NOT_RPYTHON"
@@ -666,7 +665,7 @@
def check_consistency(self): # for testing
"NOT_RPYTHON"
- self.check_consistency_of(self.inputframes, self.operations)
+ self.check_consistency_of(self.inputargs, self.operations)
for op in self.operations:
descr = op.getdescr()
if op.getopnum() == rop.LABEL and isinstance(descr, TargetToken):
@@ -719,7 +718,7 @@
def dump(self):
# RPython-friendly
- print '%r: inputargs =' % self, self._dump_args(self.inputframes)
+ print '%r: inputargs =' % self, self._dump_args(self.inputargs)
for op in self.operations:
args = op.getarglist()
print '\t', op.getopname(), self._dump_args(args), \
@@ -753,7 +752,7 @@
class History(object):
def __init__(self):
- self.inputframes = None
+ self.inputargs = None
self.inputlocs = None
self.operations = []
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1978,7 +1978,7 @@
num_green_args = self.jitdriver_sd.num_green_args
original_greenkey = original_boxes[:num_green_args]
self.resumekey = compile.ResumeFromInterpDescr(original_greenkey)
- self.history.inputframes = [original_boxes[num_green_args:]]
+ self.history.inputargs = original_boxes[num_green_args:][:]
self.seen_loop_header_for_jdindex = -1
try:
self.interpret()
@@ -2121,7 +2121,7 @@
return ints[:], refs[:], floats[:]
def raise_continue_running_normally(self, live_arg_boxes, loop_token):
- self.history.inputframes = None
+ self.history.inputargs = None
self.history.inputlocs = None
self.history.operations = None
# For simplicity, we just raise ContinueRunningNormally here and
@@ -2359,7 +2359,7 @@
self.portal_call_depth = -1 # always one portal around
self.history = history.History()
state = self.rebuild_state_after_failure(resumedescr, deadframe)
- self.history.inputframes, self.history.inputlocs = state
+ self.history.inputargs, self.history.inputlocs = state
self.resumerecorder = ResumeRecorder(self, True)
finally:
rstack._stack_criticalcode_stop()
diff --git a/rpython/jit/resume/backend.py b/rpython/jit/resume/backend.py
--- a/rpython/jit/resume/backend.py
+++ b/rpython/jit/resume/backend.py
@@ -7,15 +7,11 @@
class LivenessAnalyzer(object):
- def __init__(self, inputframes=None):
+ def __init__(self):
self.liveness = {}
self.frame_starts = [0]
self.framestack = []
self.deps = {}
- if inputframes is not None:
- for frame in inputframes:
- self.frame_starts.append(self.frame_starts[-1] + len(frame))
- self.framestack.append(frame[:])
def enter_frame(self, pc, jitcode):
self.frame_starts.append(self.frame_starts[-1] + jitcode.num_regs())
@@ -93,28 +89,13 @@
raise Exception("should not be called")
class ResumeBuilder(object):
- def __init__(self, regalloc, frontend_liveness, descr, inputframes=None,
- inputlocs=None):
+ def __init__(self, regalloc, frontend_liveness, descr):
self.regalloc = regalloc
self.current_attachment = {}
self.frontend_liveness = frontend_liveness
self.frontend_pos = {}
self.virtuals = {}
self.builder = ResumeBytecodeBuilder()
- if inputlocs is not None:
- i = 0
- all = {}
- for frame_pos, frame in enumerate(inputframes):
- for pos_in_frame, box in enumerate(frame):
- if box is None or isinstance(box, Const) or box in all:
- loc_pos = -1
- else:
- loc_pos = inputlocs[i].get_jitframe_position()
- i += 1
- self.frontend_pos[box] = (frame_pos, pos_in_frame)
- all[box] = None
- if box not in self.current_attachment:
- self.current_attachment[box] = loc_pos
def get_box_pos(self, box):
if box in self.virtuals:
@@ -189,34 +170,11 @@
self._mark_visited(v, loc)
return self.builder.getpos()
- def finish(self, parent, parent_position, clt):
- return ResumeBytecode(self.builder.build(), self.builder.consts,
- parent, parent_position,
- clt)
+ def finish(self, clt):
+ return ResumeBytecode(self.builder.build(), self.builder.consts, clt)
-def flatten(inputframes):
- count = 0
- all = {}
- for frame in inputframes:
- for x in frame:
- if x is not None and x not in all:
- assert not isinstance(x, Const)
- count += 1
- all[x] = None
- inputargs = [None] * count
- pos = 0
- all = {}
- for frame in inputframes:
- for item in frame:
- if item is not None and item not in all:
- inputargs[pos] = item
- all[item] = None
- pos += 1
- return inputargs
-
-
-def compute_vars_longevity(inputframes, operations, descr=None):
+def compute_vars_longevity(inputargs, operations, descr=None):
# compute a dictionary that maps variables to index in
# operations that is a "last-time-seen"
@@ -228,12 +186,7 @@
last_used = {}
last_real_usage = {}
frontend_alive = {}
- if descr is None:
- inputargs = inputframes[0]
- liveness_analyzer = LivenessAnalyzer()
- else:
- inputargs = flatten(inputframes)
- liveness_analyzer = LivenessAnalyzer(inputframes)
+ liveness_analyzer = LivenessAnalyzer()
start_pos = 0
for position, op in enumerate(operations):
if op.is_guard():
diff --git a/rpython/jit/resume/optimizer.py b/rpython/jit/resume/optimizer.py
--- a/rpython/jit/resume/optimizer.py
+++ b/rpython/jit/resume/optimizer.py
@@ -6,23 +6,16 @@
class ResumeFrame(object):
def __init__(self, pc, jitcode, no=-1):
self.pc = pc
- if jitcode is None:
- assert no >= 0
- self.values = [None] * no
- else:
- assert isinstance(jitcode, JitCode)
- self.jitcode = jitcode
- self.values = [None] * jitcode.num_regs()
+ assert isinstance(jitcode, JitCode)
+ self.jitcode = jitcode
+ self.values = [None] * jitcode.num_regs()
class OptResumeBuilder(object):
- def __init__(self, opt, inpframes=None):
+ def __init__(self, opt):
self.framestack = []
self.last_flushed_pos = 0
self.opt = opt
self.virtuals = {}
- if inpframes is not None:
- for frame in inpframes:
- self.framestack.append(ResumeFrame(0, None, len(frame)))
def enter_frame(self, pc, jitcode):
self.framestack.append(ResumeFrame(pc, jitcode))
diff --git a/rpython/jit/resume/reader.py b/rpython/jit/resume/reader.py
--- a/rpython/jit/resume/reader.py
+++ b/rpython/jit/resume/reader.py
@@ -68,8 +68,6 @@
def _rebuild_until(self, rb, position):
self.consts = rb.consts
- if rb.parent is not None:
- self._rebuild_until(rb.parent, rb.parent_position)
self.interpret_until(rb, position)
def read(self, pos):
diff --git a/rpython/jit/resume/rescode.py b/rpython/jit/resume/rescode.py
--- a/rpython/jit/resume/rescode.py
+++ b/rpython/jit/resume/rescode.py
@@ -14,12 +14,9 @@
CLEAR_POSITION = 0xffff
class ResumeBytecode(object):
- def __init__(self, opcodes, consts, parent=None, parent_position=-1,
- loop=None):
+ def __init__(self, opcodes, consts, loop=None):
self.opcodes = opcodes
- self.parent = parent
self.consts = consts
- self.parent_position = parent_position
self.loop = loop
def dump(self, staticdata, resume_pos):
diff --git a/rpython/jit/resume/test/test_backend.py
b/rpython/jit/resume/test/test_backend.py
--- a/rpython/jit/resume/test/test_backend.py
+++ b/rpython/jit/resume/test/test_backend.py
@@ -146,15 +146,22 @@
bridge = parse("""
[i0]
+ enter_frame(-1, descr=jitcode)
+ resume_put(i0, 0, 0)
force_spill(i0)
guard_false(i0)
- """)
+ """, namespace={'jitcode': jitcode})
staticdata = MockStaticData([jitcode], [])
locs = rebuild_locs_from_resumedata(descr, staticdata)
- self.cpu.compile_bridge(None, descr, [bridge.inputargs], locs,
+ self.cpu.compile_bridge(None, descr, bridge.inputargs, locs,
bridge.operations, looptoken)
descr = bridge.operations[-1].getdescr()
res = descr.rd_resume_bytecode.dump(staticdata,
descr.rd_bytecode_position)
- assert res == "resume_put (3, 28) 0 0"
+ exp = preparse("""
+ enter_frame -1 name
+ resume_put (3, 1) 0 0
+ resume_put (3, 28) 0 0
+ """)
+ assert res == exp
diff --git a/rpython/jit/resume/test/test_frontend.py
b/rpython/jit/resume/test/test_frontend.py
--- a/rpython/jit/resume/test/test_frontend.py
+++ b/rpython/jit/resume/test/test_frontend.py
@@ -5,7 +5,7 @@
ConstInt
from rpython.jit.resume.frontend import rebuild_from_resumedata
from rpython.jit.resume.rescode import ResumeBytecode, TAGBOX,\
- ResumeBytecodeBuilder, TAGCONST, TAGSMALLINT, TAGVIRTUAL
+ ResumeBytecodeBuilder, TAGCONST, TAGSMALLINT, TAGVIRTUAL, CLEAR_POSITION
from rpython.jit.resume.reader import AbstractResumeReader
from rpython.jit.resume.test.support import MockStaticData
from rpython.jit.metainterp.resoperation import rop
@@ -77,13 +77,18 @@
return index + 3
class RebuildingResumeReader(AbstractResumeReader):
- def unpack(self, r):
- tag, index = self.decode(r)
- assert tag == TAGBOX
- return index
-
def finish(self):
- return [[self.unpack(r) for r in f.registers] for f in self.framestack]
+ res = []
+ all = {}
+ for f in self.framestack:
+ for reg in f.registers:
+ if reg == CLEAR_POSITION:
+ continue
+ tag, index = self.decode(reg)
+ if tag == TAGBOX and index not in all:
+ all[index] = None # no duplicates
+ res.append(index)
+ return res
def rebuild_locs_from_resumedata(faildescr, staticdata):
return RebuildingResumeReader(staticdata).rebuild(faildescr)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit