[pypy-svn] r77473 - in pypy/branch/jit-loop-invaraints/pypy/jit/metainterp: . optimizeopt test
hakanardo at codespeak.net
hakanardo at codespeak.net
Wed Sep 29 19:36:46 CEST 2010
Author: hakanardo
Date: Wed Sep 29 19:36:45 2010
New Revision: 77473
Added:
pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py.try1
- copied unchanged from r77374, pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
Modified:
pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py
pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py
pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py
pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py
Log:
Made mess of trying to pass data from a loop to its bridges using VInvariantOpInfo :(
Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py (original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py Wed Sep 29 19:36:45 2010
@@ -3,7 +3,24 @@
from pypy.jit.metainterp.compile import prebuiltNotSpecNode
from pypy.rlib.debug import debug_print
from pypy.jit.metainterp.history import Const
+from pypy.jit.metainterp.optimizeopt.virtualize import AbstractVirtualValue
+class VInvariantOpValue(AbstractVirtualValue):
+ def setup(self, op):
+ self.op = op
+ v = self.optimizer.getvalue(self.keybox)
+ self.intbound = v.intbound
+
+ def get_args_for_fail(self, modifier):
+ if self.box is None and not modifier.already_seen_virtual(self.keybox):
+ modifier.register_virtual_fields(self.keybox, [self.keybox])
+
+ def _make_virtual(self, modifier):
+ return modifier.make_vinvop(self.op)
+
+ def force_box(self):
+ return self.keybox
+
class OptInvariant(Optimization):
"""Move loop invariant code into a preamble.
"""
@@ -74,6 +91,11 @@
box = v.force_box()
if box and box not in self.invariant_boxes:
self.invariant_boxes.append(box)
+ box = op.result
+ vvalue = VInvariantOpValue(self.optimizer, box, op)
+ vvalue.setup(op)
+ del self.optimizer.values[box]
+ self.make_equal_to(box, vvalue)
return
Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py (original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py Wed Sep 29 19:36:45 2010
@@ -354,6 +354,7 @@
assert isinstance(descr, compile.ResumeGuardDescr)
modifier = resume.ResumeDataVirtualAdder(descr, self.resumedata_memo)
newboxes = modifier.finish(self.values, self.pendingfields)
+ debug_print('\ndescr:', descr)
if len(newboxes) > self.metainterp_sd.options.failargs_limit: # XXX be careful here
compile.giveup()
descr.store_final_boxes(op, newboxes)
Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py (original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/resume.py Wed Sep 29 19:36:45 2010
@@ -244,6 +244,9 @@
self.storage = storage
self.memo = memo
+ def make_vinvop(self, op):
+ return VInvariantOpInfo(op)
+
def make_virtual(self, known_class, fielddescrs):
return VirtualInfo(known_class, fielddescrs)
@@ -313,6 +316,8 @@
storage.rd_consts = self.memo.consts
dump_storage(storage, liveboxes)
+ debug_print('liveboxes:', liveboxes)
+ debug_print('liveboxes:', [l.__class__ for l in liveboxes])
return liveboxes[:]
def _number_virtuals(self, liveboxes, values, num_env_virtuals):
@@ -409,6 +414,11 @@
def debug_prints(self):
raise NotImplementedError
+class VFromStartInfo(AbstractVirtualInfo):
+ def __init__(self, box, idx=-1):
+ self.set_content([fieldnums])
+ self.index = idx
+
class AbstractVirtualStructInfo(AbstractVirtualInfo):
def __init__(self, fielddescrs):
self.fielddescrs = fielddescrs
@@ -440,6 +450,23 @@
debug_print("\tvirtualinfo", self.known_class.repr_rpython())
AbstractVirtualStructInfo.debug_prints(self)
+class VInvariantOpInfo(AbstractVirtualInfo):
+ def __init__(self, op):
+ self.op = op
+
+ @specialize.argtype(1)
+ def allocate(self, decoder):
+ #return decoder.allocate_op(self.op)
+ #raise
+ return None
+
+ def debug_prints(self):
+ debug_print("\tVInvariantOpInfo", self.op)
+
+ @specialize.argtype(1)
+ def setfields(self, decoder, array):
+ pass
+
class VStructInfo(AbstractVirtualStructInfo):
def __init__(self, typedescr, fielddescrs):
AbstractVirtualStructInfo.__init__(self, fielddescrs)
@@ -536,6 +563,7 @@
self.cur_numb = self.cur_numb.prev
def _callback_i(self, index, register_index):
+ print "I: ", self.cur_numb.nums[index]
value = self.decode_int(self.cur_numb.nums[index])
self.write_an_int(register_index, value)
@@ -614,6 +642,9 @@
def allocate_with_vtable(self, known_class):
return self.metainterp.execute_and_record(rop.NEW_WITH_VTABLE,
None, known_class)
+ #def allocate_op(self, op):
+ # return self.metainterp.execute_and_record_varargs(
+ # op.opnum, op.args, op.descr)
def allocate_struct(self, typedescr):
return self.metainterp.execute_and_record(rop.NEW, typedescr)
Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py (original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py Wed Sep 29 19:36:45 2010
@@ -356,7 +356,7 @@
assert res == 919
self.check_loop_count(3)
- def test_loop_invariant_mul_bridge_maintaining(self):
+ def test_loop_invariant_mul_bridge_maintaining1(self):
myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
def f(x, y):
res = 0
@@ -376,6 +376,27 @@
'int_sub': 2, 'int_mul': 2, 'int_add': 2,
'jump': 3})
+ def test_loop_invariant_mul_bridge_maintaining2(self):
+ myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
+ def f(x, y):
+ res = 0
+ while y > 0:
+ myjitdriver.can_enter_jit(x=x, y=y, res=res)
+ myjitdriver.jit_merge_point(x=x, y=y, res=res)
+ z = x * x
+ res += z
+ if y<8:
+ res += z
+ y -= 1
+ return res
+ res = self.meta_interp(f, [6, 16])
+ assert res == 828
+ self.check_loop_count(3)
+ self.check_loops({'int_lt': 1, 'int_gt': 1,
+ 'guard_false': 1, 'guard_true': 1,
+ 'int_sub': 2, 'int_mul': 2, 'int_add': 2,
+ 'jump': 3})
+
def test_loop_invariant_intbox(self):
myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
class I:
Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py (original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_virtual.py Wed Sep 29 19:36:45 2010
@@ -12,7 +12,7 @@
def _freeze_(self):
return True
- def test_virtualized(self):
+ def test_virtualized1(self):
myjitdriver = JitDriver(greens = [], reds = ['n', 'node'])
def f(n):
node = self._new()
More information about the Pypy-commit
mailing list