[pypy-commit] pypy optresult-unroll: start working on virtualstate

fijal noreply at buildbot.pypy.org
Tue Jul 7 14:03:58 CEST 2015


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

Log:	start working on virtualstate

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
@@ -290,8 +290,9 @@
             return self.getptrinfo(op)
         elif op.type == 'i':
             return self.getintbound(op)
-        else:
-            zzz
+        elif op.type == 'f':
+            if self.get_box_replacement(op).is_constant():
+                return info.FloatConstInfo(self.get_box_replacement(op))
 
     def get_box_replacement(self, op):
         if op is None:
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
@@ -2,7 +2,7 @@
 import py
 from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo,\
      VStructStateInfo, LEVEL_CONSTANT,\
-     VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes,\
+     VArrayStateInfo, NotVirtualStateInfo, VirtualState,\
      GenerateGuardState, VirtualStatesCantMatch, VArrayStructStateInfo
 from rpython.jit.metainterp.history import ConstInt, ConstPtr
 from rpython.jit.metainterp.resoperation import InputArgInt, InputArgRef,\
@@ -10,12 +10,13 @@
 from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, \
                                                            equaloplists
-from rpython.jit.metainterp.optimizeopt.intutils import IntBound
+from rpython.jit.metainterp.optimizeopt.intutils import IntBound, ConstIntBound
 from rpython.jit.metainterp.history import TreeLoop, JitCellToken
 from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeMetaInterpStaticData
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
 from rpython.jit.metainterp.resoperation import ResOperation, rop
 from rpython.jit.metainterp import resume
+from rpython.jit.metainterp.optimizeopt import info
 
 class FakeOptimizer(Optimizer):
     def __init__(self):
@@ -81,7 +82,7 @@
     def test_make_inputargs(self):
         optimizer = FakeOptimizer()
         args = [InputArgInt()]
-        info0 = NotVirtualStateInfo(optimizer, args[0])
+        info0 = NotVirtualStateInfo(args[0], None)
         vs = VirtualState([info0])
         assert vs.make_inputargs(args, optimizer) == args
         info0.level = LEVEL_CONSTANT
@@ -107,9 +108,9 @@
             self.check_invalid(info1, info2, state=state)
             assert info1 in state.bad and info2 in state.bad
 
-        for BoxType in (InputArgInt, InputArgFloat, InputArgPtr):
-            info1 = NotVirtualStateInfo(OptValue(BoxType()))
-            info2 = NotVirtualStateInfo(OptValue(BoxType()))
+        for BoxType in (InputArgInt, InputArgFloat, InputArgRef):
+            info1 = NotVirtualStateInfo(BoxType(), None)
+            info2 = NotVirtualStateInfo(BoxType(), None)
             postest(info1, info2)
 
         info1, info2 = VArrayStateInfo(42), VArrayStateInfo(42)
@@ -125,31 +126,27 @@
         postest(info1, info2)
 
     def test_NotVirtualStateInfo_generalization(self):
-        def isgeneral(value1, value2):
-            info1 = NotVirtualStateInfo(value1)
+        def isgeneral(tp1, info1, tp2, info2):
+            info1 = NotVirtualStateInfo(tp1, info1)
             info1.position = 0
-            info2 = NotVirtualStateInfo(value2)
+            info2 = NotVirtualStateInfo(tp2, info2)
             info2.position = 0
             return VirtualState([info1]).generalization_of(VirtualState([info2]), cpu=self.cpu)
 
-        assert isgeneral(OptValue(BoxInt()), OptValue(ConstInt(7)))
-        assert not isgeneral(OptValue(ConstInt(7)), OptValue(BoxInt()))
+        assert isgeneral('i', None, 'i', ConstIntBound(7))
+        assert not isgeneral('i', ConstIntBound(7), 'i', None)
 
-        ptr = PtrOptValue(BoxPtr())
-        nonnull = PtrOptValue(BoxPtr())
-        nonnull.make_nonnull(None)
-        knownclass = PtrOptValue(BoxPtr())
-        clsbox = self.cpu.ts.cls_of_box(BoxPtr(self.myptr))
-        knownclass.make_constant_class(None, clsbox)
-        const = PtrOptValue(BoxPtr)
-        const.make_constant_class(None, clsbox)
-        const.make_constant(ConstPtr(self.myptr))
+        ptr = info.PtrInfo()
+        nonnull = info.NonNullPtrInfo()
+        clsbox = self.cpu.ts.cls_of_box(InputArgRef(self.myptr))
+        knownclass = info.InstancePtrInfo(known_class=clsbox)
+        const = info.ConstPtrInfo(ConstPtr(self.myptr))
         inorder = [ptr, nonnull, knownclass, const]
         for i in range(len(inorder)):
             for j in range(i, len(inorder)):
-                assert isgeneral(inorder[i], inorder[j])
+                assert isgeneral('r', inorder[i], 'r', inorder[j])
                 if i != j:
-                    assert not isgeneral(inorder[j], inorder[i])
+                    assert not isgeneral('r', inorder[j], 'r', inorder[i])
 
         value1 = IntOptValue(BoxInt())
         value2 = IntOptValue(BoxInt())
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
@@ -10,7 +10,8 @@
 
 LEVEL_UNKNOWN = '\x00'
 LEVEL_NONNULL = '\x01'
-LEVEL_CONSTANT = '\x02'
+LEVEL_KNOWNCLASS = '\x02'
+LEVEL_CONSTANT = '\x03'
 
 class BadVirtualState(Exception):
     pass
@@ -282,11 +283,10 @@
     lenbound = None
     intbound = None
     
-    def __init__(self, optimizer, box):
-        info = optimizer.getinfo(box)
+    def __init__(self, type, info):
         if info and info.is_constant():
             self.level = LEVEL_CONSTANT
-        elif box.type == 'r' and info and info.is_nonnull():
+        elif type == 'r' and info and info.is_nonnull():
             self.level = LEVEL_NONNULL
         else:
             self.level = LEVEL_UNKNOWN
@@ -602,7 +602,7 @@
 
     def visit_not_virtual(self, box):
         is_opaque = box in self.optimizer.opaque_pointers
-        return NotVirtualStateInfo(self.optimizer, box)
+        return NotVirtualStateInfo(box, self.optimizer.getinfo(box))
 
     def visit_virtual(self, known_class, fielddescrs):
         return VirtualStateInfo(known_class, fielddescrs)


More information about the pypy-commit mailing list