[pypy-commit] pypy jit-short_from_state: started to move the handling of short_boxes into a class of its own
hakanardo
noreply at buildbot.pypy.org
Wed Jul 20 10:19:38 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r45764:a994ad085d26
Date: 2011-07-18 09:57 +0200
http://bitbucket.org/pypy/pypy/changeset/a994ad085d26/
Log: started to move the handling of short_boxes into a class of its own
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -117,8 +117,7 @@
cf._cached_fields[structvalue2] = fieldvalue2
return cf
- def produce_potential_short_preamble_ops(self, optimizer,
- potential_ops, descr):
+ def produce_potential_short_preamble_ops(self, optimizer, shortboxes, descr):
if self._lazy_setfield is not None:
return
for structvalue in self._cached_fields_getfield_op.keys():
@@ -126,20 +125,19 @@
if op and structvalue in self._cached_fields:
if op.getopnum() == rop.SETFIELD_GC:
result = op.getarg(1)
- if result in potential_ops and potential_ops[result] is None:
+ if result in shortboxes.potential_ops and \
+ shortboxes.potential_ops[result] is None:
newresult = result.clonebox()
optimizer.make_equal_to(newresult, optimizer.getvalue(result))
result = newresult
# XXX this will not allow for chains of operations
getop = ResOperation(rop.GETFIELD_GC, [op.getarg(0)],
result, op.getdescr())
- potential_ops[result] = getop
+ shortboxes.add_potential(getop)
self._cached_fields_getfield_op[structvalue] = getop
self._cached_fields[structvalue] = optimizer.getvalue(result)
elif op.result is not None:
- potential_ops[op.result] = op
-
-
+ shortboxes.add_potential(op)
class BogusPureField(JitException):
pass
@@ -182,15 +180,13 @@
return new
- def produce_potential_short_preamble_ops(self, potential_ops):
+ def produce_potential_short_preamble_ops(self, sb):
for descr, d in self.cached_fields.items():
- d.produce_potential_short_preamble_ops(self.optimizer,
- potential_ops, descr)
+ d.produce_potential_short_preamble_ops(self.optimizer, sb, descr)
for descr, submap in self.cached_arrayitems.items():
for index, d in submap.items():
- d.produce_potential_short_preamble_ops(self.optimizer,
- potential_ops, descr)
+ d.produce_potential_short_preamble_ops(self.optimizer, sb, descr)
def clean_caches(self):
del self._lazy_setfields_and_arrayitems[:]
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -317,9 +317,6 @@
def produce_potential_short_preamble_ops(self, potential_ops):
pass
-class BoxNotProducable(Exception):
- pass
-
class Optimizer(Optimization):
def __init__(self, metainterp_sd, loop, optimizations=None):
@@ -429,41 +426,11 @@
return new
- def produce_potential_short_preamble_ops(self, potential_ops):
+ def produce_potential_short_preamble_ops(self, sb):
for op in self.emitted_pure_operations:
- potential_ops[op.result] = op
+ sb.add_potential(op)
for opt in self.optimizations:
- opt.produce_potential_short_preamble_ops(potential_ops)
-
- def produce_short_preamble_ops(self, surviving_boxes):
- potential_ops = {}
- self.produce_potential_short_preamble_ops(potential_ops)
-
- short_boxes = {}
- for box in surviving_boxes:
- short_boxes[box] = None
-
- for box in potential_ops.keys():
- try:
- self.produce_short_preamble_box(box, short_boxes,
- potential_ops)
- except BoxNotProducable:
- pass
- return short_boxes
-
- def produce_short_preamble_box(self, box, short_boxes, potential_ops):
- if box in short_boxes:
- return
- if isinstance(box, Const):
- return
- if box in potential_ops:
- op = potential_ops[box]
- for arg in op.getarglist():
- self.produce_short_preamble_box(arg, short_boxes,
- potential_ops)
- short_boxes[box] = op
- else:
- raise BoxNotProducable
+ opt.produce_potential_short_preamble_ops(sb)
def turned_constant(self, value):
for o in self.optimizations:
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -27,10 +27,9 @@
value.get_cloned(new, valuemap)
return new
- def produce_potential_short_preamble_ops(self, potential_ops):
+ def produce_potential_short_preamble_ops(self, sb):
for op in self.loop_invariant_producer.values():
- potential_ops[op.result] = op
-
+ sb.add_potential(op)
def propagate_forward(self, op):
args = self.optimizer.make_args_key(op)
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -1,5 +1,5 @@
from pypy.jit.metainterp.optimizeopt.optimizer import *
-from pypy.jit.metainterp.optimizeopt.virtualstate import VirtualStateAdder
+from pypy.jit.metainterp.optimizeopt.virtualstate import VirtualStateAdder, ShortBoxes
from pypy.jit.metainterp.resoperation import rop, ResOperation
from pypy.jit.metainterp.compile import ResumeGuardDescr
from pypy.jit.metainterp.resume import Snapshot
@@ -195,8 +195,7 @@
if const:
self.constant_inputargs[box] = const
- sb = self.optimizer.produce_short_preamble_ops(inputargs +
- self.constant_inputargs.keys())
+ sb = ShortBoxes(self.optimizer, inputargs + self.constant_inputargs.keys())
self.short_boxes = sb
preamble_optimizer = self.optimizer
loop.preamble.quasi_immutable_deps = (
@@ -210,13 +209,7 @@
debug_print('inputargs: ' + args)
args = ", ".join([logops.repr_of_arg(arg) for arg in short_inputargs])
debug_print('short inputargs: ' + args)
- debug_start('jit-short-boxes')
- for box, op in self.short_boxes.items():
- if op:
- debug_print(logops.repr_of_arg(box) + ': ' + logops.repr_of_resop(op))
- else:
- debug_print(logops.repr_of_arg(box) + ': None')
- debug_stop('jit-short-boxes')
+ self.short_boxes.debug_print(logops)
# Force virtuals amoung the jump_args of the preamble to get the
# operations needed to setup the proper state of those virtuals
@@ -242,7 +235,7 @@
for op in inputarg_setup_ops:
self.optimizer.send_extra_operation(op)
seen = {}
- for op in self.short_boxes.values():
+ for op in self.short_boxes.operations():
self.ensure_short_op_emitted(op, self.optimizer, seen)
if op and op.result:
value = preamble_optimizer.getvalue(op.result)
@@ -334,10 +327,9 @@
for box, const in self.constant_inputargs.items():
short_seen[box] = True
- for result, op in self.short_boxes.items():
+ for op in self.short_boxes.operations():
if op is not None:
- assert result is op.result
- if len(self.getvalue(result).make_guards(result)) > 0:
+ if len(self.getvalue(op.result).make_guards(op.result)) > 0:
self.add_op_to_short(op, short, short_seen, False, True)
# This loop is equivalent to the main optimization loop in
@@ -427,7 +419,7 @@
return
for a in op.getarglist():
if not isinstance(a, Const) and a not in seen:
- self.ensure_short_op_emitted(self.short_boxes[a], optimizer, seen)
+ self.ensure_short_op_emitted(self.short_boxes.producer(a), optimizer, seen)
optimizer.send_extra_operation(op)
seen[op.result] = True
if op.is_ovf():
@@ -444,13 +436,13 @@
return None
for a in op.getarglist():
if not isinstance(a, Const) and a not in short_seen:
- self.add_op_to_short(self.short_boxes[a], short, short_seen,
+ self.add_op_to_short(self.short_boxes.producer(a), short, short_seen,
emit, guards_needed)
if op.is_guard():
descr = self.start_resumedescr.clone_if_mutable()
op.setdescr(descr)
- if guards_needed and op.result in self.short_boxes:
+ if guards_needed and self.short_boxes.has_producer(op.result):
value_guards = self.getvalue(op.result).make_guards(op.result)
else:
value_guards = []
@@ -482,7 +474,7 @@
if box in self.boxes_created_this_iteration:
return
- short_op = self.short_boxes[box]
+ short_op = self.short_boxes.producer(box)
newresult = self.add_op_to_short(short_op, short, short_seen)
short_jumpargs.append(short_op.result)
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -431,3 +431,55 @@
def make_varray(self, arraydescr):
return VArrayStateInfo(arraydescr)
+class BoxNotProducable(Exception):
+ pass
+
+class ShortBoxes(object):
+ def __init__(self, optimizer, surviving_boxes):
+ self.potential_ops = {}
+ optimizer.produce_potential_short_preamble_ops(self)
+
+ self.short_boxes = {}
+ for box in surviving_boxes:
+ self.short_boxes[box] = None
+
+ for box in self.potential_ops.keys():
+ try:
+ self.produce_short_preamble_box(box)
+ except BoxNotProducable:
+ pass
+
+ def produce_short_preamble_box(self, box):
+ if box in self.short_boxes:
+ return
+ if isinstance(box, Const):
+ return
+ if box in self.potential_ops:
+ op = self.potential_ops[box]
+ for arg in op.getarglist():
+ self.produce_short_preamble_box(arg)
+ self.short_boxes[box] = op
+ else:
+ raise BoxNotProducable
+
+ def add_potential(self, op):
+ self.potential_ops[op.result] = op
+
+ def debug_print(self, logops):
+ debug_start('jit-short-boxes')
+ for box, op in self.short_boxes.items():
+ if op:
+ debug_print(logops.repr_of_arg(box) + ': ' + logops.repr_of_resop(op))
+ else:
+ debug_print(logops.repr_of_arg(box) + ': None')
+ debug_stop('jit-short-boxes')
+
+ def operations(self):
+ return self.short_boxes.values()
+
+ def producer(self, box):
+ return self.short_boxes[box]
+
+ def has_producer(self, box):
+ return box in self.short_boxes
+
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -2799,9 +2799,6 @@
self.check_loops(arraylen_gc=1)
-
-
-
class TestOOtype(BasicTests, OOJitMixin):
def test_oohash(self):
More information about the pypy-commit
mailing list