Author: Hakan Ardo <[email protected]>
Branch: jit-targets
Changeset: r49572:37eed202c113
Date: 2011-11-20 11:18 +0100
http://bitbucket.org/pypy/pypy/changeset/37eed202c113/
Log: centralize the unrolling call to optimizeopt
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -54,18 +54,6 @@
# ____________________________________________________________
-class FakeDescr(compile.ResumeGuardDescr):
- class rd_snapshot:
- class prev:
- prev = None
- boxes = []
- boxes = []
- def clone_if_mutable(self):
- return FakeDescr()
- def __eq__(self, other):
- return isinstance(other, Storage) or isinstance(other, FakeDescr)
-
-
class BaseTestWithUnroll(BaseTest):
enable_opts =
"intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
@@ -79,49 +67,8 @@
expected_preamble = self.parse(expected_preamble)
if expected_short:
expected_short = self.parse(expected_short)
- operations = loop.operations
- jumpop = operations[-1]
- assert jumpop.getopnum() == rop.JUMP
- inputargs = loop.inputargs
-
- jump_args = jumpop.getarglist()[:]
- operations = operations[:-1]
- cloned_operations = [op.clone() for op in operations]
-
- preamble = TreeLoop('preamble')
- preamble.inputargs = inputargs
- preamble.start_resumedescr = FakeDescr()
-
- token = JitCellToken()
- preamble.operations = [ResOperation(rop.LABEL, inputargs, None,
descr=TargetToken(token))] + \
- operations + \
- [ResOperation(rop.JUMP, jump_args, None,
descr=token)]
- self._do_optimize_loop(preamble, call_pure_results)
-
- assert preamble.operations[-1].getopnum() == rop.LABEL
-
- inliner = Inliner(inputargs, jump_args)
- loop.start_resumedescr = preamble.start_resumedescr
- loop.operations = [preamble.operations[-1]] + \
- [inliner.inline_op(op, clone=False) for op in
cloned_operations] + \
- [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a
in jump_args],
- None, descr=token)]
- #[inliner.inline_op(jumpop)]
- assert loop.operations[-1].getopnum() == rop.JUMP
- assert loop.operations[0].getopnum() == rop.LABEL
- loop.inputargs = loop.operations[0].getarglist()
-
- self._do_optimize_loop(loop, call_pure_results)
- extra_same_as = []
- while loop.operations[0].getopnum() != rop.LABEL:
- extra_same_as.append(loop.operations[0])
- del loop.operations[0]
-
- # Hack to prevent random order of same_as ops
- extra_same_as.sort(key=lambda op:
str(preamble.operations).find(str(op.getarg(0))))
-
- for op in extra_same_as:
- preamble.operations.insert(-1, op)
+
+ preamble = self.unroll_and_optimize(loop, call_pure_results)
#
print
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py
b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -8,7 +8,8 @@
from pypy.jit.backend.llgraph import runner
from pypy.jit.metainterp.history import (BoxInt, BoxPtr, ConstInt, ConstPtr,
Const, TreeLoop, BoxObj,
- ConstObj, AbstractDescr)
+ ConstObj, AbstractDescr,
+ JitCellToken, TargetToken)
from pypy.jit.metainterp.optimizeopt.util import sort_descrs, equaloplists
from pypy.jit.metainterp.optimize import InvalidLoop
from pypy.jit.codewriter.effectinfo import EffectInfo
@@ -19,6 +20,7 @@
from pypy.jit.metainterp.jitprof import EmptyProfiler
from pypy.config.pypyoption import get_pypy_config
from pypy.jit.metainterp.resoperation import rop, opname, ResOperation
+from pypy.jit.metainterp.optimizeopt.unroll import Inliner
def test_sort_descrs():
class PseudoDescr(AbstractDescr):
@@ -404,12 +406,72 @@
#
optimize_trace(metainterp_sd, loop, self.enable_opts)
+ def unroll_and_optimize(self, loop, call_pure_results):
+ operations = loop.operations
+ jumpop = operations[-1]
+ assert jumpop.getopnum() == rop.JUMP
+ inputargs = loop.inputargs
+
+ jump_args = jumpop.getarglist()[:]
+ operations = operations[:-1]
+ cloned_operations = [op.clone() for op in operations]
+
+ preamble = TreeLoop('preamble')
+ preamble.inputargs = inputargs
+ preamble.start_resumedescr = FakeDescrWithSnapshot()
+
+ token = JitCellToken()
+ preamble.operations = [ResOperation(rop.LABEL, inputargs, None,
descr=TargetToken(token))] + \
+ operations + \
+ [ResOperation(rop.JUMP, jump_args, None,
descr=token)]
+ self._do_optimize_loop(preamble, call_pure_results)
+
+ assert preamble.operations[-1].getopnum() == rop.LABEL
+
+ inliner = Inliner(inputargs, jump_args)
+ loop.start_resumedescr = preamble.start_resumedescr
+ loop.operations = [preamble.operations[-1]] + \
+ [inliner.inline_op(op, clone=False) for op in
cloned_operations] + \
+ [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a
in jump_args],
+ None, descr=token)]
+ #[inliner.inline_op(jumpop)]
+ assert loop.operations[-1].getopnum() == rop.JUMP
+ assert loop.operations[0].getopnum() == rop.LABEL
+ loop.inputargs = loop.operations[0].getarglist()
+
+ self._do_optimize_loop(loop, call_pure_results)
+ extra_same_as = []
+ while loop.operations[0].getopnum() != rop.LABEL:
+ extra_same_as.append(loop.operations[0])
+ del loop.operations[0]
+
+ # Hack to prevent random order of same_as ops
+ extra_same_as.sort(key=lambda op:
str(preamble.operations).find(str(op.getarg(0))))
+
+ for op in extra_same_as:
+ preamble.operations.insert(-1, op)
+
+ return preamble
+
+
class FakeDescr(compile.ResumeGuardDescr):
def clone_if_mutable(self):
return FakeDescr()
def __eq__(self, other):
return isinstance(other, FakeDescr)
+class FakeDescrWithSnapshot(compile.ResumeGuardDescr):
+ class rd_snapshot:
+ class prev:
+ prev = None
+ boxes = []
+ boxes = []
+ def clone_if_mutable(self):
+ return FakeDescrWithSnapshot()
+ def __eq__(self, other):
+ return isinstance(other, Storage) or isinstance(other,
FakeDescrWithSnapshot)
+
+
def convert_old_style_to_targets(loop, jump):
newloop = TreeLoop(loop.name)
newloop.inputargs = loop.inputargs
diff --git a/pypy/jit/metainterp/test/test_virtualstate.py
b/pypy/jit/metainterp/test/test_virtualstate.py
--- a/pypy/jit/metainterp/test/test_virtualstate.py
+++ b/pypy/jit/metainterp/test/test_virtualstate.py
@@ -8,7 +8,7 @@
from pypy.rpython.lltypesystem import lltype
from pypy.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin,
BaseTest, equaloplists
from pypy.jit.metainterp.optimizeopt.intutils import IntBound
-from pypy.jit.metainterp.history import TreeLoop, LoopToken
+from pypy.jit.metainterp.history import TreeLoop, JitCellToken
from pypy.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeDescr,
FakeMetaInterpStaticData
from pypy.jit.metainterp.optimize import RetraceLoop
from pypy.jit.metainterp.resoperation import ResOperation, rop
@@ -461,7 +461,7 @@
for loop in loops:
loop.preamble = TreeLoop('preamble')
loop.preamble.inputargs = loop.inputargs
- loop.preamble.token = LoopToken()
+ loop.preamble.token = JitCellToken()
loop.preamble.start_resumedescr = FakeDescr()
self._do_optimize_loop(loop, None)
preamble = loops[0].preamble
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit