[pypy-svn] r78475 - in pypy/branch/jit-unroll-loops/pypy/jit/metainterp: . optimizeopt test
hakanardo at codespeak.net
hakanardo at codespeak.net
Fri Oct 29 16:43:28 CEST 2010
Author: hakanardo
Date: Fri Oct 29 16:43:27 2010
New Revision: 78475
Modified:
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
(armin, hakanardo) separate into 3 loops
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 16:43:27 2010
@@ -9,8 +9,11 @@
distinction anymore)"""
def setup(self, virtuals):
- self.enabled = virtuals
-
+ self.enabled = virtuals
+ self.cloned_operations = []
+ for op in self.optimizer.loop.operations:
+ self.cloned_operations.append(op.clone())
+
def propagate_forward(self, op):
if not self.enabled:
self.emit_operation(op)
@@ -22,8 +25,7 @@
self.optimizer.newoperations = []
jump_args = op.getarglist()
op.initarglist([])
- inputargs = self.inline(loop.operations,
- #loop.preamble.operations + [op],
+ inputargs = self.inline(self.cloned_operations,
loop.inputargs, jump_args)
loop.inputargs = inputargs
jmp = ResOperation(rop.JUMP, loop.inputargs[:], None)
@@ -51,27 +53,24 @@
self.snapshot_map ={None: None}
inputargs = []
- seen = {}
+ seen_inputargs = {}
for arg in jump_args:
boxes = []
- self.getvalue(arg).enum_forced_boxes(boxes, seen)
+ self.getvalue(arg).enum_forced_boxes(boxes, seen_inputargs)
for a in boxes:
if not isinstance(a, Const):
inputargs.append(a)
- for op in loop_operations:
+ for newop in loop_operations:
#import pdb; pdb.set_trace()
- newop = op.clone()
newop.initarglist([self.inline_arg(a) for a in newop.getarglist()])
- if op.result:
- newop.result = op.result.clonebox()
- argmap[op.result] = newop.result
+ if newop.result:
+ old_result = newop.result
+ newop.result = newop.result.clonebox()
+ argmap[old_result] = newop.result
+
descr = newop.getdescr()
if isinstance(descr, ResumeGuardDescr):
- orgdescr = op.getdescr()
- assert isinstance(orgdescr, ResumeGuardDescr)
- orgdescr.rd_snapshot = None #FIXME: In the right place?
- descr.rd_numb = None
descr.rd_snapshot = self.inline_snapshot(descr.rd_snapshot)
if newop.getopnum() == rop.JUMP:
@@ -83,34 +82,55 @@
newop.initarglist(args + inputargs[len(args):])
#print 'P: ', str(newop)
- current = len(self.optimizer.newoperations)
+ #current = len(self.optimizer.newoperations)
self.emit_operation(newop)
+
# FIXME: force_lazy_setfield in heap.py may reorder last ops
- current = max(current-1, 0)
-
- for op in self.optimizer.newoperations[current:]:
- #print 'E: ', str(op)
- if op.is_guard():
- descr = op.getdescr()
- assert isinstance(descr, ResumeGuardDescr)
- descr.rd_snapshot = None #FIXME: In the right place?
- args = op.getarglist()
- if op.is_guard():
- args = args + op.getfailargs()
- #if op.getopnum() == rop.SETFIELD_GC:
- # import pdb; pdb.set_trace()
- for a in args:
- if not isinstance(a, Const) and a in self.optimizer.values:
- v = self.getvalue(a)
- if v.fromstart and a not in inputargs:
+ #current = max(current-1, 0)
+
+ jmp = self.optimizer.newoperations[-1]
+ assert jmp.getopnum() == rop.JUMP
+ jumpargs = jmp.getarglist()
+ for op in self.optimizer.newoperations:
+ print 'E: ', str(op)
+ #if op.is_guard():
+ # descr = op.getdescr()
+ # assert isinstance(descr, ResumeGuardDescr)
+ # descr.rd_snapshot = None #FIXME: In the right place?
+ args = op.getarglist()
+ if op.is_guard():
+ #new_failargs = []
+ #for a in op.getfailargs():
+ # new_failargs.append(self.getvalue(self.inline_arg(a)).force_box())
+ #op.setfailargs(new_failargs)
+
+ args = args + op.getfailargs()
+ print "Args: ", args
+
+ for a in args:
+ if not isinstance(a, Const) and a in self.optimizer.values:
+ v = self.getvalue(a)
+ if v.fromstart and not v.is_constant():
+ a = v.force_box()
+ if a not in inputargs:
inputargs.append(a)
- jmp = self.optimizer.newoperations[-1]
- if jmp.getopnum() == rop.JUMP:
- newval = self.getvalue(argmap[a])
- boxes = jmp.getarglist()
- boxes.append(newval.force_box())
- jmp.initarglist(boxes)
+ newval = self.getvalue(argmap[a])
+ jumpargs.append(newval.force_box())
+
+
+ #boxes = []
+ #v.enum_forced_boxes(boxes, seen_inputargs)
+ #for b in boxes:
+ # if not isinstance(b, Const):
+ # inputargs.append(b)
+ # jumpargs.append(b)
+
+ #newval = self.getvalue(argmap[a])
+ #jumpargs.append(newval.force_box())
+ jmp.initarglist(jumpargs)
+
+ print "Inputargs: ", inputargs
return inputargs
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/resume.py Fri Oct 29 16:43:27 2010
@@ -298,7 +298,7 @@
self.liveboxes_from_env = liveboxes_from_env
self.liveboxes = {}
storage.rd_numb = numb
- #storage.rd_snapshot = None FIXME!!
+ storage.rd_snapshot = None
# collect liveboxes and virtuals
n = len(liveboxes_from_env) - v
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/oparser.py Fri Oct 29 16:43:27 2010
@@ -31,6 +31,9 @@
def getopnum(self):
return self.OPNUM
+ def clone(self):
+ return ESCAPE_OP(self.OPNUM, self.getarglist()[:], self.result, self.getdescr())
+
class ExtendedTreeLoop(TreeLoop):
def getboxes(self):
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py Fri Oct 29 16:43:27 2010
@@ -3092,8 +3092,8 @@
jump(i2)
'''
expected = '''
- [i0]
- jump(1)
+ []
+ jump()
'''
self.optimize_loop(ops, 'Not', expected)
@@ -3109,28 +3109,30 @@
jump(i2)
'''
expected = '''
- [i0]
- jump(3)
+ []
+ jump()
'''
self.optimize_loop(ops, 'Not', expected)
def test_arraycopy_not_virtual(self):
ops = '''
- [p0]
+ []
p1 = new_array(3, descr=arraydescr)
p2 = new_array(3, descr=arraydescr)
setarrayitem_gc(p1, 2, 10, descr=arraydescr)
setarrayitem_gc(p2, 2, 13, descr=arraydescr)
call(0, p1, p2, 0, 0, 3, descr=arraycopydescr)
- jump(p2)
+ escape(p2)
+ jump()
'''
expected = '''
- [p0]
+ []
p2 = new_array(3, descr=arraydescr)
setarrayitem_gc(p2, 2, 10, descr=arraydescr)
- jump(p2)
+ escape(p2)
+ jump()
'''
- self.optimize_loop(ops, 'Not', expected)
+ self.optimize_loop(ops, '', expected)
def test_arraycopy_no_elem(self):
""" this was actually observed in the wild
More information about the Pypy-commit
mailing list