[pypy-svn] pypy jit-short_from_state: make the inputarg layout depend on the virtualstate only and not on the current values
hakanardo
commits-noreply at bitbucket.org
Tue Apr 26 19:54:03 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r43644:ecf14bebdc38
Date: 2011-04-26 19:53 +0200
http://bitbucket.org/pypy/pypy/changeset/ecf14bebdc38/
Log: make the inputarg layout depend on the virtualstate only and not on
the current values
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
@@ -9,6 +9,7 @@
from pypy.jit.metainterp.optimizeutil import InvalidLoop
from pypy.jit.metainterp.optimizeopt.intutils import IntBound
from pypy.jit.metainterp.resoperation import rop, ResOperation
+from pypy.rlib.objectmodel import we_are_translated
class AbstractVirtualStateInfo(resume.AbstractVirtualInfo):
position = -1
@@ -24,7 +25,7 @@
def _generate_guards(self, other, box, cpu, extra_guards):
raise InvalidLoop
- def enum_forced_boxes(self, boxes, already_seen, value):
+ def enum_forced_boxes(self, boxes, value):
raise NotImplementedError
def enum(self, virtual_state):
@@ -63,18 +64,14 @@
def _generalization_of(self, other):
raise NotImplementedError
- def enum_forced_boxes(self, boxes, already_seen, value):
+ def enum_forced_boxes(self, boxes, value):
assert isinstance(value, virtualize.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)
+ assert value.is_virtual()
+ for i in range(len(self.fielddescrs)):
+ v = value._fields[self.fielddescrs[i]]
+ s = self.fieldstate[i]
+ if s.position > self.position:
+ s.enum_forced_boxes(boxes, v)
def _enum(self, virtual_state):
for s in self.fieldstate:
@@ -121,18 +118,14 @@
return False
return True
- def enum_forced_boxes(self, boxes, already_seen, value):
+ def enum_forced_boxes(self, boxes, value):
assert isinstance(value, virtualize.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)
+ assert value.is_virtual()
+ for i in range(len(self.fieldstate)):
+ v = value._items[i]
+ s = self.fieldstate[i]
+ if s.position > self.position:
+ s.enum_forced_boxes(boxes, v)
def _enum(self, virtual_state):
for s in self.fieldstate:
@@ -150,6 +143,7 @@
self.constbox = value.box
else:
self.constbox = None
+ self.position_in_notvirtuals = -1
def generalization_of(self, other):
# XXX This will always retrace instead of forcing anything which
@@ -225,22 +219,23 @@
import pdb; pdb.set_trace()
raise NotImplementedError
- def enum_forced_boxes(self, boxes, already_seen, value):
+ def enum_forced_boxes(self, boxes, value):
if self.level == LEVEL_CONSTANT:
return
- key = value.get_key_box()
- if key not in already_seen:
- boxes.append(value.force_box())
- already_seen[value.get_key_box()] = None
+ assert 0 <= self.position_in_notvirtuals
+ boxes[self.position_in_notvirtuals] = value.force_box()
def _enum(self, virtual_state):
+ if self.level == LEVEL_CONSTANT:
+ return
+ self.position_in_notvirtuals = len(virtual_state.notvirtuals)
virtual_state.notvirtuals.append(self)
class VirtualState(object):
def __init__(self, state):
self.state = state
self.info_counter = -1
- self.notvirtuals = []
+ self.notvirtuals = [] # FIXME: We dont need this list, only it's length
for s in state:
s.enum(self)
@@ -259,17 +254,20 @@
def make_inputargs(self, values, keyboxes=False):
assert len(values) == len(self.state)
- inputargs = []
- seen_inputargs = {}
+ inputargs = [None] * len(self.notvirtuals)
for i in range(len(values)):
- self.state[i].enum_forced_boxes(inputargs, seen_inputargs,
- values[i])
-
+ self.state[i].enum_forced_boxes(inputargs, values[i])
+
if keyboxes:
- for value in values:
- box = value.get_key_box()
- if box not in inputargs and not isinstance(box, Const):
+ for i in range(len(values)):
+ if not isinstance(self.state[i], NotVirtualStateInfo):
+ box = values[i].get_key_box()
+ assert not isinstance(box, Const)
inputargs.append(box)
+
+ if not we_are_translated():
+ assert len(set(inputargs)) == len(inputargs)
+ assert None not in inputargs
return inputargs
@@ -310,7 +308,10 @@
for box in jump_args]
for value in values:
- value.get_args_for_fail(self)
+ if value.is_virtual():
+ value.get_args_for_fail(self)
+ else:
+ self.make_not_virtual(value)
return VirtualState([self.state(box) for box in jump_args])
def make_not_virtual(self, value):
More information about the Pypy-commit
mailing list