[pypy-commit] pypy optresult-unroll: fight, the best I got so far
fijal
noreply at buildbot.pypy.org
Tue Aug 18 17:22:26 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79041:f10f772c7fb6
Date: 2015-08-18 17:22 +0200
http://bitbucket.org/pypy/pypy/changeset/f10f772c7fb6/
Log: fight, the best I got so far
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -244,11 +244,6 @@
# mapping const value -> info corresponding to it's heap cache
self.const_infos = self.optimizer.cpu.ts.new_ref_dict()
- def force_at_end_of_preamble(self):
- self.cached_dict_reads.clear()
- self.corresponding_array_descrs.clear()
- self.force_all_lazy_setfields_and_arrayitems()
-
def flush(self):
self.cached_dict_reads.clear()
self.corresponding_array_descrs.clear()
@@ -478,6 +473,11 @@
if indexb is None or indexb.contains(idx):
cf.force_lazy_setfield(self, None, can_cache)
+ def force_at_end_of_preamble(self):
+ self.cached_dict_reads.clear()
+ self.corresponding_array_descrs.clear()
+ self.force_all_lazy_setfields_and_arrayitems()
+
def force_all_lazy_setfields_and_arrayitems(self):
items = self.cached_fields.items()
if not we_are_translated():
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -137,7 +137,7 @@
v1, v2 = v2, v1
# if both are constant, the pure optimization will deal with it
if v2.is_constant() and not v1.is_constant():
- if False and not self.optimizer.is_inputarg(arg1):
+ if not self.optimizer.is_inputarg(arg1):
if arg1.getopnum() == rop.INT_ADD:
prod_arg1 = arg1.getarg(0)
prod_arg2 = arg1.getarg(1)
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -41,6 +41,7 @@
class AbstractShortOp(object):
""" An operation that is potentially produced by the short preamble
"""
+ pass
class HeapOp(AbstractShortOp):
def __init__(self, res, getfield_op):
@@ -209,15 +210,15 @@
# of AbstractShortOp
self.potential_ops = OrderedDict()
self.produced_short_boxes = {}
- self.short_inputargs = []
# a way to produce const boxes, e.g. setfield_gc(p0, Const).
# We need to remember those, but they don't produce any new boxes
self.const_short_boxes = []
- for i in range(len(inputargs)):
- box = inputargs[i]
+ self.short_inputargs = []
+ for i in range(len(label_args)):
+ box = label_args[i]
renamed = OpHelpers.inputarg_from_tp(box.type)
- self.potential_ops[box] = ShortInputArg(label_args[i], renamed)
self.short_inputargs.append(renamed)
+ self.potential_ops[box] = ShortInputArg(box, renamed)
optimizer.produce_potential_short_preamble_ops(self)
@@ -302,7 +303,7 @@
renamed = OpHelpers.inputarg_from_tp(label_args[i].type)
short_inpargs.append(renamed)
else:
- #assert isinstance(inparg, ShortInputArg)
+ assert isinstance(inparg.short_op, ShortInputArg)
short_inpargs.append(inparg.preamble_op)
return short_inpargs
@@ -314,7 +315,8 @@
self.potential_ops[op] = CompoundOp(op, pop, prev_op)
def add_pure_op(self, op):
- assert op not in self.potential_ops
+ if op in self.potential_ops:
+ return
self.add_potential_op(op, PureOp(op))
def add_loopinvariant_op(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -879,7 +879,7 @@
jump(p2, p3)
"""
short = """
- [p1]
+ [p1, p2]
i1 = getfield_gc_i(p1, descr=valuedescr)
jump(i1)
"""
@@ -1221,12 +1221,10 @@
setfield_gc(p0, p1, descr=nextdescr)
setfield_gc(p2, i1, descr=valuedescr)
setfield_gc(p1, p2, descr=nextdescr)
- jump(p1)
+ jump(p1, p2, i1)
"""
loop = """
- [p0]
- p41 = getfield_gc_r(p0, descr=nextdescr)
- i0 = getfield_gc_i(p41, descr=valuedescr)
+ [p0, p41, i0]
i1 = int_add(i0, 1)
p1 = new_with_vtable(descr=nodesize2)
p2 = new_with_vtable(descr=nodesize2)
@@ -1234,7 +1232,7 @@
setfield_gc(p0, p1, descr=nextdescr)
setfield_gc(p2, i1, descr=valuedescr)
setfield_gc(p1, p2, descr=nextdescr)
- jump(p1)
+ jump(p1, p2, i1)
"""
self.optimize_loop(ops, loop, preamble)
@@ -2397,7 +2395,11 @@
setfield_gc(p1, i2, descr=valuedescr)
jump(p1, i1, i2, 1) # , i5)
"""
- self.optimize_loop(ops, expected, preamble)
+ expected_short = """
+ []
+ """
+ self.optimize_loop(ops, expected, preamble,
+ expected_short=expected_short)
def test_duplicate_setfield_residual_guard_2(self):
# the difference with the previous test is that the field value is
@@ -8718,5 +8720,16 @@
"""
self.optimize_loop(ops, expected, expected_short=expected_short)
+ def test_simple_swap_arguments(self):
+ ops = """
+ [i0, i1]
+ i2 = int_add(i1, 1)
+ jump(i2, i0)
+ """
+ expected = """
+ []
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(OptimizeOptTest, LLtypeMixin):
pass
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
@@ -12,7 +12,7 @@
from rpython.jit.metainterp.resoperation import rop, ResOperation,\
InputArgRef
from rpython.jit.metainterp.optimizeopt.shortpreamble import \
- ShortPreambleBuilder, PreambleOp
+ ShortPreambleBuilder, PreambleOp, ShortInputArg
from rpython.jit.metainterp.compile import LoopCompileData
from rpython.jit.metainterp.optimizeopt.virtualstate import \
NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN, LEVEL_KNOWNCLASS,\
@@ -64,6 +64,9 @@
remap[v] = k
equaloplists(short, exp, remap=remap)
+def producable_short_boxes(l):
+ return [x for x in l if not isinstance(x.short_op, ShortInputArg)]
+
class TestUnroll(BaseTestUnroll):
def test_simple(self):
loop = """
@@ -230,7 +233,8 @@
jump(i1, p1, p2)
"""
es, loop, preamble = self.optimize(loop)
- assert len(es.short_boxes) == 2
+ assert len(producable_short_boxes(es.short_boxes)) == 2
+ xxx
def test_setfield_forced_virtual(self):
loop = """
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
@@ -107,7 +107,10 @@
for op in end_jump.getarglist()]
jump_args = state.virtual_state.make_inputargs(orig_jump_args,
self.optimizer, force_boxes=True)
- extra_jump_args = self.inline_short_preamble(jump_args)
+ pass_to_short = state.virtual_state.make_inputargs(orig_jump_args,
+ self.optimizer, force_boxes=True,
+ append_virtuals=True)
+ extra_jump_args = self.inline_short_preamble(pass_to_short)
# remove duplicates, removes stuff from used boxes too
label_args, jump_args = self.filter_extra_jump_args(
start_label.getarglist() + self.short_preamble_producer.used_boxes,
@@ -166,9 +169,11 @@
for arg in label_args:
infos[arg] = self.optimizer.getinfo(arg)
sb = ShortBoxes()
+ label_args_plus_virtuals = virtual_state.make_inputargs(end_args,
+ self.optimizer, append_virtuals=True)
short_boxes = sb.create_short_boxes(self.optimizer, renamed_inputargs,
- label_args)
- short_inputargs = sb.create_short_inputargs(label_args)
+ label_args_plus_virtuals)
+ short_inputargs = sb.create_short_inputargs(label_args_plus_virtuals)
for produced_op in short_boxes:
op = produced_op.short_op.res
if not isinstance(op, Const):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -516,7 +516,8 @@
state)
return state
- def make_inputargs(self, inputargs, optimizer, force_boxes=False):
+ def make_inputargs(self, inputargs, optimizer, force_boxes=False,
+ append_virtuals=False):
assert len(inputargs) == len(self.state)
boxes = [None] * self.numnotvirtuals
@@ -530,6 +531,14 @@
for i in range(len(inputargs)):
self.state[i].enum_forced_boxes(boxes, inputargs[i], optimizer)
+ if append_virtuals:
+ # we append the virtuals here in case some stuff is proven
+ # to be not a virtual and there are getfields in the short preamble
+ # that will read items out of there
+ for i in range(len(inputargs)):
+ if not isinstance(self.state[i], NotVirtualStateInfo):
+ boxes.append(inputargs[i])
+
return boxes
def debug_print(self, hdr='', bad=None, metainterp_sd=None):
More information about the pypy-commit
mailing list