Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79291:45f5f8d0c2c8
Date: 2015-08-30 12:07 +0200
http://bitbucket.org/pypy/pypy/changeset/45f5f8d0c2c8/
Log: fix some damage + force args early for preamble
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
@@ -473,11 +473,6 @@
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/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -206,9 +206,6 @@
def setup(self):
pass
- def force_at_end_of_preamble(self):
- pass
-
# Called after last operation has been propagated to flush out any
posponed ops
def flush(self):
pass
@@ -296,10 +293,6 @@
return
self.replaces_guard[op] = value.last_guard_pos
- def force_at_end_of_preamble(self):
- for o in self.optimizations:
- o.force_at_end_of_preamble()
-
def force_box_for_end_of_preamble(self, box):
if box.type == 'r':
info = self.getptrinfo(box)
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
@@ -343,7 +343,10 @@
empty_info = EmptyInfo()
-class ShortPreambleBuilder(object):
+class AbstractShortPreambleBuilder(object):
+ pass
+
+class ShortPreambleBuilder(AbstractShortPreambleBuilder):
""" ShortPreambleBuilder is used during optimizing of the peeled loop,
starting from short_boxes exported from the preamble. It will build
the short preamble and necessary extra label arguments
@@ -413,3 +416,6 @@
TreeLoop.check_consistency_of(self.short_inputargs,
self.short + [jump_op], check_descr=False)
return [label_op] + self.short + [jump_op]
+
+class ExtendedShortPreambleBuilder(AbstractShortPreambleBuilder):
+ pass
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
@@ -4013,9 +4013,9 @@
p3 = force_token()
#
p2 = new_with_vtable(descr=vref_descr)
+ setfield_gc(p2, p3, descr=virtualtokendescr)
+ setfield_gc(p2, NULL, descr=virtualforceddescr)
setfield_gc(p0, p2, descr=nextdescr)
- setfield_gc(p2, NULL, descr=virtualforceddescr)
- setfield_gc(p2, p3, descr=virtualtokendescr)
#
call_may_force_n(i1, descr=mayforcevirtdescr)
guard_not_forced() [p2, i1]
@@ -4024,9 +4024,9 @@
setfield_gc(p2, NULL, descr=virtualtokendescr)
p1 = new_with_vtable(descr=nodesize)
p1b = new_with_vtable(descr=nodesize)
- setfield_gc(p2, p1, descr=virtualforceddescr)
setfield_gc(p1b, i1, descr=valuedescr)
setfield_gc(p1, p1b, descr=nextdescr)
+ setfield_gc(p2, p1, descr=virtualforceddescr)
jump(p0, i1)
"""
# the point of this test is that 'i1' should show up in the fail_args
@@ -4686,8 +4686,8 @@
[i0, p0]
p1 = new_array(i0, descr=gcarraydescr)
i1 = arraylen_gc(p1)
+ ifoo = arraylen_gc(p0, descr=gcarraydescr)
setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
- ifoo = arraylen_gc(p0, descr=gcarraydescr)
jump(i0, p0)
"""
self.optimize_loop(ops, expected)
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
@@ -2,7 +2,7 @@
import sys
from rpython.jit.metainterp.history import Const, TargetToken, JitCellToken
from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\
- ShortPreambleBuilder, PreambleOp
+ ShortPreambleBuilder, ExtendedShortPreambleBuilder, PreambleOp
from rpython.jit.metainterp.optimizeopt import info, intutils
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
Optimization, LoopInfo, MININT, MAXINT
@@ -121,13 +121,15 @@
flush=False)
label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
extra_same_as = self.short_preamble_producer.extra_same_as[:]
+ args = state.virtual_state.make_inputargs(
+ [self.get_box_replacement(x) for x in end_jump.getarglist()],
+ self.optimizer, force_boxes=True)
+ for arg in args:
+ self.optimizer.force_box(arg)
target_token = self.finalize_short_preamble(label_op,
state.virtual_state)
label_op.setdescr(target_token)
# force the boxes for virtual state to match
- state.virtual_state.make_inputargs(
- [self.get_box_replacement(x) for x in end_jump.getarglist()],
- self.optimizer, force_boxes=True)
new_virtual_state = self.jump_to_existing_trace(end_jump)
if new_virtual_state is not None:
celltoken = start_label.getdescr()
@@ -153,7 +155,7 @@
return self.jump_to_preamble(cell_token, jump_op, info)
# force all the information that does not go to the short
# preamble at all
- self.optimizer.force_at_end_of_preamble()
+ self.optimizer.flush()
for a in jump_op.getarglist():
self.optimizer.force_box_for_end_of_preamble(a)
vs = self.jump_to_existing_trace(jump_op)
@@ -196,7 +198,7 @@
target_token.virtual_state = virtual_state
target_token.short_preamble = short_preamble
jitcelltoken.target_tokens.append(target_token)
- self.short_preamble_producer = None # no more boxes
+ self.short_preamble_producer = ExtendedShortPreambleBuilder()
label_op.initarglist(label_op.getarglist() + sb.used_boxes)
return target_token
@@ -275,7 +277,7 @@
def export_state(self, start_label, original_label_args,
renamed_inputargs):
end_args = [self.optimizer.force_box_for_end_of_preamble(a)
for a in original_label_args]
- self.optimizer.force_at_end_of_preamble()
+ self.optimizer.flush()
virtual_state = self.get_virtual_state(end_args)
end_args = [self.get_box_replacement(arg) for arg in end_args]
infos = {}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit