Author: fijal
Branch: jit-leaner-frontend
Changeset: r83051:18ea5495a9de
Date: 2016-03-14 21:02 +0200
http://bitbucket.org/pypy/pypy/changeset/18ea5495a9de/
Log: try a much simpler implementation for resop in the frontend (ideally
dying completely)
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
@@ -672,12 +672,13 @@
self.trace = Trace(inpargs)
self.inputargs = inpargs
if self._cache:
- xxx
# hack to record the ops *after* we know our inputargs
for op in self._cache:
newop = self.trace.record_op(op.getopnum(), op.getarglist(),
op.getdescr())
op.position = newop.position
+ if op.type != 'v':
+ newop.copy_value_from(op)
self._cache = None
def length(self):
@@ -692,29 +693,38 @@
def any_operation(self):
return self.trace._count > 0
+ @specialize.argtype(2)
+ def set_op_value(self, op, value):
+ if value is None:
+ return
+ elif isinstance(value, bool):
+ op.setint(int(value))
+ elif lltype.typeOf(value) == lltype.Signed:
+ op.setint(value)
+ elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
+ op.setfloatstorage(value)
+ else:
+ assert lltype.typeOf(value) == llmemory.GCREF
+ op.setref_base(value)
+
@specialize.argtype(3)
def record(self, opnum, argboxes, value, descr=None):
if self.trace is None:
- xxx
op = ResOperation(opnum, argboxes, -1, descr)
self._cache.append(op)
else:
pos = self.trace._record_op(opnum, argboxes, descr)
- if value is None:
- op = FrontendOp(pos)
- elif isinstance(value, bool):
- op = IntFrontendOp(pos)
- op.setint(int(value))
- elif lltype.typeOf(value) == lltype.Signed:
- op = IntFrontendOp(pos)
- op.setint(value)
- elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
- op = FloatFrontendOp(pos)
- op.setfloatstorage(value)
- else:
- op = RefFrontendOp(pos)
- assert lltype.typeOf(value) == llmemory.GCREF
- op.setref_base(value)
+ if value is None:
+ op = FrontendOp(pos)
+ elif isinstance(value, bool):
+ op = IntFrontendOp(pos)
+ elif lltype.typeOf(value) == lltype.Signed:
+ op = IntFrontendOp(pos)
+ elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
+ op = FloatFrontendOp(pos)
+ else:
+ op = RefFrontendOp(pos)
+ self.set_op_value(op, value)
return op
def record_nospec(self, opnum, argboxes, descr=None):
@@ -772,13 +782,14 @@
enter_count = 0
aborted_count = 0
- def __init__(self):
+ def __init__(self, metainterp_sd):
self.loops = []
self.locations = []
self.aborted_keys = []
self.invalidated_token_numbers = set() # <- not RPython
self.jitcell_token_wrefs = []
self.jitcell_dicts = [] # <- not RPython
+ self.metainterp_sd = metainterp_sd
def clear(self):
del self.loops[:]
@@ -834,7 +845,7 @@
def check_history(self, expected=None, **check):
insns = {}
- t = self.history.trace.get_iter()
+ t = self.history.trace.get_iter(self.metainterp_sd)
while not t.done():
op = t.next()
opname = op.getopname()
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
@@ -1527,7 +1527,8 @@
op = self.metainterp.execute_and_record_varargs(opnum, argboxes,
descr=descr)
if pure and not self.metainterp.last_exc_value and op:
- op = self.metainterp.record_result_of_call_pure(op, patch_pos)
+ op = self.metainterp.record_result_of_call_pure(op, argboxes,
descr,
+ patch_pos)
exc = exc and not isinstance(op, Const)
if exc:
if op is not None:
@@ -1620,7 +1621,7 @@
vablebox = None
if assembler_call:
vablebox, resbox = self.metainterp.direct_assembler_call(
- self.metainterp._last_op, assembler_call_jd, cut_pos)
+ self.metainterp._last_op, allboxes, descr,
assembler_call_jd, cut_pos)
if resbox and resbox.type != 'v':
self.make_result_of_lastop(resbox)
self.metainterp.vable_after_residual_call(funcbox)
@@ -2063,12 +2064,11 @@
lltype.nullptr(llmemory.GCREF.TO))
else:
guard_op = self.history.record(opnum, moreargs, None)
- assert isinstance(guard_op, GuardResOp)
self.capture_resumedata(resumepc)
# ^^^ records extra to history
self.staticdata.profiler.count_ops(opnum, Counters.GUARDS)
# count
- self.attach_debug_info(guard_op)
+ #self.attach_debug_info(guard_op)
return guard_op
def capture_resumedata(self, resumepc=-1):
@@ -2997,14 +2997,12 @@
debug_stop("jit-abort-longest-function")
return max_jdsd, max_key
- def record_result_of_call_pure(self, op, patch_pos):
+ def record_result_of_call_pure(self, op, argboxes, descr, patch_pos):
""" Patch a CALL into a CALL_PURE.
"""
- opnum = op.getopnum()
- assert opnum in [rop.CALL_R, rop.CALL_N, rop.CALL_I, rop.CALL_F]
resbox_as_const = executor.constant_from_op(op)
- for i in range(op.numargs()):
- if not isinstance(op.getarg(i), Const):
+ for argbox in argboxes:
+ if not isinstance(argbox, Const):
break
else:
# all-constants: remove the CALL operation now and propagate a
@@ -3013,28 +3011,26 @@
return resbox_as_const
# not all constants (so far): turn CALL into CALL_PURE, which might
# be either removed later by optimizeopt or turned back into CALL.
- arg_consts = [executor.constant_from_op(a) for a in op.getarglist()]
+ arg_consts = [executor.constant_from_op(a) for a in argboxes]
self.call_pure_results[arg_consts] = resbox_as_const
- opnum = OpHelpers.call_pure_for_descr(op.getdescr())
+ opnum = OpHelpers.call_pure_for_descr(descr)
self.history.cut(patch_pos)
- newop = self.history.record_nospec(opnum, op.getarglist(),
op.getdescr())
+ newop = self.history.record_nospec(opnum, argboxes, descr)
newop.copy_value_from(op)
return newop
- def direct_assembler_call(self, op, targetjitdriver_sd, cut_pos):
+ def direct_assembler_call(self, op, arglist, descr, targetjitdriver_sd,
cut_pos):
""" Generate a direct call to assembler for portal entry point,
patching the CALL_MAY_FORCE that occurred just now.
"""
self.history.cut(cut_pos)
- assert rop.is_call_may_force(op.getopnum())
num_green_args = targetjitdriver_sd.num_green_args
- arglist = op.getarglist()
greenargs = arglist[1:num_green_args+1]
args = arglist[num_green_args+1:]
assert len(args) == targetjitdriver_sd.num_red_args
warmrunnerstate = targetjitdriver_sd.warmstate
token = warmrunnerstate.get_assembler_token(greenargs)
- opnum = OpHelpers.call_assembler_for_descr(op.getdescr())
+ opnum = OpHelpers.call_assembler_for_descr(descr)
oldop = op
op = self.history.record_nospec(opnum, args, descr=token)
if opnum == rop.CALL_ASSEMBLER_N:
diff --git a/rpython/jit/metainterp/test/support.py
b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -73,7 +73,7 @@
portal_runner_ptr = "???"
vec = False
- stats = history.Stats()
+ stats = history.Stats(None)
cpu = CPUClass(rtyper, stats, None, False)
cw = codewriter.CodeWriter(cpu, [FakeJitDriverSD()])
cw.debug = True
@@ -99,6 +99,7 @@
testself.finish_setup_for_interp_operations()
#
cw.make_jitcodes(verbose=True)
+ return stats
def _run_with_blackhole(testself, args):
from rpython.jit.metainterp.blackhole import BlackholeInterpBuilder
@@ -125,11 +126,13 @@
blackholeinterp.run()
return blackholeinterp._final_result_anytype()
-def _run_with_pyjitpl(testself, args):
+def _run_with_pyjitpl(testself, args, stats):
cw = testself.cw
opt = history.Options(listops=True)
metainterp_sd = pyjitpl.MetaInterpStaticData(cw.cpu, opt)
+ stats.metainterp_sd = metainterp_sd
metainterp_sd.finish_setup(cw)
+
[jitdriver_sd] = metainterp_sd.jitdrivers_sd
metainterp = pyjitpl.MetaInterp(metainterp_sd, jitdriver_sd)
testself.metainterp = metainterp
@@ -258,11 +261,11 @@
def interp_operations(self, f, args, **kwds):
# get the JitCodes for the function f
- _get_jitcodes(self, self.CPUClass, f, args, **kwds)
+ stats = _get_jitcodes(self, self.CPUClass, f, args, **kwds)
# try to run it with blackhole.py
result1 = _run_with_blackhole(self, args)
# try to run it with pyjitpl.py
- result2 = _run_with_pyjitpl(self, args)
+ result2 = _run_with_pyjitpl(self, args, stats)
assert result1 == result2 or isnan(result1) and isnan(result2)
# try to run it by running the code compiled just before
df, result3 = _run_with_machine_code(self, args)
diff --git a/rpython/jit/metainterp/test/test_compile.py
b/rpython/jit/metainterp/test/test_compile.py
--- a/rpython/jit/metainterp/test/test_compile.py
+++ b/rpython/jit/metainterp/test/test_compile.py
@@ -59,7 +59,7 @@
logger_ops = FakeLogger()
config = get_combined_translation_config(translating=True)
- stats = Stats()
+ stats = Stats(None)
profiler = jitprof.EmptyProfiler()
warmrunnerdesc = None
def log(self, msg, event_kind=None):
diff --git a/rpython/jit/metainterp/test/test_resume.py
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -8,9 +8,9 @@
tagged_list_eq, AbstractVirtualInfo, TAGCONST, NULLREF,\
ResumeDataDirectReader, TAGINT, REF, VirtualInfo, VStructInfo,\
VArrayInfoNotClear, VStrPlainInfo, VStrConcatInfo, VStrSliceInfo,\
- VUniPlainInfo, VUniConcatInfo, VUniSliceInfo, Snapshot, FrameInfo,\
+ VUniPlainInfo, VUniConcatInfo, VUniSliceInfo,\
capture_resumedata, ResumeDataLoopMemo, UNASSIGNEDVIRTUAL, INT,\
- annlowlevel, PENDINGFIELDSP, unpack_uint, TAG_CONST_OFFSET, TopSnapshot
+ annlowlevel, PENDINGFIELDSP, TAG_CONST_OFFSET
from rpython.jit.metainterp.resumecode import unpack_numbering,\
create_numbering, NULL_NUMBER
from rpython.jit.metainterp.opencoder import Trace
diff --git a/rpython/jit/metainterp/warmspot.py
b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -464,7 +464,7 @@
if no_stats:
stats = history.NoStats()
else:
- stats = history.Stats()
+ stats = history.Stats(None)
self.stats = stats
if translate_support_code:
self.annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
@@ -483,6 +483,7 @@
self.opt,
ProfilerClass=ProfilerClass,
warmrunnerdesc=self)
+ self.stats.metainterp_sd = self.metainterp_sd
def make_virtualizable_infos(self):
vinfos = {}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit