[pypy-commit] pypy optresult-unroll: fix the same_as on inputargs I think
fijal
noreply at buildbot.pypy.org
Thu Aug 13 16:40:58 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78970:dd3b2a28fc96
Date: 2015-08-13 16:40 +0200
http://bitbucket.org/pypy/pypy/changeset/dd3b2a28fc96/
Log: fix the same_as on inputargs I think
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
@@ -60,6 +60,8 @@
info.produce_short_preamble_ops(structbox, descr, index, optimizer,
shortboxes)
return
+
+ XXXXX
for structvalue in self._cached_fields_getfield_op.keys():
op = self._cached_fields_getfield_op[structvalue]
if not op:
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
@@ -1,6 +1,6 @@
from rpython.jit.metainterp.resoperation import ResOperation, OpHelpers,\
- rop, AbstractResOp
+ rop, AbstractResOp, AbstractInputArg
from rpython.jit.metainterp.history import Const, make_hashable_int,\
TreeLoop
from rpython.jit.metainterp.optimizeopt import info
@@ -185,12 +185,16 @@
dummy_short_op = ProducedShortOp(None, None)
-class ShortInputArg(AbstractProducedShortOp):
- def __init__(self, preamble_op):
+class ShortInputArg(AbstractShortOp):
+ def __init__(self, res, preamble_op):
+ self.res = res
self.preamble_op = preamble_op
- def produce_op(self, opt, exported_infos):
- pass
+ def add_op_to_short(self, sb):
+ return ProducedShortOp(self, self.preamble_op)
+
+ def produce_op(self, opt, preamble_op, exported_infos, invented_name):
+ assert not invented_name
def __repr__(self):
return "INP(%r)" % (self.preamble_op,)
@@ -213,7 +217,7 @@
for box in inputargs:
if box in label_d:
renamed = OpHelpers.inputarg_from_tp(box.type)
- self.produced_short_boxes[box] = ShortInputArg(renamed)
+ self.potential_ops[box] = ShortInputArg(box, renamed)
optimizer.produce_potential_short_preamble_ops(self)
@@ -317,7 +321,7 @@
def add_heap_op(self, op, getfield_op):
# or an inputarg
- if isinstance(op, Const) or op in self.produced_short_boxes:
+ if isinstance(op, Const):
self.const_short_boxes.append(HeapOp(op, getfield_op))
return # we should not be called from anywhere
self.add_potential_op(op, HeapOp(op, getfield_op))
@@ -352,7 +356,7 @@
def use_box(self, box, preamble_op, optimizer=None):
for arg in preamble_op.getarglist():
- if isinstance(arg, Const):
+ if isinstance(arg, Const) or isinstance(arg, AbstractInputArg):
pass
elif arg.get_forwarded() is None:
pass
@@ -362,7 +366,6 @@
if info is not empty_info:
info.make_guards(arg, self.short)
arg.set_forwarded(None)
- #self.force_info_from(arg) <- XXX?
self.short.append(preamble_op)
if preamble_op.is_ovf():
self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, [], None))
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
@@ -853,17 +853,17 @@
p2sub = new_with_vtable(descr=nodesize2)
setfield_gc(p2sub, i1, descr=valuedescr)
setfield_gc(p2, p2sub, descr=nextdescr)
- # i4 = same_as_i(i1) <- investigate
- jump(i1, p2, p2sub)
- """
- expected = """
- [i1, p2, p10]
- escape_n(i1)
+ i4 = same_as_i(i1)
+ jump(i1, p2, p2sub, i4)
+ """
+ expected = """
+ [i1, p2, p10, i10]
+ escape_n(i10)
p1 = new_with_vtable(descr=nodesize)
p3sub = new_with_vtable(descr=nodesize2)
setfield_gc(p3sub, i1, descr=valuedescr)
setfield_gc(p1, p3sub, descr=nextdescr)
- jump(i1, p1, p3sub)
+ jump(i1, p1, p3sub, i1)
"""
self.optimize_loop(ops, expected, preamble)
@@ -2241,6 +2241,7 @@
"""
expected = """
[p1, i1, i2]
+ setfield_gc(p1, i2, descr=valuedescr)
jump(p1, i1, i2)
"""
# in this case, all setfields are removed, because we can prove
@@ -7347,29 +7348,31 @@
ops = """
[p0, p1, ii, ii2]
i1 = getfield_gc_i(p0, descr=valuedescr)
- i2 = getfield_gc_i(p1, descr=otherdescr)
+ i2 = getfield_gc_i(p1, descr=chardescr)
i3 = int_add(i1, i2)
setfield_gc(p0, ii, descr=valuedescr)
- setfield_gc(p1, ii, descr=otherdescr)
+ setfield_gc(p1, ii, descr=chardescr)
i4 = getfield_gc_i(p0, descr=valuedescr)
- i5 = getfield_gc_i(p1, descr=otherdescr)
+ i5 = getfield_gc_i(p1, descr=chardescr)
jump(p0, p1, ii2, ii)
"""
preamble = """
[p0, p1, ii, ii2]
i1 = getfield_gc_i(p0, descr=valuedescr)
- i2 = getfield_gc_i(p1, descr=otherdescr)
+ i2 = getfield_gc_i(p1, descr=chardescr)
i3 = int_add(i1, i2)
setfield_gc(p0, ii, descr=valuedescr)
- setfield_gc(p1, ii, descr=otherdescr)
- jump(p0, p1, ii2, ii, ii, ii)
- """
- expected = """
- [p0, p1, ii, ii2, i1, i2]
- i3 = int_add(i1, i2)
- setfield_gc(p0, ii, descr=valuedescr)
- setfield_gc(p1, ii, descr=otherdescr)
- jump(p0, p1, ii2, ii, ii, ii)
+ setfield_gc(p1, ii, descr=chardescr)
+ i10 = same_as_i(ii)
+ i11 = same_as_i(ii)
+ jump(p0, p1, ii2, ii, i10, i11)
+ """
+ expected = """
+ [p0, p1, i1, i2, i7, i8]
+ i3 = int_add(i7, i8)
+ setfield_gc(p0, i1, descr=valuedescr)
+ setfield_gc(p1, i1, descr=chardescr)
+ jump(p0, p1, i2, i1, i1, i1)
"""
self.optimize_loop(ops, expected, 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
@@ -474,7 +474,7 @@
preamble = TreeLoop('preamble')
preamble.inputargs = start_state.renamed_inputargs
start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs)
- inputargs = start_state.end_args + loop_info.extra_label_args
+ inputargs = loop_info.label_args[:]
emit_end_label = ResOperation(rop.LABEL, inputargs)
preamble.operations = ([start_label] + preamble_ops +
loop_info.extra_same_as + [emit_end_label])
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
@@ -117,29 +117,29 @@
self.optimizer, force_boxes=True)
extra_jump_args = self.inline_short_preamble(jump_args)
# remove duplicates, removes stuff from used boxes too
- extra_jump_args, used_boxes = self.filter_extra_jump_args(
- self.short_preamble_producer, jump_args,
- extra_jump_args)
- jump_args += extra_jump_args
+ label_args, jump_args = self.filter_extra_jump_args(
+ start_label.getarglist() + self.short_preamble_producer.used_boxes,
+ jump_args + extra_jump_args)
jump_op = ResOperation(rop.JUMP, jump_args)
self.optimizer._newoperations.append(jump_op)
return (UnrollInfo(self.short_preamble_producer.build_short_preamble(),
- used_boxes,
+ label_args,
self.short_preamble_producer.extra_same_as),
self.optimizer._newoperations)
- def filter_extra_jump_args(self, sp, jump_args, extra_jump_args):
+ def filter_extra_jump_args(self, label_args, jump_args):
+ new_label_args = []
+ new_jump_args = []
+ assert len(label_args) == len(jump_args)
d = {}
- for arg in jump_args:
+ for i in range(len(label_args)):
+ arg = label_args[i]
+ if arg in d:
+ continue
+ new_label_args.append(arg)
+ new_jump_args.append(jump_args[i])
d[arg] = None
- new_jump_args = []
- new_used_boxes = []
- for i in range(len(extra_jump_args)):
- if extra_jump_args[i] in d:
- continue
- new_jump_args.append(extra_jump_args[i])
- new_used_boxes.append(sp.used_boxes[i])
- return new_jump_args, new_used_boxes
+ return new_label_args, new_jump_args
def inline_short_preamble(self, jump_args):
sb = self.short_preamble_producer
@@ -222,12 +222,12 @@
""" A state after optimizing the peeled loop, contains the following:
* short_preamble - list of operations that go into short preamble
- * extra_label_args - additional things to put in the label
+ * label_args - additional things to put in the label
* extra_same_as - list of extra same as to add at the end of the preamble
"""
- def __init__(self, short_preamble, extra_label_args, extra_same_as):
+ def __init__(self, short_preamble, label_args, extra_same_as):
self.short_preamble = short_preamble
- self.extra_label_args = extra_label_args
+ self.label_args = label_args
self.extra_same_as = extra_same_as
class ExportedState(LoopInfo):
More information about the pypy-commit
mailing list