Author: fijal
Branch: jit-leaner-frontend
Changeset: r82852:2c79e6dbfade
Date: 2016-03-07 18:28 +0200
http://bitbucket.org/pypy/pypy/changeset/2c79e6dbfade/
Log: in-progress
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
@@ -82,10 +82,10 @@
""" This represents ops() with a jump at the end that goes to some
loop, we need to deal with virtual state and inlining of short preamble
"""
- def __init__(self, start_label, operations, call_pure_results=None,
+ def __init__(self, trace, runtime_boxes, call_pure_results=None,
enable_opts=None, inline_short_preamble=False):
- self.start_label = start_label
- self.operations = operations
+ self.trace = trace
+ self.runtime_boxes = runtime_boxes
self.call_pure_results = call_pure_results
self.enable_opts = enable_opts
self.inline_short_preamble = inline_short_preamble
@@ -94,7 +94,7 @@
from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
- return opt.optimize_bridge(self.start_label, self.operations,
+ return opt.optimize_bridge(self.trace, self.runtime_boxes,
self.call_pure_results,
self.inline_short_preamble,
self.box_names_memo)
@@ -200,8 +200,9 @@
# ____________________________________________________________
-def compile_simple_loop(metainterp, greenkey, start, inputargs, ops, jumpargs,
+def compile_simple_loop(metainterp, greenkey, start, trace, jumpargs,
enable_opts):
+ xxxx
from rpython.jit.metainterp.optimizeopt import optimize_trace
jitdriver_sd = metainterp.jitdriver_sd
@@ -261,8 +262,8 @@
jitcell_token = make_jitcell_token(jitdriver_sd)
history.record(rop.JUMP, jumpargs, None, descr=jitcell_token)
if 'unroll' not in enable_opts or not
metainterp.cpu.supports_guard_gc_type:
- xxx
- return compile_simple_loop(metainterp, greenkey, start, inputargs, ops,
+ return compile_simple_loop(metainterp, greenkey, start, inputargs,
+ history.trace,
jumpargs, enable_opts)
call_pure_results = metainterp.call_pure_results
preamble_data = LoopCompileData(history.trace, inputargs,
@@ -1033,8 +1034,7 @@
call_pure_results = metainterp.call_pure_results
if metainterp.history.ends_with_jump:
- xxx
- data = BridgeCompileData(label, operations[:],
+ data = BridgeCompileData(trace, inputargs,
call_pure_results=call_pure_results,
enable_opts=enable_opts,
inline_short_preamble=inline_short_preamble)
diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py
--- a/rpython/jit/metainterp/logger.py
+++ b/rpython/jit/metainterp/logger.py
@@ -12,6 +12,15 @@
self.metainterp_sd = metainterp_sd
self.guard_number = guard_number
+ def log_loop_from_trace(self, trace, memo):
+ if not have_debug_prints():
+ return
+ ops = []
+ i = trace.get_iter()
+ while not i.done():
+ ops.append(i.next())
+ self.log_loop(i.inputargs, ops, memo=memo)
+
def log_loop(self, inputargs, operations, number=0, type=None,
ops_offset=None, name='', memo=None):
if type is None:
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py
b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -53,7 +53,7 @@
"""
debug_start("jit-optimize")
try:
- #metainterp_sd.logger_noopt.log_loop(compile_data.trace, memo=memo)
+ metainterp_sd.logger_noopt.log_loop_from_trace(compile_data.trace,
memo=memo)
if memo is None:
memo = {}
compile_data.box_names_memo = memo
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -224,13 +224,12 @@
return token.virtual_state
return label_vs
- def optimize_bridge(self, start_label, operations, call_pure_results,
+ def optimize_bridge(self, trace, runtime_boxes, call_pure_results,
inline_short_preamble, box_names_memo):
- self._check_no_forwarding([start_label.getarglist()])
- info, ops = self.optimizer.propagate_all_forward(
- start_label.getarglist()[:], operations[:-1],
+ self._check_no_forwarding([trace.inputargs])
+ info, ops = self.optimizer.propagate_all_forward(trace.get_iter(),
call_pure_results)
- jump_op = operations[-1]
+ jump_op = info.jump_op
cell_token = jump_op.getdescr()
assert isinstance(cell_token, JitCellToken)
if not inline_short_preamble or len(cell_token.target_tokens) == 1:
@@ -241,9 +240,9 @@
for a in jump_op.getarglist():
self.optimizer.force_box_for_end_of_preamble(a)
try:
- vs = self.jump_to_existing_trace(jump_op, None)
+ vs = self.jump_to_existing_trace(jump_op, None, runtime_boxes)
except InvalidLoop:
- return self.jump_to_preamble(cell_token, jump_op, info)
+ return self.jump_to_preamble(cell_token, jump_op, info)
if vs is None:
return info, self.optimizer._newoperations[:]
warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc
@@ -254,6 +253,7 @@
else:
debug_print("Retrace count reached, jumping to preamble")
return self.jump_to_preamble(cell_token, jump_op, info)
+ xxx
exported_state = self.export_state(start_label,
operations[-1].getarglist(),
info.inputargs, box_names_memo)
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
@@ -2609,14 +2609,12 @@
self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None,
descr=target_jitcell_token)
self.history.ends_with_jump = True
- try:
- target_token = compile.compile_trace(self, self.resumekey)
- finally:
- self.history.operations.pop() # remove the JUMP
+ target_token = compile.compile_trace(self, self.resumekey)
if target_token is not None: # raise if it *worked* correctly
assert isinstance(target_token, TargetToken)
jitcell_token = target_token.targeting_jitcell_token
self.raise_continue_running_normally(live_arg_boxes, jitcell_token)
+ xxxx # remove the jump op and continue tracing
def compile_done_with_this_frame(self, exitbox):
# temporarily put a JUMP to a pseudo-loop
@@ -2709,7 +2707,7 @@
self.history = history.History()
inputargs_and_holes = self.rebuild_state_after_failure(resumedescr,
deadframe)
- self.history.inputargs = [box for box in inputargs_and_holes if
box]
+ self.history.set_inputargs([box for box in inputargs_and_holes if
box])
finally:
rstack._stack_criticalcode_stop()
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -1436,7 +1436,16 @@
def is_pure_with_descr(opnum, descr):
if rop.is_always_pure(opnum):
return True
- xxxx
+ if (opnum == rop.GETFIELD_RAW_I or
+ opnum == rop.GETFIELD_RAW_R or
+ opnum == rop.GETFIELD_RAW_F or
+ opnum == rop.GETFIELD_GC_I or
+ opnum == rop.GETFIELD_GC_R or
+ opnum == rop.GETFIELD_GC_F or
+ opnum == rop.GETARRAYITEM_RAW_I or
+ opnum == rop.GETARRAYITEM_RAW_F):
+ return descr.is_always_pure()
+ return False
@staticmethod
def is_pure_getfield(opnum, descr):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit