[pypy-svn] r78457 - pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt
arigo at codespeak.net
arigo at codespeak.net
Fri Oct 29 13:26:45 CEST 2010
Author: arigo
Date: Fri Oct 29 13:26:43 2010
New Revision: 78457
Modified:
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py
Log:
(hakanardo, arigo)
Change the interface of get_forced_boxes() to enum_forced_boxes().
Implement it for VStrings too.
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py Fri Oct 29 13:26:43 2010
@@ -16,7 +16,7 @@
OptIntBounds(),
OptRewrite(),
OptVirtualize(),
-# OptString(),
+ OptString(),
OptHeap(),
]
optimizer = Optimizer(metainterp_sd, loop, optimizations, virtuals)
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py Fri Oct 29 13:26:43 2010
@@ -47,14 +47,11 @@
def get_key_box(self):
return self.box
- # FIXME: Reuse get_args_for_fail instead?
- def get_forced_boxes(self, already_seen):
+ def enum_forced_boxes(self, boxes, already_seen):
key = self.get_key_box()
- if key in already_seen:
- return []
- box = self.force_box()
- already_seen.append(self.get_key_box())
- return [box]
+ if key not in already_seen:
+ boxes.append(self.force_box())
+ already_seen[self.get_key_box()] = None
def get_args_for_fail(self, modifier):
pass
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py Fri Oct 29 13:26:43 2010
@@ -108,6 +108,17 @@
for value in self._chars:
value.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.append(key)
+ if self.box is None:
+ for box in self._chars:
+ box.enum_forced_boxes(boxes, already_seen)
+ else:
+ boxes.append(self.box)
+
def _make_virtual(self, modifier):
return modifier.make_vstrplain()
@@ -149,6 +160,17 @@
self.left.get_args_for_fail(modifier)
self.right.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.append(key)
+ if self.box is None:
+ self.left.enum_forced_boxes(boxes, already_seen)
+ self.right.enum_forced_boxes(boxes, already_seen)
+ else:
+ boxes.append(self.box)
+
def _make_virtual(self, modifier):
return modifier.make_vstrconcat()
@@ -194,6 +216,18 @@
self.vstart.get_args_for_fail(modifier)
self.vlength.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.append(key)
+ if self.box is None:
+ self.vstr.enum_forced_boxes(boxes, already_seen)
+ self.vstart.enum_forced_boxes(boxes, already_seen)
+ self.vlength.enum_forced_boxes(boxes, already_seen)
+ else:
+ boxes.append(self.box)
+
def _make_virtual(self, modifier):
return modifier.make_vstrslice()
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py Fri Oct 29 13:26:43 2010
@@ -51,9 +51,11 @@
self.snapshot_map ={None: None}
inputargs = []
- seen = []
+ seen = {}
for arg in jump_args:
- for a in self.getvalue(arg).get_forced_boxes(seen):
+ boxes = []
+ self.getvalue(arg).enum_forced_boxes(boxes, seen)
+ for a in boxes:
if not isinstance(a, Const):
inputargs.append(a)
@@ -75,8 +77,9 @@
if newop.getopnum() == rop.JUMP:
args = []
#for arg in newop.getarglist():
- for arg in [argmap[a] for a in inputargs]:
- args.extend(self.getvalue(arg).get_forced_boxes([]))
+ for arg in inputargs:
+ arg = argmap[arg]
+ self.getvalue(arg).enum_forced_boxes(args, {})
newop.initarglist(args + inputargs[len(args):])
#print 'P: ', str(newop)
@@ -105,8 +108,9 @@
jmp = self.optimizer.newoperations[-1]
if jmp.getopnum() == rop.JUMP:
newval = self.getvalue(argmap[a])
- newarg = newval.get_forced_boxes([])
- jmp.initarglist(jmp.getarglist() + newarg)
+ boxes = jmp.getarglist()[:]
+ newval.enum_forced_boxes(boxes, {})
+ jmp.initarglist(boxes)
return inputargs
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py Fri Oct 29 13:26:43 2010
@@ -121,20 +121,17 @@
fieldvalue = self._fields[ofs]
fieldvalue.get_args_for_fail(modifier)
- def get_forced_boxes(self, already_seen):
+ def enum_forced_boxes(self, boxes, already_seen):
key = self.get_key_box()
if key in already_seen:
- return []
- already_seen.append(key)
+ return
+ already_seen[key] = None
if self.box is None:
lst = self._get_field_descr_list()
- fieldboxes = []
for ofs in lst:
- boxes = self._fields[ofs].get_forced_boxes(already_seen)
- fieldboxes.extend(boxes)
- return fieldboxes
+ self._fields[ofs].enum_forced_boxes(boxes, already_seen)
else:
- return [self.box]
+ boxes.append(self.box)
class VirtualValue(AbstractVirtualStructValue):
@@ -208,18 +205,16 @@
def _make_virtual(self, modifier):
return modifier.make_varray(self.arraydescr)
- def get_forced_boxes(self, already_seen):
+ def enum_forced_boxes(self, boxes, already_seen):
key = self.get_key_box()
if key in already_seen:
- return []
+ return
already_seen.append(key)
if self.box is None:
- boxes = []
for itemvalue in self._items:
- boxes.extend(itemvalue.get_forced_boxes(already_seen))
- return boxes
+ itemvalue.enum_forced_boxes(boxes, already_seen)
else:
- return [self.box]
+ boxes.append(self.box)
class __extend__(SpecNode):
More information about the Pypy-commit
mailing list