[pypy-commit] pypy optresult: (fijal, arigo) completely in-progress
fijal
noreply at buildbot.pypy.org
Tue Feb 24 15:05:31 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76099:9e2e51f4f8a5
Date: 2015-02-24 16:03 +0200
http://bitbucket.org/pypy/pypy/changeset/9e2e51f4f8a5/
Log: (fijal, arigo) completely in-progress
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -177,6 +177,8 @@
class Const(AbstractValue):
__slots__ = ()
+ forwarded = None
+
@staticmethod
def _new(x):
"NOT_RPYTHON"
@@ -207,6 +209,9 @@
def repr(self, memo):
return self.repr_rpython()
+ def is_constant(self):
+ return True
+
def __repr__(self):
return 'Const(%s)' % self._getrepr_()
diff --git a/rpython/jit/metainterp/optimizeopt/generalize.py b/rpython/jit/metainterp/optimizeopt/generalize.py
--- a/rpython/jit/metainterp/optimizeopt/generalize.py
+++ b/rpython/jit/metainterp/optimizeopt/generalize.py
@@ -1,5 +1,5 @@
from rpython.jit.metainterp.optimizeopt.optimizer import MININT, MAXINT,\
- IntOptValue
+ IntOptInfo
class GeneralizationStrategy(object):
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -4,7 +4,7 @@
from rpython.jit.metainterp.optimizeopt.intutils import (IntBound, IntLowerBound,
IntUpperBound)
from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, CONST_1,
- CONST_0, MODE_ARRAY, MODE_STR, MODE_UNICODE, IntOptValue)
+ CONST_0, MODE_ARRAY, MODE_STR, MODE_UNICODE, IntOptInfo)
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, AbstractResOp
from rpython.jit.backend.llsupport import symbolic
@@ -111,9 +111,10 @@
r.getintbound().intersect(IntBound(0, next_pow2_m1(lesser)))
def optimize_INT_SUB(self, op):
- v1 = self.getvalue(op.getarg(0))
- v2 = self.getvalue(op.getarg(1))
+ v1 = self.getinfo(op.getarg(0))
+ v2 = self.getinfo(op.getarg(1))
self.emit_operation(op)
+ xxx
r = self.getvalue(op)
b = v1.getintbound().sub_bound(v2.getintbound())
if b.bounded():
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
@@ -2,13 +2,11 @@
from rpython.jit.metainterp.executor import execute_nonspec_const
from rpython.jit.metainterp.logger import LogOperations
from rpython.jit.metainterp.history import Const, ConstInt, REF
-from rpython.jit.metainterp.optimizeopt.intutils import IntBound, IntUnbounded, \
- ImmutableIntUnbounded, \
- IntLowerBound, MININT,\
- MAXINT
+from rpython.jit.metainterp.optimizeopt.intutils import IntBound,\
+ ImmutableIntUnbounded, IntLowerBound, MININT, MAXINT
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, ResOperation,\
- AbstractResOp, AbstractInputArg, DONT_CHANGE, GuardResOp
+ AbstractResOp, AbstractInputArg, GuardResOp
from rpython.jit.metainterp.typesystem import llhelper
from rpython.tool.pairtype import extendabletype
from rpython.rlib.debug import debug_print
@@ -45,21 +43,17 @@
self.descr == other.descr and
self.bound.contains_bound(other.bound))
-class OptValue(object):
- __metaclass__ = extendabletype
- _attrs_ = ('box', '_tag')
-
+class OptInfo(object):
+ _attrs_ = ('_tag',)
_tag = 0
- def __init__(self, box, level=None, known_class=None, intbound=None):
- self.box = box
+ forwarded = None
+
+ def __init__(self, level=LEVEL_UNKNOWN, known_class=None, intbound=None):
+ assert isinstance(level, int)
if level is not None:
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
@@ -92,9 +86,7 @@
self._tag = other_value._tag
def force_box(self, optforce):
- return self.box
-
- def get_key_box(self):
+ xxx
return self.box
def force_at_end_of_preamble(self, already_forced, optforce):
@@ -155,10 +147,7 @@
return box.getint()
def is_virtual(self):
- # Don't check this with 'isinstance(_, VirtualValue)'!
- # Even if it is a VirtualValue, the 'box' can be non-None,
- # meaning it has been forced.
- return self.box is None
+ return False # overwridden in VirtualInfo
def is_forced_virtual(self):
return False
@@ -214,7 +203,7 @@
def get_constant_class(self, cpu):
return None
-class PtrOptValue(OptValue):
+class PtrOptInfo(OptInfo):
_attrs_ = ('known_class', 'last_guard_pos', 'lenbound')
known_class = None
@@ -320,15 +309,13 @@
def get_known_class(self):
return self.known_class
-class IntOptValue(OptValue):
+class IntOptInfo(OptInfo):
_attrs_ = ('intbound',)
intbound = ImmutableIntUnbounded()
- def __init__(self, box, level=None, known_class=None, intbound=None):
- OptValue.__init__(self, box, level, None, None)
- if isinstance(box, Const):
- return
+ def __init__(self, level=LEVEL_UNKNOWN, known_class=None, intbound=None):
+ OptInfo.__init__(self, level, None, None)
if intbound:
self.intbound = intbound
else:
@@ -395,32 +382,11 @@
def getlenbound(self):
return None
-class ConstantFloatValue(OptValue):
- def __init__(self, box):
- self.make_constant(box)
-
- def __repr__(self):
- return 'Constant(%r)' % (self.box,)
-
-class ConstantIntValue(IntOptValue):
- def __init__(self, box):
- self.make_constant(box)
-
- def __repr__(self):
- return 'Constant(%r)' % (self.box,)
-
-class ConstantPtrValue(PtrOptValue):
- def __init__(self, box):
- self.make_constant(box)
-
- def __repr__(self):
- return 'Constant(%r)' % (self.box,)
CONST_0 = ConstInt(0)
CONST_1 = ConstInt(1)
-CVAL_ZERO = ConstantIntValue(CONST_0)
-CVAL_ZERO_FLOAT = ConstantFloatValue(Const._new(0.0))
-llhelper.CVAL_NULLREF = ConstantPtrValue(llhelper.CONST_NULL)
+CONST_ZERO_FLOAT = Const._new(0.0)
+llhelper.CONST_NULLREF = llhelper.CONST_NULL
REMOVED = AbstractResOp()
@@ -438,8 +404,11 @@
self.next_optimization.propagate_forward(op)
# FIXME: Move some of these here?
- def getvalue(self, box):
- return self.optimizer.getvalue(box)
+ def getinfo(self, op, create=True):
+ return self.optimizer.getinfo(op, create=create)
+
+ def get_box_replacement(self, op):
+ return self.optimizer.get_box_replacement(op)
def getlastop(self):
return self.optimizer._last_emitted_op
@@ -603,8 +572,25 @@
else:
return box
- @specialize.argtype(0)
- def getvalue(self, box):
+ def getinfo(self, op, create=False):
+ while op.forwarded is not None:
+ op = op.forwarded
+ if isinstance(op, OptInfo) or isinstance(op, Const):
+ return op
+ if not create:
+ return None
+ if op.type == 'r':
+ optinfo = PtrOptInfo()
+ elif op.type == 'i':
+ optinfo = IntOptInfo()
+ else:
+ optinfo = OptInfo()
+ op.forwarded = optinfo
+ return optinfo
+ xxx
+ yyy
+
+ XXX
box = self.getinterned(box)
try:
value = self.values[box]
@@ -619,12 +605,14 @@
self.ensure_imported(value)
return value
- def get_box_replacement(self, box):
- try:
- v = self.values[box]
- except KeyError:
- return box
- return v.get_key_box()
+ def get_box_replacement(self, op):
+ orig_op = op
+ while (op.forwarded is not None and
+ not isinstance(op.forwarded, OptInfo)):
+ op = op.forwarded
+ if op is not orig_op:
+ orig_op.forwarded = op
+ return op
def ensure_imported(self, value):
pass
@@ -667,11 +655,8 @@
def replace_op_with(self, op, newopnum, args=None, descr=None):
newop = op.copy_and_change(newopnum, args, descr)
if newop.type != 'v':
- val = self.getvalue(op)
- if val.box is not None:
- assert val.box is op
- val.box = newop
- self.values[newop] = val
+ assert op.forwarded is None
+ op.forwarded = newop
return newop
def make_constant(self, box, constbox):
@@ -775,6 +760,7 @@
def get_op_replacement(self, op):
# XXX this is wrong
+ xxx
changed = False
for i, arg in enumerate(op.getarglist()):
try:
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -39,12 +39,13 @@
return
# did we do the exact same operation already?
- args = self.optimizer.make_args_key(op.getopnum(),
- op.getarglist(), op.getdescr())
- oldval = self.pure_operations.get(args, None)
- if oldval is not None:
- self.optimizer.make_equal_to(op, oldval)
- return
+ if 0:
+ args = self.optimizer.make_args_key(op.getopnum(),
+ op.getarglist(), op.getdescr())
+ oldval = self.pure_operations.get(args, None)
+ if oldval is not None:
+ self.optimizer.make_equal_to(op, oldval)
+ return
# otherwise, the operation remains
self.emit_operation(op)
@@ -52,8 +53,8 @@
self.optimizer.bool_boxes[self.getvalue(op)] = None
if nextop:
self.emit_operation(nextop)
- if args is not None:
- self.pure_operations[args] = self.getvalue(op)
+ #if args is not None:
+ # self.pure_operations[args] = self.getvalue(op)
def optimize_CALL_PURE_I(self, op):
# Step 1: check if all arguments are constant
@@ -102,6 +103,7 @@
self.optimizer.optpure = self
def pure(self, opnum, args, result):
+ return # XXX
key = self.optimizer.make_args_key(opnum, args, None)
if key not in self.pure_operations:
self.pure_operations[key] = self.getvalue(result)
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -6,7 +6,7 @@
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.optimizeopt.intutils import IntBound
from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, REMOVED,
- CONST_0, CONST_1, PtrOptValue)
+ CONST_0, CONST_1, PtrOptInfo)
from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
OpHelpers
@@ -108,14 +108,16 @@
self.emit_operation(op)
def optimize_INT_SUB(self, op):
- v1 = self.getvalue(op.getarg(0))
- v2 = self.getvalue(op.getarg(1))
- if v2.is_constant() and v2.box.getint() == 0:
+ arg1 = self.get_box_replacement(op.getarg(0))
+ arg2 = self.get_box_replacement(op.getarg(1))
+ if arg2.is_constant() and arg2.getint() == 0:
+ xxx
self.make_equal_to(op, v1)
- elif v1.is_constant() and v1.box.getint() == 0:
+ elif arg1.is_constant() and arg1.getint() == 0:
+ xxx
op = self.replace_op_with(op, rop.INT_NEG, args=[v2.box])
self.emit_operation(op)
- elif v1 is v2:
+ elif arg1 is arg2:
self.make_constant_int(op, 0)
else:
self.emit_operation(op)
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
@@ -4,7 +4,7 @@
from rpython.jit.metainterp.history import Const, ConstInt, BoxInt
from rpython.jit.metainterp.history import CONST_NULL, BoxPtr
from rpython.jit.metainterp.optimizeopt import optimizer
-from rpython.jit.metainterp.optimizeopt.optimizer import OptValue, REMOVED
+from rpython.jit.metainterp.optimizeopt.optimizer import OptInfo, REMOVED
from rpython.jit.metainterp.optimizeopt.util import (make_dispatcher_method,
descrlist_dict, sort_descrs)
@@ -13,7 +13,7 @@
from rpython.rlib.objectmodel import we_are_translated, specialize
from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
-class AbstractVirtualValue(optimizer.PtrOptValue):
+class AbstractVirtualValue(optimizer.PtrOptInfo):
_attrs_ = ('keybox', 'source_op', '_cached_vinfo')
box = None
_tag = optimizer.LEVEL_NONNULL
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
@@ -4,7 +4,7 @@
from rpython.jit.metainterp.optimizeopt import virtualize
from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
from rpython.jit.metainterp.optimizeopt.optimizer import (LEVEL_CONSTANT,
- LEVEL_KNOWNCLASS, LEVEL_NONNULL, LEVEL_UNKNOWN, OptValue)
+ LEVEL_KNOWNCLASS, LEVEL_NONNULL, LEVEL_UNKNOWN, OptInfo)
from rpython.jit.metainterp.resoperation import rop, ResOperation,\
AbstractInputArg
from rpython.jit.metainterp.compile import Memo
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -45,46 +45,46 @@
# ____________________________________________________________
-class __extend__(optimizer.OptValue):
- """New methods added to the base class OptValue for this file."""
+# class __extend__(optimizer.OptValue):
+# """New methods added to the base class OptValue for this file."""
- def getstrlen(self, string_optimizer, mode, lengthop):
- if mode is mode_string:
- s = self.get_constant_string_spec(mode_string)
- if s is not None:
- return ConstInt(len(s))
- else:
- s = self.get_constant_string_spec(mode_unicode)
- if s is not None:
- return ConstInt(len(s))
- if string_optimizer is None:
- return None
- self.ensure_nonnull()
- box = self.force_box(string_optimizer)
- if lengthop is not None:
- lengthop = string_optimizer.optimizer.replace_op_with(lengthop,
- mode.STRLEN, [box])
- else:
- lengthop = ResOperation(mode.STRLEN, [box])
- string_optimizer.emit_operation(lengthop)
- return lengthop
+# def getstrlen(self, string_optimizer, mode, lengthop):
+# if mode is mode_string:
+# s = self.get_constant_string_spec(mode_string)
+# if s is not None:
+# return ConstInt(len(s))
+# else:
+# s = self.get_constant_string_spec(mode_unicode)
+# if s is not None:
+# return ConstInt(len(s))
+# if string_optimizer is None:
+# return None
+# self.ensure_nonnull()
+# box = self.force_box(string_optimizer)
+# if lengthop is not None:
+# lengthop = string_optimizer.optimizer.replace_op_with(lengthop,
+# mode.STRLEN, [box])
+# else:
+# lengthop = ResOperation(mode.STRLEN, [box])
+# string_optimizer.emit_operation(lengthop)
+# return lengthop
- @specialize.arg(1)
- def get_constant_string_spec(self, mode):
- if self.is_constant():
- s = self.box.getref(lltype.Ptr(mode.LLTYPE))
- return mode.hlstr(s)
- else:
- return None
+# @specialize.arg(1)
+# def get_constant_string_spec(self, mode):
+# if self.is_constant():
+# s = self.box.getref(lltype.Ptr(mode.LLTYPE))
+# return mode.hlstr(s)
+# else:
+# return None
- def string_copy_parts(self, string_optimizer, targetbox, offsetbox, mode):
- # Copies the pointer-to-string 'self' into the target string
- # given by 'targetbox', at the specified offset. Returns the offset
- # at the end of the copy.
- lengthbox = self.getstrlen(string_optimizer, mode, None)
- srcbox = self.force_box(string_optimizer)
- return copy_str_content(string_optimizer, srcbox, targetbox,
- CONST_0, offsetbox, lengthbox, mode)
+# def string_copy_parts(self, string_optimizer, targetbox, offsetbox, mode):
+# # Copies the pointer-to-string 'self' into the target string
+# # given by 'targetbox', at the specified offset. Returns the offset
+# # at the end of the copy.
+# lengthbox = self.getstrlen(string_optimizer, mode, None)
+# srcbox = self.force_box(string_optimizer)
+# return copy_str_content(string_optimizer, srcbox, targetbox,
+# CONST_0, offsetbox, lengthbox, mode)
class VAbstractStringValue(virtualize.AbstractVirtualValue):
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -15,6 +15,9 @@
def repr_short(self, memo):
return self.repr(memo)
+ def is_constant(self):
+ return False
+
DONT_CHANGE = AbstractValue()
def ResOperation(opnum, args, descr=None):
@@ -42,8 +45,9 @@
type = 'v'
boolreflex = -1
boolinverse = -1
+ forwarded = None # either another resop or OptInfo
- _attrs_ = ()
+ _attrs_ = ('forwarded',)
def getopnum(self):
return self.opnum
@@ -394,6 +398,7 @@
return InputArgRef()
class AbstractInputArg(AbstractValue):
+ forwarded = None
def repr(self, memo):
try:
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -213,8 +213,8 @@
numb = lltype.malloc(NUMBERING, length)
for i in range(length):
box = boxes[i]
- value = optimizer.getvalue(box)
- box = value.get_key_box()
+ box = optimizer.get_box_replacement(box)
+ info = optimizer.getinfo(box, create=False)
if isinstance(box, Const):
tagged = self.getconst(box)
More information about the pypy-commit
mailing list