[pypy-commit] pypy optresult-unroll: handle consts better
fijal
noreply at buildbot.pypy.org
Mon Jul 13 17:20:00 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78546:cde47437fc67
Date: 2015-07-13 17:20 +0200
http://bitbucket.org/pypy/pypy/changeset/cde47437fc67/
Log: handle consts better
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
@@ -58,9 +58,7 @@
op = optimizer.get_box_replacement(op)
opnum = OpHelpers.getfield_for_descr(descr)
getfield_op = ResOperation(opnum, [structbox], descr=descr)
- if not op.is_constant():
- # XXXX why?
- shortboxes.add_potential(op, getfield_op)
+ shortboxes.add_potential(op, getfield_op)
return
for structvalue in self._cached_fields_getfield_op.keys():
op = self._cached_fields_getfield_op[structvalue]
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
@@ -8,6 +8,7 @@
class ShortBoxes(object):
def __init__(self):
self.potential_ops = []
+ self.produced_short_boxes = {}
self.ops_used = {}
self.extra_same_as = []
@@ -16,21 +17,25 @@
self.ops_used[box] = None
optimizer.produce_potential_short_preamble_ops(self)
- self.short_boxes = {}
- # short boxes has a map of "op from preamble" ->
- # "op going to short preamble", where "op from preamble" can be
- # anything, but the one going to short_preamble has to be either pure
+ self.short_boxes = []
+ # short boxes is a list of (op, preamble_op)
+ # where op can be
+ # anything, but the preamble_op has to be either pure
# or a heap cache op
for op, preamble_op in self.potential_ops:
self.produce_short_preamble_op(op, preamble_op)
+ self.produced_short_boxes = None
return self.short_boxes
def add_to_short(self, op, short_op):
- self.short_boxes[op] = short_op
+ self.short_boxes.append((op, short_op))
+ self.produced_short_boxes[op] = None
def produce_short_preamble_op(self, op, preamble_op):
- if isinstance(op, AbstractInputArg):
+ if isinstance(op, Const):
+ pass
+ elif isinstance(op, AbstractInputArg):
if op not in self.ops_used:
return
else:
@@ -41,7 +46,7 @@
pass
else:
return # can't produce
- if op in self.short_boxes:
+ if op in self.produced_short_boxes:
opnum = OpHelpers.same_as_for_type(op.type)
same_as_op = ResOperation(opnum, [op])
self.extra_same_as.append(same_as_op)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_short.py b/rpython/jit/metainterp/optimizeopt/test/test_short.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_short.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_short.py
@@ -28,7 +28,7 @@
op = ResOperation(rop.INT_ADD, [i0, i1])
sb = ShortBoxes()
sb.create_short_boxes(Opt([op]), [i0, i1])
- assert sb.short_boxes == {op: op}
+ assert sb.short_boxes == [(op, op)]
def test_pure_ops_does_not_work(self):
i0 = InputArgInt()
@@ -36,7 +36,7 @@
op = ResOperation(rop.INT_ADD, [i0, i1])
sb = ShortBoxes()
sb.create_short_boxes(Opt([op]), [i0])
- assert sb.short_boxes == {}
+ assert sb.short_boxes == []
def test_multiple_similar_ops(self):
""" This can happen e.g. if heap cache and pure ops produce
@@ -56,10 +56,9 @@
sb = ShortBoxes()
sb.create_short_boxes(Opt([op, (op, op1)]), [i0, i1])
assert len(sb.short_boxes) == 2
- l = [x.getopnum() for x in sb.short_boxes.keys()]
+ l = [x.getopnum() for x, _ in sb.short_boxes]
l.sort()
assert l == [rop.INT_ADD, rop.SAME_AS_I]
- assert op1 in sb.short_boxes.values()
- assert op in sb.short_boxes.values()
- assert op in sb.short_boxes.keys()
+ assert [x for x, y in sb.short_boxes][0] == op
+ assert [y for x, y in sb.short_boxes] == [op, op1]
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
@@ -69,7 +69,7 @@
# we have exported values for i1, which happens to be an inputarg
assert es.inputarg_mapping[0][1].getint() == 1
assert isinstance(es.inputarg_mapping[0][1], ConstInt)
- assert es.short_boxes == {}
+ assert es.short_boxes == []
def test_not_constant(self):
loop = """
@@ -82,7 +82,7 @@
assert isinstance(vs.state[0], NotVirtualStateInfo)
assert vs.state[0].level == LEVEL_UNKNOWN
op = preamble.operations[0]
- assert es.short_boxes == {op: op}
+ assert es.short_boxes == [(op, op)]
def test_guard_class(self):
loop = """
@@ -131,7 +131,7 @@
jump(p0, i0)
"""
es, loop, preamble = self.optimize(loop)
- assert es.short_boxes[preamble.operations[0]]
+ assert es.short_boxes[0][0] == preamble.operations[0]
def test_int_is_true(self):
loop = """
@@ -142,5 +142,14 @@
"""
es, loop, preamble = self.optimize(loop)
op = preamble.operations[0]
- assert es.short_boxes == {op:op}
+ assert es.short_boxes == [(op,op)]
assert es.exported_infos[op].is_constant()
+
+ def test_only_setfield(self):
+ loop = """
+ [p0]
+ setfield_gc(p0, 5, descr=valuedescr)
+ jump(p0)
+ """
+ es, loop, preamble = self.optimize(loop)
+ assert es.short_boxes[0][0] == preamble.operations[0].getarg(1)
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
@@ -235,8 +235,9 @@
infos = {}
for arg in end_args:
infos[arg] = self.optimizer.getinfo(arg)
- for box in sb.short_boxes:
- infos[box] = self.optimizer.getinfo(box)
+ for box, _ in sb.short_boxes:
+ if not isinstance(box, Const):
+ infos[box] = self.optimizer.getinfo(box)
label_args = virtual_state.make_inputargs(end_args, self.optimizer)
self.optimizer._clean_optimization_info(end_args)
self.optimizer._clean_optimization_info(start_label.getarglist())
@@ -300,8 +301,9 @@
self.optimizer.setinfo_from_preamble(source, info)
# import the optimizer state, starting from boxes that can be produced
# by short preamble
- for op, preamble_op in exported_state.short_boxes.items():
- self.ops_to_import[op] = preamble_op
+ for op, preamble_op in exported_state.short_boxes:
+ if not isinstance(op, Const):
+ self.ops_to_import[op] = preamble_op
if preamble_op.is_always_pure():
self.pure(op.getopnum(), PreambleOp(op, preamble_op,
exported_state.exported_infos.get(op, None)))
@@ -311,7 +313,7 @@
if optheap is None:
continue
opinfo = self.optimizer.ensure_ptr_info_arg0(preamble_op)
- pre_info = exported_state.exported_infos[op]
+ pre_info = exported_state.exported_infos.get(op, None)
pop = PreambleOp(op, preamble_op, pre_info)
assert not opinfo.is_virtual()
opinfo._fields[preamble_op.getdescr().get_index()] = pop
More information about the pypy-commit
mailing list