Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79305:4a71f8c4189d
Date: 2015-08-30 23:17 +0200
http://bitbucket.org/pypy/pypy/changeset/4a71f8c4189d/
Log: pass test_quasiimmut
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
@@ -220,6 +220,8 @@
loop = create_empty_loop(metainterp)
loop.original_jitcell_token = jitcell_token
loop.inputargs = loop_info.inputargs
+ if loop_info.quasi_immutable_deps:
+ loop.quasi_immutable_deps = loop_info.quasi_immutable_deps
jump_op = ops[-1]
target_token = TargetToken(jitcell_token)
target_token.original_jitcell_token = jitcell_token
@@ -287,6 +289,13 @@
loop = create_empty_loop(metainterp)
loop.original_jitcell_token = jitcell_token
loop.inputargs = start_state.renamed_inputargs
+ quasi_immutable_deps = {}
+ if start_state.quasi_immutable_deps:
+ quasi_immutable_deps.update(start_state.quasi_immutable_deps)
+ if loop_info.quasi_immutable_deps:
+ quasi_immutable_deps.update(loop_info.quasi_immutable_deps)
+ if quasi_immutable_deps:
+ loop.quasi_immutable_deps = quasi_immutable_deps
start_descr = TargetToken(jitcell_token,
original_jitcell_token=jitcell_token)
start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs,
@@ -335,17 +344,18 @@
return None
loop = partial_trace
+ loop.original_jitcell_token = loop_jitcell_token
loop.operations = (loop.operations + loop_info.extra_same_as +
[loop_info.label_op]
+ loop_ops)
- #quasi_immutable_deps = {}
- #if loop.quasi_immutable_deps:
- # quasi_immutable_deps.update(loop.quasi_immutable_deps)
- #if part.quasi_immutable_deps:
- # quasi_immutable_deps.update(part.quasi_immutable_deps)
- #if quasi_immutable_deps:
- # loop.quasi_immutable_deps = quasi_immutable_deps
+ quasi_immutable_deps = {}
+ if loop_info.quasi_immutable_deps:
+ quasi_immutable_deps.update(loop_info.quasi_immutable_deps)
+ if start_state.quasi_immutable_deps:
+ quasi_immutable_deps.update(start_state.quasi_immutable_deps)
+ if quasi_immutable_deps:
+ loop.quasi_immutable_deps = quasi_immutable_deps
target_token = loop.operations[-1].getdescr()
resumekey.compile_and_attach(metainterp, loop, inputargs)
@@ -420,13 +430,12 @@
emit_op(extra_ops, op)
loop.operations = extra_ops
-#def propagate_original_jitcell_token(trace):
-# for op in trace.operations:
-# if op.getopnum() == rop.LABEL:
-# token = op.getdescr()
-# assert isinstance(token, TargetToken)
-# assert token.original_jitcell_token is None
-# token.original_jitcell_token = trace.original_jitcell_token
+def propagate_original_jitcell_token(trace):
+ for op in trace.operations:
+ if op.getopnum() == rop.LABEL:
+ token = op.getdescr()
+ assert isinstance(token, TargetToken)
+ token.original_jitcell_token = trace.original_jitcell_token
def do_compile_loop(jd_id, unique_id, metainterp_sd, inputargs, operations,
@@ -767,7 +776,7 @@
inputargs = new_loop.inputargs
if not we_are_translated():
self._debug_suboperations = new_loop.operations
- #propagate_original_jitcell_token(new_loop)
+ propagate_original_jitcell_token(new_loop)
send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata,
self, inputargs, new_loop.operations,
new_loop.original_jitcell_token)
@@ -954,7 +963,7 @@
metainterp_sd = metainterp.staticdata
jitdriver_sd = metainterp.jitdriver_sd
new_loop.original_jitcell_token = jitcell_token =
make_jitcell_token(jitdriver_sd)
- #propagate_original_jitcell_token(new_loop)
+ propagate_original_jitcell_token(new_loop)
send_loop_to_backend(self.original_greenkey, metainterp.jitdriver_sd,
metainterp_sd, new_loop, "entry bridge",
orig_inputargs)
@@ -1015,6 +1024,8 @@
new_trace = create_empty_loop(metainterp)
new_trace.operations = newops
+ if info.quasi_immutable_deps:
+ new_trace.quasi_immutable_deps = info.quasi_immutable_deps
if info.final():
new_trace.inputargs = info.inputargs
target_token = new_trace.operations[-1].getdescr()
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
@@ -782,6 +782,15 @@
if 'getfield_gc' in check:
assert check.pop('getfield_gc') == 0
check['getfield_gc_i'] = check['getfield_gc_r'] =
check['getfield_gc_f'] = 0
+ if 'getfield_gc_pure' in check:
+ assert check.pop('getfield_gc_pure') == 0
+ check['getfield_gc_pure_i'] = check['getfield_gc_pure_r'] =
check['getfield_gc_pure_f'] = 0
+ if 'getarrayitem_gc_pure' in check:
+ assert check.pop('getarrayitem_gc_pure') == 0
+ check['getarrayitem_gc_pure_i'] = check['getarrayitem_gc_pure_r']
= check['getarrayitem_gc_pure_f'] = 0
+ if 'getarrayitem_gc' in check:
+ assert check.pop('getarrayitem_gc') == 0
+ check['getarrayitem_gc_i'] = check['getarrayitem_gc_r'] =
check['getarrayitem_gc_f'] = 0
for loop in self.get_all_loops():
insns = loop.summary(adding_insns=insns, omit_finish=omit_finish)
return self._check_insns(insns, expected, check)
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -24,8 +24,9 @@
pass
class BasicLoopInfo(LoopInfo):
- def __init__(self, inputargs):
+ def __init__(self, inputargs, quasi_immutable_deps):
self.inputargs = inputargs
+ self.quasi_immutable_deps = quasi_immutable_deps
def final(self):
return True
@@ -508,15 +509,14 @@
for i in range(last):
self._really_emitted_operation = None
self.first_optimization.propagate_forward(ops[i])
- #self.loop.operations = self.get_newoperations()
- #self.loop.quasi_immutable_deps = self.quasi_immutable_deps
# accumulate counters
if flush:
self.flush()
if extra_jump:
self.first_optimization.propagate_forward(ops[-1])
self.resumedata_memo.update_counters(self.metainterp_sd.profiler)
- return BasicLoopInfo(newargs), self._newoperations
+ return (BasicLoopInfo(newargs, self.quasi_immutable_deps),
+ self._newoperations)
def _clean_optimization_info(self, lst):
for op in lst:
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
@@ -105,6 +105,7 @@
flush=False)
exported_state = self.export_state(start_label, end_label.getarglist(),
info.inputargs)
+ exported_state.quasi_immutable_deps = info.quasi_immutable_deps
# we need to absolutely make sure that we've cleaned up all
# the optimization info
self.optimizer._clean_optimization_info(self.optimizer._newoperations)
@@ -138,7 +139,8 @@
return (UnrollInfo(target_token, label_op, []),
self.optimizer._newoperations)
#return new_virtual_state, self.optimizer._newoperations
- return (UnrollInfo(target_token, label_op, extra_same_as),
+ return (UnrollInfo(target_token, label_op, extra_same_as,
+ self.optimizer.quasi_immutable_deps),
self.optimizer._newoperations)
def optimize_bridge(self, start_label, operations, call_pure_results,
@@ -181,6 +183,7 @@
exported_state = self.export_state(start_label,
operations[-1].getarglist(),
info.inputargs)
+ exported_state.quasi_immutable_deps =
self.optimizer.quasi_immutable_deps
self.optimizer._clean_optimization_info(self.optimizer._newoperations)
return exported_state, self.optimizer._newoperations
@@ -198,7 +201,7 @@
target_token.virtual_state = virtual_state
target_token.short_preamble = short_preamble
jitcelltoken.target_tokens.append(target_token)
- self.short_preamble_producer = ExtendedShortPreambleBuilder()
+ self.short_preamble_producer = None # ExtendedShortPreambleBuilder()
label_op.initarglist(label_op.getarglist() + sb.used_boxes)
return target_token
@@ -350,10 +353,12 @@
* label_args - label operations at the beginning
* extra_same_as - list of extra same as to add at the end of the preamble
"""
- def __init__(self, target_token, label_op, extra_same_as):
+ def __init__(self, target_token, label_op, extra_same_as,
+ quasi_immutable_deps):
self.target_token = target_token
self.label_op = label_op
self.extra_same_as = extra_same_as
+ self.quasi_immutable_deps = quasi_immutable_deps
def final(self):
return True
@@ -370,6 +375,7 @@
* short boxes - a mapping op -> preamble_op
* renamed_inputargs - the start label arguments in optimized version
* short_inputargs - the renamed inputargs for short preamble
+ * quasi_immutable_deps - for tracking quasi immutables
"""
def __init__(self, end_args, next_iteration_args, virtual_state,
diff --git a/rpython/jit/metainterp/test/test_quasiimmut.py
b/rpython/jit/metainterp/test/test_quasiimmut.py
--- a/rpython/jit/metainterp/test/test_quasiimmut.py
+++ b/rpython/jit/metainterp/test/test_quasiimmut.py
@@ -124,7 +124,8 @@
assert f(100, 7) == 721
res = self.meta_interp(f, [100, 7])
assert res == 721
- self.check_resops(guard_not_invalidated=0, getfield_gc=1,
getfield_gc_pure=2)
+ self.check_resops(guard_not_invalidated=0, getfield_gc_r=1,
+ getfield_gc_pure_i=2)
#
from rpython.jit.metainterp.warmspot import get_stats
loops = get_stats().loops
@@ -369,8 +370,12 @@
#
res = self.meta_interp(f, [100, 7])
assert res == 700
- self.check_resops(getarrayitem_gc_pure=0, guard_not_invalidated=2,
- getarrayitem_gc=0, getfield_gc=0, getfield_gc_pure=0)
+ self.check_resops(getarrayitem_gc_pure_i=0, guard_not_invalidated=2,
+ getarrayitem_gc_pure_r=0,
+ getarrayitem_gc_i=0,
+ getarrayitem_gc_r=0,
+ getfield_gc_i=0, getfield_gc_pure_i=0,
+ getfield_gc_r=0, getfield_gC_pure_r=0)
#
from rpython.jit.metainterp.warmspot import get_stats
loops = get_stats().loops
@@ -399,8 +404,10 @@
res = self.meta_interp(f, [100, 7], enable_opts="")
assert res == 700
# operations must have been removed by the frontend
- self.check_resops(getarrayitem_gc_pure=0, guard_not_invalidated=1,
- getarrayitem_gc=0, getfield_gc=0, getfield_gc_pure=0)
+ self.check_resops(getarrayitem_gc_pure_i=0, guard_not_invalidated=1,
+ getarrayitem_gc_i=0,
+ getfield_gc=0, getfield_gc_pure_i=0,
+ getfield_gc_pure_r=0)
def test_list_length_1(self):
myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total'])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit