Author: Ronan Lamy <[email protected]>
Branch: optimizeopt-cleanup
Changeset: r96463:dab1526f28a6
Date: 2019-04-13 20:19 +0100
http://bitbucket.org/pypy/pypy/changeset/dab1526f28a6/
Log: Pull use_unrolling() call out of optimize_trace()
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
@@ -8,8 +8,6 @@
from rpython.rlib import rstack
from rpython.rlib.jit import JitDebugInfo, Counters, dont_look_inside
from rpython.rlib.rjitlog import rjitlog as jl
-from rpython.rlib.objectmodel import compute_unique_id
-from rpython.conftest import option
from rpython.jit.metainterp.resoperation import ResOperation, rop,\
get_deep_immutable_oplist, OpHelpers, InputArgInt, InputArgRef,\
@@ -138,6 +136,7 @@
self.call_pure_results, self.inline_short_preamble)
def show_procedures(metainterp_sd, procedure=None, error=None):
+ from rpython.conftest import option
# debugging
if option and (option.view or option.viewloops):
if error:
@@ -218,7 +217,7 @@
def compile_simple_loop(metainterp, greenkey, trace, runtime_args, enable_opts,
cut_at):
- from rpython.jit.metainterp.optimizeopt import optimize_trace
+ from rpython.jit.metainterp.optimizeopt import optimize_trace,
use_unrolling
jitdriver_sd = metainterp.jitdriver_sd
metainterp_sd = metainterp.staticdata
@@ -226,9 +225,11 @@
call_pure_results = metainterp.call_pure_results
data = SimpleCompileData(trace, call_pure_results=call_pure_results,
enable_opts=enable_opts)
+ use_unroll = use_unrolling(metainterp_sd.cpu, enable_opts)
try:
- loop_info, ops = optimize_trace(metainterp_sd, jitdriver_sd,
- data, metainterp.box_names_memo)
+ loop_info, ops = optimize_trace(
+ metainterp_sd, jitdriver_sd, data, metainterp.box_names_memo,
+ use_unrolling=use_unroll)
except InvalidLoop:
metainterp_sd.jitlog.trace_aborted()
trace.cut_at(cut_at)
@@ -257,7 +258,7 @@
"""Try to compile a new procedure by closing the current history back
to the first operation.
"""
- from rpython.jit.metainterp.optimizeopt import optimize_trace
+ from rpython.jit.metainterp.optimizeopt import optimize_trace,
use_unrolling
metainterp_sd = metainterp.staticdata
jitdriver_sd = metainterp.jitdriver_sd
@@ -269,18 +270,20 @@
faildescr=None, entry_bridge=False)
#
enable_opts = jitdriver_sd.warmstate.enable_opts
+ use_unroll = use_unrolling(metainterp_sd.cpu, enable_opts)
if try_disabling_unroll:
- if 'unroll' not in enable_opts:
+ if not use_unroll:
return None
enable_opts = enable_opts.copy()
del enable_opts['unroll']
+ use_unroll = False
jitcell_token = make_jitcell_token(jitdriver_sd)
cut_at = history.get_trace_position()
history.record(rop.JUMP, jumpargs, None, descr=jitcell_token)
if start != (0, 0, 0):
trace = trace.cut_trace_from(start, inputargs)
- if 'unroll' not in enable_opts or not
metainterp.cpu.supports_guard_gc_type:
+ if not use_unroll:
return compile_simple_loop(metainterp, greenkey, trace, jumpargs,
enable_opts, cut_at)
call_pure_results = metainterp.call_pure_results
@@ -288,9 +291,9 @@
call_pure_results=call_pure_results,
enable_opts=enable_opts)
try:
- start_state, preamble_ops = optimize_trace(metainterp_sd, jitdriver_sd,
- preamble_data,
- metainterp.box_names_memo)
+ start_state, preamble_ops = optimize_trace(
+ metainterp_sd, jitdriver_sd, preamble_data,
+ metainterp.box_names_memo, use_unrolling=use_unroll)
except InvalidLoop:
metainterp_sd.jitlog.trace_aborted()
history.cut(cut_at)
@@ -305,9 +308,9 @@
call_pure_results=call_pure_results,
enable_opts=enable_opts)
try:
- loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
- loop_data,
- metainterp.box_names_memo)
+ loop_info, loop_ops = optimize_trace(
+ metainterp_sd, jitdriver_sd, loop_data, metainterp.box_names_memo,
+ use_unrolling=use_unroll)
except InvalidLoop:
metainterp_sd.jitlog.trace_aborted()
history.cut(cut_at)
@@ -354,7 +357,7 @@
"""Try to compile a new procedure by closing the current history back
to the first operation.
"""
- from rpython.jit.metainterp.optimizeopt import optimize_trace
+ from rpython.jit.metainterp.optimizeopt import optimize_trace,
use_unrolling
trace = metainterp.history.trace.cut_trace_from(start, inputargs)
metainterp_sd = metainterp.staticdata
@@ -374,10 +377,11 @@
loop_data = UnrolledLoopData(trace, loop_jitcell_token, start_state,
call_pure_results=call_pure_results,
enable_opts=enable_opts)
+ use_unroll = use_unrolling(metainterp_sd.cpu, enable_opts)
try:
- loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
- loop_data,
- metainterp.box_names_memo)
+ loop_info, loop_ops = optimize_trace(
+ metainterp_sd, jitdriver_sd, loop_data, metainterp.box_names_memo,
+ use_unrolling=use_unroll)
except InvalidLoop:
# Fall back on jumping directly to preamble
history.cut(cut)
@@ -387,9 +391,9 @@
enable_opts=enable_opts,
inline_short_preamble=False)
try:
- loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
- loop_data,
- metainterp.box_names_memo)
+ loop_info, loop_ops = optimize_trace(
+ metainterp_sd, jitdriver_sd, loop_data,
+ metainterp.box_names_memo, use_unrolling=use_unroll)
except InvalidLoop:
metainterp_sd.jitlog.trace_aborted()
history.cut(cut)
@@ -1048,7 +1052,7 @@
to some existing place.
"""
- from rpython.jit.metainterp.optimizeopt import optimize_trace
+ from rpython.jit.metainterp.optimizeopt import optimize_trace,
use_unrolling
# The history contains new operations to attach as the code for the
# failure of 'resumekey.guard_op'.
@@ -1084,13 +1088,13 @@
data = SimpleCompileData(trace, resumestorage,
call_pure_results=call_pure_results,
enable_opts=enable_opts)
+ use_unroll = use_unrolling(metainterp_sd.cpu, enable_opts)
try:
- info, newops = optimize_trace(metainterp_sd, jitdriver_sd,
- data, metainterp.box_names_memo)
+ info, newops = optimize_trace(
+ metainterp_sd, jitdriver_sd, data, metainterp.box_names_memo,
+ use_unrolling=use_unroll)
except InvalidLoop:
metainterp_sd.jitlog.trace_aborted()
- #pdb.post_mortem(sys.exc_info()[2])
- debug_print("compile_new_bridge: got an InvalidLoop")
# XXX I am fairly convinced that optimize_bridge cannot actually raise
# InvalidLoop
debug_print('InvalidLoop in compile_new_bridge')
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,8 @@
if not is_unrolled:
metainterp_sd.logger_noopt.log_loop_from_trace(trace, memo=memo)
-def optimize_trace(metainterp_sd, jitdriver_sd, compile_data, memo=None):
+def optimize_trace(metainterp_sd, jitdriver_sd, compile_data,
+ memo=None, use_unrolling=True):
"""Optimize loop.operations to remove internal overheadish operations.
"""
debug_start("jit-optimize")
@@ -63,10 +64,9 @@
if memo is None:
memo = {}
compile_data.box_names_memo = memo
- unroll = use_unrolling(metainterp_sd.cpu, compile_data.enable_opts)
optimizations = build_opt_chain(compile_data.enable_opts)
return compile_data.optimize(metainterp_sd, jitdriver_sd,
- optimizations, unroll)
+ optimizations, unroll=use_unrolling)
finally:
compile_data.forget_optimization_info()
debug_stop("jit-optimize")
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5,6 +5,7 @@
from rpython.rlib.rarithmetic import LONG_BIT
from rpython.rtyper import rclass
from rpython.rtyper.lltypesystem import lltype
+from rpython.jit.metainterp.optimizeopt import use_unrolling
from rpython.jit.metainterp.optimizeopt.test.test_util import (
BaseTest, FakeMetaInterpStaticData, convert_old_style_to_targets)
from rpython.jit.metainterp.history import (
@@ -33,13 +34,13 @@
expected = convert_old_style_to_targets(exp, jump=True)
call_pure_results = self._convert_call_pure_results(call_pure_results)
trace = convert_loop_to_trace(loop, FakeMetaInterpStaticData(self.cpu))
+ use_unroll = use_unrolling(self.cpu, self.enable_opts)
compile_data = compile.SimpleCompileData(
trace, call_pure_results=call_pure_results)
- info, ops = self._do_optimize_loop(compile_data)
+ info, ops = self._do_optimize_loop(compile_data, use_unroll)
label_op = ResOperation(rop.LABEL, info.inputargs)
loop.inputargs = info.inputargs
loop.operations = [label_op] + ops
- #print '\n'.join([str(o) for o in loop.operations])
self.loop = loop
self.assert_equal(loop, expected)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
@@ -1,3 +1,4 @@
+from rpython.jit.metainterp.optimizeopt import use_unrolling
from rpython.jit.metainterp.optimizeopt.test.test_util import (
BaseTest, convert_old_style_to_targets, FakeMetaInterpStaticData)
from rpython.jit.metainterp import compile
@@ -29,12 +30,13 @@
self.add_guard_future_condition(bridge)
trace = oparser.convert_loop_to_trace(
bridge, FakeMetaInterpStaticData(self.cpu))
+ use_unroll = use_unrolling(self.cpu, self.enable_opts)
data = compile.BridgeCompileData(
trace,
self.convert_values(bridge.operations[-1].getarglist(),
bridge_values),
None, enable_opts=self.enable_opts,
inline_short_preamble=inline_short_preamble)
- bridge_info, ops = self._do_optimize_loop(data)
+ bridge_info, ops = self._do_optimize_loop(data, use_unroll)
loop.check_consistency(check_descr=False)
info.preamble.check_consistency(check_descr=False)
bridge.operations = ([ResOperation(rop.LABEL, bridge_info.inputargs)] +
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -5,7 +5,7 @@
from rpython.jit.metainterp.optimizeopt.test.test_util import (
BaseTest, FakeMetaInterpStaticData)
from rpython.jit.metainterp.optimizeopt.util import equaloplists
-from rpython.jit.metainterp.history import TreeLoop, JitCellToken
+from rpython.jit.metainterp.history import TreeLoop
from rpython.jit.metainterp.resoperation import (
rop, ResOperation, InputArgRef, InputArgInt)
from rpython.jit.metainterp.support import ptr2int
@@ -16,6 +16,7 @@
NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN, LEVEL_KNOWNCLASS,
VirtualStateInfo)
from rpython.jit.metainterp.optimizeopt import info, optimizer
+from rpython.jit.metainterp.optimizeopt import use_unrolling
from rpython.jit.tool import oparser
class FakeOptimizer(object):
@@ -40,20 +41,15 @@
def optimize(self, ops):
loop = self.parse(ops)
self.add_guard_future_condition(loop)
- operations = loop.operations
+ operations = loop.operations
jumpop = operations[-1]
assert jumpop.getopnum() == rop.JUMP
inputargs = loop.inputargs
-
- jump_args = jumpop.getarglist()[:]
- operations = operations[:-1]
-
preamble = TreeLoop('preamble')
-
- token = JitCellToken()
trace = oparser.convert_loop_to_trace(loop,
FakeMetaInterpStaticData(self.cpu))
+ use_unroll = use_unrolling(self.cpu, self.enable_opts)
compile_data = LoopCompileData(trace, inputargs)
- start_state, newops = self._do_optimize_loop(compile_data)
+ start_state, newops = self._do_optimize_loop(compile_data, use_unroll)
preamble.operations = newops
preamble.inputargs = start_state.renamed_inputargs
return start_state, loop, preamble
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -23,7 +23,7 @@
from rpython.jit.metainterp.resoperation import (
rop, ResOperation, InputArgRef, AbstractValue)
from rpython.jit.metainterp.virtualref import VirtualRefInfo
-from rpython.jit.metainterp.optimizeopt import optimize_trace
+from rpython.jit.metainterp.optimizeopt import optimize_trace, use_unrolling
from rpython.jit.metainterp.optimizeopt.util import (
sort_descrs, equaloplists, args_dict)
@@ -538,17 +538,17 @@
assert equaloplists(optimized.operations,
expected.operations, False, remap, text_right)
- def _do_optimize_loop(self, compile_data):
+ def _do_optimize_loop(self, compile_data, use_unroll):
metainterp_sd = FakeMetaInterpStaticData(self.cpu)
metainterp_sd.virtualref_info = self.vrefinfo
compute_bitstrings(self.cpu.fetch_all_descrs())
#
compile_data.enable_opts = self.enable_opts
- state = optimize_trace(metainterp_sd, None, compile_data)
+ state = optimize_trace(
+ metainterp_sd, None, compile_data, use_unrolling=use_unroll)
return state
def _convert_call_pure_results(self, d):
-
if d is None:
return
call_pure_results = args_dict()
@@ -581,18 +581,16 @@
celltoken = JitCellToken()
runtime_boxes = self.pack_into_boxes(jump_op, jump_values)
jump_op.setdescr(celltoken)
- #start_label = ResOperation(rop.LABEL, loop.inputargs,
- # descr=jump_op.getdescr())
- #end_label = jump_op.copy_and_change(opnum=rop.LABEL)
call_pure_results = self._convert_call_pure_results(call_pure_results)
t = convert_loop_to_trace(loop, FakeMetaInterpStaticData(self.cpu))
+ use_unroll = use_unrolling(self.cpu, self.enable_opts)
preamble_data = compile.LoopCompileData(t, runtime_boxes,
call_pure_results)
- start_state, preamble_ops = self._do_optimize_loop(preamble_data)
+ start_state, preamble_ops = self._do_optimize_loop(preamble_data,
use_unroll)
preamble_data.forget_optimization_info()
loop_data = compile.UnrolledLoopData(preamble_data.trace,
celltoken, start_state, call_pure_results)
- loop_info, ops = self._do_optimize_loop(loop_data)
+ loop_info, ops = self._do_optimize_loop(loop_data, use_unroll)
preamble = TreeLoop('preamble')
preamble.inputargs = start_state.renamed_inputargs
start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -853,7 +853,7 @@
enable_opts =
"intbounds:rewrite:virtualize:string:pure:earlyforce:heap:unroll"
def _do_optimize_bridge(self, bridge, call_pure_results, values):
- from rpython.jit.metainterp.optimizeopt import optimize_trace
+ from rpython.jit.metainterp.optimizeopt import optimize_trace,
use_unrolling
from rpython.jit.metainterp.optimizeopt.util import args_dict
self.bridge = bridge
@@ -871,7 +871,9 @@
data = compile.BridgeCompileData(trace, runtime_boxes,
enable_opts=self.enable_opts, inline_short_preamble=True)
- info, newops = optimize_trace(metainterp_sd, None, data)
+ use_unroll = use_unrolling(self.cpu, self.enable_opts)
+ info, newops = optimize_trace(metainterp_sd, None, data,
+ use_unrolling=use_unroll)
if info.final():
bridge.operations = newops
bridge.inputargs = info.inputargs
diff --git a/rpython/jit/metainterp/test/test_ajit.py
b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -2901,6 +2901,8 @@
optimizeopt.optimize_trace = old_optimize_trace
def test_max_unroll_loops_retry_without_unroll(self):
+ if not self.basic:
+ py.test.skip("unrolling")
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp import optimizeopt
myjitdriver = JitDriver(greens = [], reds = ['n', 'i'])
@@ -2916,14 +2918,14 @@
return i
#
seen = []
- def my_optimize_trace(metainterp_sd, jitdriver_sd, data, memo=None):
- seen.append('unroll' in data.enable_opts)
+ def my_optimize_trace(metainterp_sd, jitdriver_sd, data, memo=None,
+ use_unrolling=True):
+ assert use_unrolling == ('unroll' in data.enable_opts)
+ seen.append(use_unrolling)
raise InvalidLoop
old_optimize_trace = optimizeopt.optimize_trace
optimizeopt.optimize_trace = my_optimize_trace
try:
- if not self.basic:
- py.test.skip("unrolling")
res = self.meta_interp(f, [23, 4])
assert res == 23
assert False in seen
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit