[pypy-svn] r62427 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test
fijal at codespeak.net
fijal at codespeak.net
Mon Mar 2 23:13:09 CET 2009
Author: fijal
Date: Mon Mar 2 23:13:06 2009
New Revision: 62427
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/compile.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
Log:
A test and a fix. Note - it's essential to cache based on list type
and not on item type, because otherwise we end up having similar, but
different lists that differ on adtmeths for example
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/compile.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/compile.py Mon Mar 2 23:13:06 2009
@@ -128,7 +128,8 @@
history = metainterp.history
loop.operations = history.operations
close_loop(loop, loop.operations[0], endliveboxes)
- old_loop = optimize.optimize_loop(metainterp.options, old_loops, loop)
+ old_loop = optimize.optimize_loop(metainterp.options, old_loops, loop,
+ metainterp.cpu)
if old_loop is not None:
return old_loop
finish_loop_or_bridge(metainterp, loop, loop.operations[0])
@@ -164,7 +165,8 @@
op = ResOperation(rop.JUMP, endliveboxes, None)
operations.append(op)
#
- old_loop = optimize.optimize_bridge(metainterp.options, old_loops, bridge)
+ old_loop = optimize.optimize_bridge(metainterp.options, old_loops, bridge,
+ metainterp.cpu)
if old_loop is None:
return None
bridge.jump_to = old_loop
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py Mon Mar 2 23:13:06 2009
@@ -49,7 +49,7 @@
self.list_allocations = []
self.setitems = []
- def deal_with_box(self, box, nodes, liveboxes, memo):
+ def deal_with_box(self, box, nodes, liveboxes, memo, cpu):
if isinstance(box, Const) or box not in nodes:
virtual = False
virtualized = False
@@ -66,10 +66,16 @@
ld = instnode.cls.source
assert isinstance(ld, FixedList)
alloc_offset = len(self.list_allocations)
+ ad = ConstInt(ld.arraydescr)
if instnode.cursize == -1:
- xxx
- self.list_allocations.append((ConstInt(ld.arraydescr),
- instnode.cursize))
+ # fish fish fish
+ res = cpu.execute_operation(rop.ARRAYLEN_GC,
+ [instnode.source, ad],
+ 'int')
+ size = res.getint()
+ else:
+ size = instnode.cursize
+ self.list_allocations.append((ad, size))
res = (alloc_offset + 1) << 16
else:
alloc_offset = len(self.allocations)
@@ -77,7 +83,8 @@
res = alloc_offset
memo[box] = res
for ofs, node in instnode.curfields.items():
- num = self.deal_with_box(node.source, nodes, liveboxes, memo)
+ num = self.deal_with_box(node.source, nodes, liveboxes, memo,
+ cpu)
if isinstance(instnode.cls.source, FixedList):
ld = instnode.cls.source
x = (alloc_offset + 1) << 16
@@ -90,7 +97,8 @@
memo[box] = res
liveboxes.append(box)
for ofs, node in instnode.curfields.items():
- num = self.deal_with_box(node.source, nodes, liveboxes, memo)
+ num = self.deal_with_box(node.source, nodes, liveboxes, memo,
+ cpu)
self.setfields.append((res, ofs, num))
else:
res = ~len(liveboxes)
@@ -116,7 +124,6 @@
self.dirtyfields = {}
self.expanded_fields = {}
self.cursize = -1
- #self.origsize = -1
def is_nonzero(self):
return self.cls is not None or self.nonzero
@@ -218,7 +225,7 @@
if self.virtualized: flags += 'V'
return "<InstanceNode %s (%s)>" % (self.source, flags)
-def optimize_loop(options, old_loops, loop):
+def optimize_loop(options, old_loops, loop, cpu=None):
if not options.specialize: # for tests only
if old_loops:
return old_loops[0]
@@ -232,10 +239,10 @@
for old_loop in old_loops:
if perfect_specializer.match_exactly(old_loop):
return old_loop
- perfect_specializer.optimize_loop()
+ perfect_specializer.optimize_loop(cpu)
return None
-def optimize_bridge(options, old_loops, bridge):
+def optimize_bridge(options, old_loops, bridge, cpu=None):
if not options.specialize: # for tests only
return old_loops[0]
@@ -244,7 +251,7 @@
for old_loop in old_loops:
if perfect_specializer.match(old_loop.operations):
perfect_specializer.adapt_for_match(old_loop.operations)
- perfect_specializer.optimize_loop()
+ perfect_specializer.optimize_loop(cpu)
return old_loop
return None # no loop matches
@@ -564,7 +571,7 @@
specnode.expand_boxlist(self.nodes[box], newboxlist, oplist)
return newboxlist
- def optimize_guard(self, op):
+ def optimize_guard(self, op, cpu):
liveboxes = []
storage = AllocationStorage()
memo = {}
@@ -573,7 +580,7 @@
op = op.clone()
for box in old_boxes:
indices.append(storage.deal_with_box(box, self.nodes,
- liveboxes, memo))
+ liveboxes, memo, cpu))
rev_boxes = {}
for i in range(len(liveboxes)):
box = liveboxes[i]
@@ -655,7 +662,7 @@
## instnode.curfields[field] = valuenode
## instnode.cursize += 1
- def optimize_loop(self):
+ def optimize_loop(self, cpu):
#self.ready_results = {}
newoperations = []
exception_might_have_happened = False
@@ -715,14 +722,14 @@
if not exception_might_have_happened:
continue
exception_might_have_happened = False
- newoperations.append(self.optimize_guard(op))
+ newoperations.append(self.optimize_guard(op, cpu))
continue
elif (opnum == rop.GUARD_TRUE or
opnum == rop.GUARD_FALSE):
instnode = self.nodes[op.args[0]]
if instnode.const:
continue
- newoperations.append(self.optimize_guard(op))
+ newoperations.append(self.optimize_guard(op, cpu))
continue
elif opnum == rop.GUARD_CLASS:
instnode = self.nodes[op.args[0]]
@@ -730,7 +737,7 @@
assert op.args[1].equals(instnode.cls.source)
continue
instnode.cls = InstanceNode(op.args[1], const=True)
- newoperations.append(self.optimize_guard(op))
+ newoperations.append(self.optimize_guard(op, cpu))
continue
elif opnum == rop.GUARD_VALUE:
instnode = self.nodes[op.args[0]]
@@ -738,13 +745,13 @@
if instnode.const:
continue
instnode.const = True
- newoperations.append(self.optimize_guard(op))
+ newoperations.append(self.optimize_guard(op, cpu))
continue
elif opnum == rop.GUARD_NONVIRTUALIZED:
instnode = self.nodes[op.args[0]]
if instnode.virtualized or instnode.virtual:
continue
- newoperations.append(self.optimize_guard(op))
+ newoperations.append(self.optimize_guard(op, cpu))
continue
elif opnum == rop.GETFIELD_GC:
instnode = self.nodes[op.args[0]]
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py Mon Mar 2 23:13:06 2009
@@ -93,8 +93,7 @@
cls.main = main
def test_tl_base(self):
- # XXX
- res = self.meta_interp(self.main.im_func, [0, 6], listops=False)
+ res = self.meta_interp(self.main.im_func, [0, 6], listops=True)
assert res == 5040
py.test.skip("re-enable list optimizations")
self.check_loops({'merge_point':1,
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py Mon Mar 2 23:13:06 2009
@@ -142,7 +142,7 @@
frame.s -= 1
return x
- res = self.meta_interp(f, [10])
+ res = self.meta_interp(f, [10], listops=True)
assert res == f(10)
def test_virtual_on_virtualizable(self):
@@ -173,6 +173,7 @@
res = self.meta_interp(f, [30])
assert res == f(30)
+ self.check_loops(getfield_gc=0)
def test_unequal_list_lengths_cannot_be_virtual(self):
jitdriver = JitDriver(greens = [], reds = ['frame', 'n'],
More information about the Pypy-commit
mailing list