[pypy-commit] pypy default: small level as a tag. that way we can store a few bits for future use (not
fijal
noreply at buildbot.pypy.org
Tue Dec 23 18:58:07 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r75090:c9019489d422
Date: 2014-12-23 19:56 +0200
http://bitbucket.org/pypy/pypy/changeset/c9019489d422/
Log: small level as a tag. that way we can store a few bits for future
use (not used yet)
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -4,7 +4,8 @@
from rpython.jit.metainterp.optimizeopt.util import args_dict
from rpython.jit.metainterp.history import Const
from rpython.jit.metainterp.jitexc import JitException
-from rpython.jit.metainterp.optimizeopt.optimizer import Optimization, MODE_ARRAY, LEVEL_KNOWNCLASS, REMOVED, LEVEL_CONSTANT
+from rpython.jit.metainterp.optimizeopt.optimizer import Optimization,\
+ MODE_ARRAY, LEVEL_KNOWNCLASS, REMOVED
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.resoperation import rop, ResOperation
@@ -137,7 +138,7 @@
continue
value = optimizer.getvalue(op.getarg(0))
if value in optimizer.opaque_pointers:
- if value.level < LEVEL_KNOWNCLASS:
+ if value.getlevel() < LEVEL_KNOWNCLASS:
continue
if op.getopnum() != rop.SETFIELD_GC and op.getopnum() != rop.GETFIELD_GC:
continue
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
@@ -13,11 +13,16 @@
from rpython.rlib.debug import debug_print
from rpython.rlib.objectmodel import specialize
+""" The tag field on OptValue has a following meaning:
-LEVEL_UNKNOWN = '\x00'
-LEVEL_NONNULL = '\x01'
-LEVEL_KNOWNCLASS = '\x02' # might also mean KNOWNARRAYDESCR, for arrays
-LEVEL_CONSTANT = '\x03'
+lower two bits are LEVEL
+next 16 bits is the position in the original list, 0 if unknown or a constant
+"""
+
+LEVEL_UNKNOWN = 0
+LEVEL_NONNULL = 1
+LEVEL_KNOWNCLASS = 2 # might also mean KNOWNARRAYDESCR, for arrays
+LEVEL_CONSTANT = 3
MODE_ARRAY = '\x00'
MODE_STR = '\x01'
@@ -41,35 +46,41 @@
class OptValue(object):
__metaclass__ = extendabletype
- _attrs_ = ('box', 'level')
+ _attrs_ = ('box', '_tag')
- level = LEVEL_UNKNOWN
+ _tag = 0
def __init__(self, box, level=None, known_class=None, intbound=None):
self.box = box
if level is not None:
- self.level = level
+ self._tag = level
if isinstance(box, Const):
self.make_constant(box)
# invariant: box is a Const if and only if level == LEVEL_CONSTANT
+ def getlevel(self):
+ return self._tag & 0x3
+
+ def setlevel(self, level):
+ self._tag = (self._tag & (~0x3)) | level
+
def import_from(self, other, optimizer):
- if self.level == LEVEL_CONSTANT:
- assert other.level == LEVEL_CONSTANT
+ if self.getlevel() == LEVEL_CONSTANT:
+ assert other.getlevel() == LEVEL_CONSTANT
assert other.box.same_constant(self.box)
return
- assert self.level <= LEVEL_NONNULL
- if other.level == LEVEL_CONSTANT:
+ assert self.getlevel() <= LEVEL_NONNULL
+ if other.getlevel() == LEVEL_CONSTANT:
self.make_constant(other.get_key_box())
- elif other.level == LEVEL_KNOWNCLASS:
+ elif other.getlevel() == LEVEL_KNOWNCLASS:
self.make_constant_class(other.get_known_class(), None)
else:
- if other.level == LEVEL_NONNULL:
+ if other.getlevel() == LEVEL_NONNULL:
self.ensure_nonnull()
def make_guards(self, box):
- if self.level == LEVEL_CONSTANT:
+ if self.getlevel() == LEVEL_CONSTANT:
op = ResOperation(rop.GUARD_VALUE, [box, self.box], None)
return [op]
return []
@@ -77,7 +88,7 @@
def copy_from(self, other_value):
assert isinstance(other_value, OptValue)
self.box = other_value.box
- self.level = other_value.level
+ self._tag = other_value._tag
def force_box(self, optforce):
return self.box
@@ -105,7 +116,7 @@
assert 0, "unreachable"
def is_constant(self):
- return self.level == LEVEL_CONSTANT
+ return self.getlevel() == LEVEL_CONSTANT
def is_null(self):
if self.is_constant():
@@ -122,7 +133,7 @@
return self is other
def is_nonnull(self):
- level = self.level
+ level = self.getlevel()
if level == LEVEL_NONNULL or level == LEVEL_KNOWNCLASS:
return True
elif level == LEVEL_CONSTANT:
@@ -133,8 +144,8 @@
return False
def ensure_nonnull(self):
- if self.level < LEVEL_NONNULL:
- self.level = LEVEL_NONNULL
+ if self.getlevel() < LEVEL_NONNULL:
+ self.setlevel(LEVEL_NONNULL)
def is_virtual(self):
# Don't check this with 'isinstance(_, VirtualValue)'!
@@ -179,7 +190,7 @@
"""Replace 'self.box' with a Const box."""
assert isinstance(constbox, Const)
self.box = constbox
- self.level = LEVEL_CONSTANT
+ self.setlevel(LEVEL_CONSTANT)
def get_last_guard(self):
return None
@@ -212,7 +223,7 @@
assert isinstance(other_value, PtrOptValue)
self.box = other_value.box
self.known_class = other_value.known_class
- self.level = other_value.level
+ self._tag = other_value._tag
self.last_guard = other_value.last_guard
self.lenbound = other_value.lenbound
@@ -225,19 +236,19 @@
self.lenbound = LenBound(mode, descr, IntLowerBound(val + 1))
def make_nonnull(self, guardop):
- assert self.level < LEVEL_NONNULL
- self.level = LEVEL_NONNULL
+ assert self.getlevel() < LEVEL_NONNULL
+ self.setlevel(LEVEL_NONNULL)
self.last_guard = guardop
def make_constant_class(self, classbox, guardop):
- assert self.level < LEVEL_KNOWNCLASS
+ assert self.getlevel() < LEVEL_KNOWNCLASS
self.known_class = classbox
- self.level = LEVEL_KNOWNCLASS
+ self.setlevel(LEVEL_KNOWNCLASS)
self.last_guard = guardop
def import_from(self, other, optimizer):
OptValue.import_from(self, other, optimizer)
- if self.level != LEVEL_CONSTANT:
+ if self.getlevel() != LEVEL_CONSTANT:
if other.getlenbound():
if self.lenbound:
assert other.getlenbound().mode == self.lenbound.mode
@@ -248,16 +259,17 @@
def make_guards(self, box):
guards = []
- if self.level == LEVEL_CONSTANT:
+ level = self.getlevel()
+ if level == LEVEL_CONSTANT:
op = ResOperation(rop.GUARD_VALUE, [box, self.box], None)
guards.append(op)
- elif self.level == LEVEL_KNOWNCLASS:
+ elif level == LEVEL_KNOWNCLASS:
op = ResOperation(rop.GUARD_NONNULL, [box], None)
guards.append(op)
op = ResOperation(rop.GUARD_CLASS, [box, self.known_class], None)
guards.append(op)
else:
- if self.level == LEVEL_NONNULL:
+ if level == LEVEL_NONNULL:
op = ResOperation(rop.GUARD_NONNULL, [box], None)
guards.append(op)
if self.lenbound:
@@ -276,7 +288,7 @@
return guards
def get_constant_class(self, cpu):
- level = self.level
+ level = self.getlevel()
if level == LEVEL_KNOWNCLASS:
return self.known_class
elif level == LEVEL_CONSTANT:
@@ -314,13 +326,13 @@
assert isinstance(other_value, IntOptValue)
self.box = other_value.box
self.intbound = other_value.intbound
- self.level = other_value.level
+ self._tag = other_value._tag
def make_constant(self, constbox):
"""Replace 'self.box' with a Const box."""
assert isinstance(constbox, ConstInt)
self.box = constbox
- self.level = LEVEL_CONSTANT
+ self.setlevel(LEVEL_CONSTANT)
val = constbox.getint()
self.intbound = IntBound(val, val)
@@ -334,25 +346,26 @@
return False
def make_nonnull(self, guardop):
- assert self.level < LEVEL_NONNULL
- self.level = LEVEL_NONNULL
+ assert self.getlevel() < LEVEL_NONNULL
+ self.setlevel(LEVEL_NONNULL)
def import_from(self, other, optimizer):
OptValue.import_from(self, other, optimizer)
- if self.level != LEVEL_CONSTANT:
+ if self.getlevel() != LEVEL_CONSTANT:
if other.getintbound() is not None: # VRawBufferValue
self.intbound.intersect(other.getintbound())
def make_guards(self, box):
guards = []
- if self.level == LEVEL_CONSTANT:
+ level = self.getlevel()
+ if level == LEVEL_CONSTANT:
op = ResOperation(rop.GUARD_VALUE, [box, self.box], None)
guards.append(op)
- elif self.level == LEVEL_KNOWNCLASS:
+ elif level == LEVEL_KNOWNCLASS:
op = ResOperation(rop.GUARD_NONNULL, [box], None)
guards.append(op)
else:
- if self.level == LEVEL_NONNULL:
+ if level == LEVEL_NONNULL:
op = ResOperation(rop.GUARD_NONNULL, [box], None)
guards.append(op)
self.intbound.make_guards(box, guards)
@@ -508,6 +521,8 @@
self.optpure = None
self.optheap = None
self.optearlyforce = None
+ # the following two fields is the data kept for unrolling,
+ # those are the operations that can go to the short_preamble
if loop is not None:
self.call_pure_results = loop.call_pure_results
@@ -609,8 +624,8 @@
except KeyError:
pass
else:
- assert value.level != LEVEL_CONSTANT
- assert cur_value.level != LEVEL_CONSTANT
+ assert value.getlevel() != LEVEL_CONSTANT
+ assert cur_value.getlevel() != LEVEL_CONSTANT
# replacing with a different box
cur_value.copy_from(value)
return
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -16,7 +16,7 @@
class AbstractVirtualValue(optimizer.PtrOptValue):
_attrs_ = ('keybox', 'source_op', '_cached_vinfo')
box = None
- level = optimizer.LEVEL_NONNULL
+ _tag = optimizer.LEVEL_NONNULL
is_about_raw = False
_cached_vinfo = None
@@ -198,7 +198,7 @@
fieldvalue.visitor_walk_recursive(visitor)
class VirtualValue(AbstractVirtualStructValue):
- level = optimizer.LEVEL_KNOWNCLASS
+ _tag = optimizer.LEVEL_KNOWNCLASS
def __init__(self, cpu, known_class, keybox, source_op=None):
AbstractVirtualStructValue.__init__(self, cpu, keybox, source_op)
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
@@ -281,7 +281,7 @@
def __init__(self, value, is_opaque=False):
self.is_opaque = is_opaque
self.known_class = value.get_known_class()
- self.level = value.level
+ self.level = value.getlevel()
if value.getintbound() is None:
self.intbound = IntUnbounded()
else:
More information about the pypy-commit
mailing list