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

Reply via email to