Author: fijal
Branch: jit-leaner-frontend
Changeset: r82925:7fef527aef0b
Date: 2016-03-10 10:44 +0200
http://bitbucket.org/pypy/pypy/changeset/7fef527aef0b/
Log: use more hypothesis and fix the next problem
diff --git a/rpython/jit/metainterp/opencoder.py
b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -47,6 +47,7 @@
def get_size_jitcode_pc(self):
if self.save_pos >= 0:
self.pos = self.save_pos
+ self.save_pos = -1
size = self._next()
if size < 0:
self.save_pos = self.pos
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
@@ -1581,6 +1581,7 @@
effectinfo = descr.get_extra_info()
if effectinfo.oopspecindex == effectinfo.OS_NOT_IN_TRACE:
return self.metainterp.do_not_in_trace_call(allboxes, descr)
+ cut_pos = self.metainterp.history.get_trace_position()
if (assembler_call or
effectinfo.check_forces_virtual_or_virtualizable()):
@@ -1618,8 +1619,8 @@
self.metainterp.vrefs_after_residual_call()
vablebox = None
if assembler_call:
- vablebox, resbox = self.metainterp.direct_assembler_call(
- assembler_call_jd)
+ vablebox, resbox =
self.metainterp.direct_assembler_call(resbox,
+ assembler_call_jd, cut_pos)
if resbox and resbox.type != 'v':
self.make_result_of_lastop(resbox)
self.metainterp.vable_after_residual_call(funcbox)
@@ -3007,11 +3008,11 @@
newop.copy_value_from(op)
return newop
- def direct_assembler_call(self, targetjitdriver_sd):
+ def direct_assembler_call(self, op, targetjitdriver_sd, cut_pos):
""" Generate a direct call to assembler for portal entry point,
patching the CALL_MAY_FORCE that occurred just now.
"""
- op = self.history.operations.pop()
+ self.history.cut(cut_pos)
assert op.is_call_may_force()
num_green_args = targetjitdriver_sd.num_green_args
arglist = op.getarglist()
@@ -3021,8 +3022,9 @@
warmrunnerstate = targetjitdriver_sd.warmstate
token = warmrunnerstate.get_assembler_token(greenargs)
opnum = OpHelpers.call_assembler_for_descr(op.getdescr())
- op = op.copy_and_change(opnum, args=args, descr=token)
- self.history.operations.append(op)
+ oldop = op
+ op = self.history.record_nospec(opnum, args, descr=token)
+ op.copy_value_from(oldop)
if opnum == rop.CALL_ASSEMBLER_N:
op = None
#
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -200,14 +200,12 @@
class NumberingState(object):
def __init__(self, size):
self.liveboxes = {}
- self.current = [rffi.cast(rffi.SHORT, 0)] * (size + 2)
- self.position = 0
+ self.current = []
self.n = 0
self.v = 0
def append(self, item):
- self.current[self.position] = item
- self.position += 1
+ self.current.append(item)
class ResumeDataLoopMemo(object):
@@ -317,15 +315,13 @@
#self._number_boxes(topsnapshot.boxes, optimizer, state)
#assert state.position == special_boxes_size
- total = 2
while not snapshot_iter.done():
size, jitcode_index, pc = snapshot_iter.get_size_jitcode_pc()
- total += 2 + size
state.append(rffi.cast(rffi.SHORT, jitcode_index))
state.append(rffi.cast(rffi.SHORT, pc))
self._number_boxes(snapshot_iter, size, optimizer, state)
- numb = resumecode.create_numbering(state.current, total)
+ numb = resumecode.create_numbering(state.current)
return numb, state.liveboxes, state.v
def forget_numberings(self):
diff --git a/rpython/jit/metainterp/test/strategies.py
b/rpython/jit/metainterp/test/strategies.py
--- a/rpython/jit/metainterp/test/strategies.py
+++ b/rpython/jit/metainterp/test/strategies.py
@@ -12,27 +12,64 @@
boxlists = strategies.lists(boxes, min_size=1).flatmap(
lambda cis: strategies.lists(strategies.sampled_from(cis)))
+const_or_box = strategies.sampled_from(['const', 'box'])
+
+class JitCode(object):
+ def __init__(self, index):
+ self.index = index
+
+class Frame(object):
+ parent_resumedata_position = -1
+
+ def __init__(self, jitcode, pc, boxes):
+ self.jitcode = jitcode
+ self.pc = pc
+ self.boxes = boxes
+
+ def get_list_of_active_boxes(self, flag):
+ return self.boxes
+
+def get_arg(draw, all_ops, allow_const=True):
+ if allow_const:
+ tp = draw(const_or_box)
+ if tp == 'const':
+ return draw(intconsts)
+ return draw(strategies.sampled_from(all_ops))
+
+def gen_int_add(draw, all_ops, framestack):
+ arg0 = get_arg(draw, all_ops)
+ arg1 = get_arg(draw, all_ops)
+ res = ResOperation(rop.INT_ADD, [arg0, arg1])
+ all_ops.add(res)
+ return res
+
+def gen_guard_true(draw, all_ops, framestack):
+ arg = get_arg(draw, all_ops, allow_const=False)
+ res = ResOperation(rop.GUARD_TRUE, [arg])
+ if draw(strategies.booleans()):
+ s = []
+ for i in range(10):
+ s.append(get_arg(draw, all_ops, allow_const=False))
+ boxes = list(set(s))
+ framestack.append(Frame(JitCode(1), 2, boxes))
+ res.framestack = framestack[:]
+ return res
+
+resops = strategies.sampled_from([gen_int_add, gen_guard_true])
+
@strategies.composite
def lists_of_operations(draw, inputboxes=intboxes):
- def get(draw, l1, l2, index):
- if index < len(l1):
- return l1[index]
- index -= len(l1)
- if index >= len(l2):
- return draw(intconsts)
- return l2[index]
-
size = draw(strategies.integers(min_value=1, max_value=100))
inputargs = []
for i in range(size):
inputargs.append(draw(inputboxes))
size = draw(strategies.integers(min_value=1, max_value=100))
ops = []
+ all_ops = set(inputargs)
+ framestack = [Frame(JitCode(1), 2, [])]
for i in range(size):
- s = strategies.integers(min_value=0, max_value=len(inputargs) + 2 *
len(ops))
- arg0 = get(draw, inputargs, ops, draw(s))
- arg1 = get(draw, inputargs, ops, draw(s))
- ops.append(ResOperation(rop.INT_ADD, [arg0, arg1], -1))
+ opgen = draw(resops)
+ ops.append(opgen(draw, all_ops, framestack))
return inputargs, ops
if __name__ == '__main__':
diff --git a/rpython/jit/metainterp/test/test_opencoder.py
b/rpython/jit/metainterp/test/test_opencoder.py
--- a/rpython/jit/metainterp/test/test_opencoder.py
+++ b/rpython/jit/metainterp/test/test_opencoder.py
@@ -43,7 +43,17 @@
iter = t.get_iter()
l = []
while not iter.done():
- l.append(iter.next())
+ op = iter.next()
+ if op.is_guard():
+ op.framestack = []
+ si = iter.get_snapshot_iter(op.rd_resume_position)
+ while not si.done():
+ size, jitcode, pc = si.get_size_jitcode_pc()
+ boxes = []
+ for i in range(size):
+ boxes.append(si.next())
+ op.framestack.append(FakeFrame(JitCode(jitcode), pc,
boxes))
+ l.append(op)
return iter.inputargs, l, iter
def test_simple_iterator(self):
@@ -121,6 +131,10 @@
t = Trace(inputargs)
for op in ops:
newop = t.record_op(op.getopnum(), op.getarglist())
+ newop.orig_op = op
+ if newop.is_guard():
+ resume.capture_resumedata(op.framestack,
+ None, [], t)
op.position = newop.position
inpargs, l, iter = self.unpack(t)
loop1 = TreeLoop("loop1")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit