[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