[pypy-commit] pypy optresult-unroll: improve NotVirtualStateInfo

fijal noreply at buildbot.pypy.org
Thu Jul 9 18:54:19 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78512:94c5660db711
Date: 2015-07-07 14:34 +0200
http://bitbucket.org/pypy/pypy/changeset/94c5660db711/

Log:	improve NotVirtualStateInfo

diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -19,6 +19,9 @@
     def force_box(self, op, optforce):
         return op
 
+    def getconst(self):
+        raise Exception("not a constant")
+
     
 class PtrInfo(AbstractInfo):
     _attrs_ = ()
@@ -32,6 +35,9 @@
     def is_virtual(self):
         return False
 
+    def get_known_class(self, cpu):
+        return None
+
     def getnullness(self):
         if self.is_null():
             return INFO_NULL
@@ -408,6 +414,9 @@
     def __init__(self, const):
         self._const = const
 
+    def getconst(self):
+        return self._const
+
     def _get_info(self, descr, optheap):
         ref = self._const.getref_base()
         info = optheap.const_infos.get(ref, None)
diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py b/rpython/jit/metainterp/optimizeopt/intutils.py
--- a/rpython/jit/metainterp/optimizeopt/intutils.py
+++ b/rpython/jit/metainterp/optimizeopt/intutils.py
@@ -269,6 +269,11 @@
     def make_bool(self):
         self.intersect(IntBound(0, 1))
 
+    def getconst(self):
+        if not self.is_constant():
+            raise Exception("not a constant")
+        return ConstInt(self.getint())
+
     def getnullness(self):
         if self.known_gt(IntBound(0, 0)) or \
            self.known_lt(IntBound(0, 0)):
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
@@ -9,7 +9,8 @@
 from rpython.jit.metainterp.resoperation import rop, ResOperation
 from rpython.jit.metainterp.compile import LoopCompileData
 from rpython.jit.metainterp.optimizeopt.virtualstate import \
-     NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN
+     NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN, LEVEL_KNOWNCLASS,\
+     LEVEL_NONNULL
 from rpython.jit.codewriter import heaptracker
 
 class FakeOptimizer(object):
@@ -81,7 +82,8 @@
         """
         es, loop, preamble = self.optimize(loop)
         p0 = preamble.inputargs[0]
-        assert (heaptracker.adr2int(self.node_vtable_adr) ==
-                es.exported_infos[p0]._known_class.getint())
-
-
+        expected_class = heaptracker.adr2int(self.node_vtable_adr)
+        assert expected_class ==es.exported_infos[p0]._known_class.getint()
+        vs = es.virtual_state
+        assert vs.state[0].level == LEVEL_KNOWNCLASS
+        assert vs.state[0].known_class.getint() == expected_class
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -82,7 +82,7 @@
     def test_make_inputargs(self):
         optimizer = FakeOptimizer()
         args = [InputArgInt()]
-        info0 = NotVirtualStateInfo(args[0], None)
+        info0 = NotVirtualStateInfo(self.cpu, args[0].type, None)
         vs = VirtualState([info0])
         assert vs.make_inputargs(args, optimizer) == args
         info0.level = LEVEL_CONSTANT
@@ -109,8 +109,8 @@
             assert info1 in state.bad and info2 in state.bad
 
         for BoxType in (InputArgInt, InputArgFloat, InputArgRef):
-            info1 = NotVirtualStateInfo(BoxType(), None)
-            info2 = NotVirtualStateInfo(BoxType(), None)
+            info1 = NotVirtualStateInfo(self.cpu, BoxType.type, None)
+            info2 = NotVirtualStateInfo(self.cpu, BoxType.type, None)
             postest(info1, info2)
 
         info1, info2 = VArrayStateInfo(42), VArrayStateInfo(42)
@@ -127,9 +127,9 @@
 
     def test_NotVirtualStateInfo_generalization(self):
         def isgeneral(tp1, info1, tp2, info2):
-            info1 = NotVirtualStateInfo(tp1, info1)
+            info1 = NotVirtualStateInfo(self.cpu, tp1, info1)
             info1.position = 0
-            info2 = NotVirtualStateInfo(tp2, info2)
+            info2 = NotVirtualStateInfo(self.cpu, tp2, info2)
             info2.position = 0
             return VirtualState([info1]).generalization_of(VirtualState([info2]), cpu=self.cpu)
 
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -282,14 +282,20 @@
 class NotVirtualStateInfo(AbstractVirtualStateInfo):
     lenbound = None
     intbound = None
+    level = LEVEL_UNKNOWN
+    constbox = None
+    known_class = None
     
-    def __init__(self, type, info):
+    def __init__(self, cpu, type, info):
         if info and info.is_constant():
+            self.constbox = info.getconst()
             self.level = LEVEL_CONSTANT
-        elif type == 'r' and info and info.is_nonnull():
-            self.level = LEVEL_NONNULL
-        else:
-            self.level = LEVEL_UNKNOWN
+        elif type == 'r' and info:
+            if info.get_known_class(cpu):
+                self.known_class = info.get_known_class(cpu)
+                self.level = LEVEL_KNOWNCLASS
+            elif info.is_nonnull():
+                self.level = LEVEL_NONNULL
         return
         yyy
         self.level = LEVEL_UNKNOWN
@@ -602,7 +608,8 @@
 
     def visit_not_virtual(self, box):
         is_opaque = box in self.optimizer.opaque_pointers
-        return NotVirtualStateInfo(box, self.optimizer.getinfo(box))
+        return NotVirtualStateInfo(self.optimizer.cpu, box.type,
+                                   self.optimizer.getinfo(box))
 
     def visit_virtual(self, known_class, fielddescrs):
         return VirtualStateInfo(known_class, fielddescrs)


More information about the pypy-commit mailing list