Author: Maciej Fijalkowski <[email protected]>
Branch: rewrite-unrolling
Changeset: r76027:d23a1eaee646
Date: 2015-02-21 12:32 +0200
http://bitbucket.org/pypy/pypy/changeset/d23a1eaee646/
Log: implement importing of values for input args
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -67,11 +67,6 @@
self._tag = (self._tag & (~0x3)) | level
def import_from(self, other, optimizer):
- if self.getlevel() == LEVEL_CONSTANT:
- assert other.getlevel() == LEVEL_CONSTANT
- assert other.box.same_constant(self.box)
- return
- assert self.getlevel() <= LEVEL_NONNULL
if other.getlevel() == LEVEL_CONSTANT:
self.make_constant(other.get_key_box())
elif other.getlevel() == LEVEL_KNOWNCLASS:
@@ -256,14 +251,13 @@
def import_from(self, other, optimizer):
OptValue.import_from(self, other, optimizer)
- if self.getlevel() != LEVEL_CONSTANT:
- if other.getlenbound():
- if self.lenbound:
- assert other.getlenbound().mode == self.lenbound.mode
- assert other.getlenbound().descr == self.lenbound.descr
- self.lenbound.bound.intersect(other.getlenbound().bound)
- else:
- self.lenbound = other.getlenbound().clone()
+ if other.getlenbound():
+ if self.lenbound:
+ assert other.getlenbound().mode == self.lenbound.mode
+ assert other.getlenbound().descr == self.lenbound.descr
+ self.lenbound.bound.intersect(other.getlenbound().bound)
+ else:
+ self.lenbound = other.getlenbound().clone()
def make_guards(self, box):
guards = []
@@ -360,9 +354,8 @@
def import_from(self, other, optimizer):
OptValue.import_from(self, other, optimizer)
- if self.getlevel() != LEVEL_CONSTANT:
- if other.getintbound() is not None: # VRawBufferValue
- self.intbound.intersect(other.getintbound())
+ if other.getintbound() is not None: # VRawBufferValue
+ self.intbound.intersect(other.getintbound())
def make_guards(self, box):
guards = []
@@ -606,7 +599,6 @@
value = self.values[box] = IntOptValue(box)
else:
value = self.values[box] = OptValue(box)
- self.ensure_imported(value)
return value
def get_box_replacement(self, box):
@@ -616,16 +608,12 @@
return box
return v.get_key_box()
- def ensure_imported(self, value):
- pass
-
@specialize.argtype(0)
def get_constant_box(self, box):
if isinstance(box, Const):
return box
try:
value = self.values[box]
- self.ensure_imported(value)
except KeyError:
return None
if value.is_constant():
@@ -738,7 +726,6 @@
except KeyError:
pass
else:
- self.ensure_imported(value)
newbox = value.force_box(self)
if arg is not newbox:
if not changed:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -1,27 +1,32 @@
from rpython.jit.tool.oparser import parse
from rpython.jit.metainterp.optimizeopt import optimize_trace
-from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
+from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
+ PtrOptValue, LEVEL_KNOWNCLASS
from rpython.jit.metainterp.optimizeopt.unroll import Unroller
from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest,\
- FakeMetaInterpStaticData
+ FakeMetaInterpStaticData, LLtypeMixin
from rpython.jit.metainterp.optimizeopt.pure import OptPure
from rpython.jit.metainterp.resoperation import rop, ResOperation
from rpython.jit.metainterp.history import ConstInt, BoxInt
from rpython.jit.backend.llgraph import runner
+from rpython.jit.codewriter.heaptracker import adr2int
-class TestUnrollDirect(BaseTest):
+class TestUnrollDirect(BaseTest, LLtypeMixin):
cpu = runner.LLGraphCPU(None)
enable_opts =
"intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
metainterp_sd = FakeMetaInterpStaticData(cpu)
+ def parse(self, loop):
+ return BaseTest.parse(self, loop, postprocess=self.postprocess)
+
def optimize(self, loop, expected=None, unroller=None):
if isinstance(loop, str):
- loop = parse(loop)
+ loop = self.parse(loop)
state = optimize_trace(self.metainterp_sd, None, loop,
self.enable_opts,
unroller=unroller)
if expected is not None:
- expected = parse(expected)
+ expected = self.parse(expected)
self.assert_equal(loop, expected)
return state
@@ -65,3 +70,25 @@
jump(i0, i1)
"""
self.optimize(loop, expected, unroller=unroller)
+
+ def test_inherit_known_class(self):
+ loop = self.parse("""
+ [p0]
+ label(p0)
+ guard_class(p0, ConstClass(node_vtable)) []
+ jump(p0)
+ """)
+ expected = """
+ [p0]
+ label(p0)
+ jump(p0)
+ """
+ p0 = loop.inputargs[0]
+ unroller = Unroller()
+ unroller.optimizer = Optimizer(self.metainterp_sd, None, None, [])
+ cls = adr2int(self.node_vtable_adr)
+ unroller.optimizer.values = {
+ p0: PtrOptValue(p0, known_class=ConstInt(cls),
+ level=LEVEL_KNOWNCLASS),
+ }
+ self.optimize(loop, expected, unroller=unroller)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -361,7 +361,7 @@
class BaseTest(object):
def parse(self, s, boxkinds=None, want_fail_descr=True, postprocess=None):
- self.oparse = OpParser(s, self.cpu, self.namespace, 'lltype',
+ self.oparse = OpParser(s, self.cpu, self.namespace.copy(), 'lltype',
boxkinds,
None, False, postprocess)
return self.oparse.parse()
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -25,6 +25,7 @@
def force_box(self, optforce):
if self.box is None:
+ # XXX add myself to the short preamble
self.box = self.keybox
optforce.optimizer.reuse_pure_result(self.box)
return self.box
@@ -57,6 +58,15 @@
new_optpure.pure(op.getopnum(), op.getarglist(),
op.result, pure_value)
self.optimizer.pure_reverse(op)
+ for box in self.optimizer.loop.operations[0].getarglist():
+ try:
+ # XXX do the same thing for pure opt value
+ other = old_optimizer.values[box]
+ self.optimizer.getvalue(box).import_from(other,
+ self.optimizer)
+ except KeyError:
+ pass
+
# for opargs, value in old_optpure.pure_operations.items():
# if not value.is_virtual():
# pure_value = OptPureValue(self, value.box)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit