[pypy-svn] pypy jit-short_from_state: move inputargs generation to VirtualState to make it reusable to create the jumpargs
hakanardo
commits-noreply at bitbucket.org
Sun Mar 27 20:30:36 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r42989:96e7b4920fa5
Date: 2011-03-27 20:01 +0200
http://bitbucket.org/pypy/pypy/changeset/96e7b4920fa5/
Log: move inputargs generation to VirtualState to make it reusable to
create the jumpargs
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
@@ -145,6 +145,16 @@
self.state[i].generate_guards(other.state[i], args[i],
cpu, extra_guards)
+ def make_inputargs(self, values):
+ assert len(values) == len(self.state)
+ inputargs = []
+ seen_inputargs = {}
+ for i in range(len(values)):
+ self.state[i].enum_forced_boxes(inputargs, seen_inputargs,
+ values[i])
+ return [a for a in inputargs if not isinstance(a, Const)]
+
+
class VirtualStateAdder(resume.ResumeDataVirtualAdder):
def __init__(self, optimizer):
self.fieldboxes = {}
@@ -233,6 +243,12 @@
if self.level == LEVEL_CONSTANT:
import pdb; pdb.set_trace()
raise NotImplementedError
+
+ def enum_forced_boxes(self, boxes, already_seen, value):
+ key = value.get_key_box()
+ if key not in already_seen:
+ boxes.append(value.force_box())
+ already_seen[value.get_key_box()] = None
class UnrollOptimizer(Optimization):
@@ -271,7 +287,8 @@
try:
inputargs = self.inline(self.cloned_operations,
- loop.inputargs, jump_args)
+ loop.inputargs, jump_args,
+ virtual_state)
except KeyError:
debug_print("Unrolling failed.")
loop.preamble.operations = None
@@ -342,20 +359,15 @@
if op.result:
op.result.forget_value()
- def inline(self, loop_operations, loop_args, jump_args):
+ def inline(self, loop_operations, loop_args, jump_args, virtual_state):
self.inliner = inliner = Inliner(loop_args, jump_args)
-
+
+ # FIXME: Move this to reconstruct
for v in self.optimizer.values.values():
v.last_guard_index = -1 # FIXME: Are there any more indexes stored?
- inputargs = []
- seen_inputargs = {}
- for arg in jump_args:
- boxes = []
- self.getvalue(arg).enum_forced_boxes(boxes, seen_inputargs)
- for a in boxes:
- if not isinstance(a, Const):
- inputargs.append(a)
+ values = [self.getvalue(arg) for arg in jump_args]
+ inputargs = virtual_state.make_inputargs(values)
# This loop is equivalent to the main optimization loop in
# Optimizer.propagate_all_forward
@@ -364,7 +376,8 @@
newop.initarglist(inputargs)
newop = inliner.inline_op(newop, clone=False)
- self.optimizer.first_optimization.propagate_forward(newop)
+ #self.optimizer.first_optimization.propagate_forward(newop)
+ self.optimizer.send_extra_operation(newop)
# Remove jump to make sure forced code are placed before it
newoperations = self.optimizer.newoperations
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -445,6 +445,9 @@
def _generate_guards(self, other, box, cpu, extra_guards):
raise InvalidLoop
+
+ def enum_forced_boxes(self, boxes, already_seen, value):
+ raise NotImplementedError
class AbstractVirtualStructInfo(AbstractVirtualInfo):
def __init__(self, fielddescrs):
@@ -484,6 +487,19 @@
def _generalization_of(self, other):
raise NotImplementedError
+ def enum_forced_boxes(self, boxes, already_seen, value):
+ #FIXME: assert isinstance(value, AbstractVirtualStructValue)
+ key = value.get_key_box()
+ if key in already_seen:
+ return
+ already_seen[key] = None
+ if value.box is None:
+ for i in range(len(self.fielddescrs)):
+ v = value._fields[self.fielddescrs[i]]
+ self.fieldstate[i].enum_forced_boxes(boxes, already_seen, v)
+ else:
+ boxes.append(value.box)
+
class VirtualInfo(AbstractVirtualStructInfo):
def __init__(self, known_class, fielddescrs):
@@ -572,6 +588,21 @@
return False
return True
+ def enum_forced_boxes(self, boxes, already_seen, value):
+ # FIXME: assert isinstance(value, VArrayValue)
+ key = value.get_key_box()
+ if key in already_seen:
+ return
+ already_seen[key] = None
+ if value.box is None:
+ for i in range(len(self.fieldstate)):
+ v = value._items[i]
+ self.fieldstate[i].enum_forced_boxes(boxes, already_seen, v)
+ else:
+ boxes.append(value.box)
+
+
+
class VStrPlainInfo(AbstractVirtualInfo):
"""Stands for the string made out of the characters of all fieldnums."""
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
@@ -52,12 +52,6 @@
def get_key_box(self):
return self.box
- def enum_forced_boxes(self, boxes, already_seen):
- key = self.get_key_box()
- if key not in already_seen:
- boxes.append(self.force_box())
- already_seen[self.get_key_box()] = None
-
def get_cloned(self, optimizer, valuemap, force_if_needed=True):
if self in valuemap:
return valuemap[self]
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -132,18 +132,6 @@
fieldvalue = self._fields[ofs]
fieldvalue.get_args_for_fail(modifier)
- def enum_forced_boxes(self, boxes, already_seen):
- key = self.get_key_box()
- if key in already_seen:
- return
- already_seen[key] = None
- if self.box is None:
- lst = self._get_field_descr_list()
- for ofs in lst:
- self._fields[ofs].enum_forced_boxes(boxes, already_seen)
- else:
- boxes.append(self.box)
-
def clone_for_next_iteration(self, optimizer):
raise NotImplementedError
@@ -247,17 +235,6 @@
def _make_virtual(self, modifier):
return modifier.make_varray(self.arraydescr)
- def enum_forced_boxes(self, boxes, already_seen):
- key = self.get_key_box()
- if key in already_seen:
- return
- already_seen[key] = None
- if self.box is None:
- for itemvalue in self._items:
- itemvalue.enum_forced_boxes(boxes, already_seen)
- else:
- boxes.append(self.box)
-
def clone_for_next_iteration(self, optimizer):
new = VArrayValue(optimizer, self.arraydescr, len(self._items),
self.keybox, self.source_op)
More information about the Pypy-commit
mailing list