[pypy-commit] pypy optresult-unroll: try to optimize resoperation
fijal
noreply at buildbot.pypy.org
Sat Sep 5 14:15:53 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79462:eb88042244ba
Date: 2015-09-05 14:16 +0200
http://bitbucket.org/pypy/pypy/changeset/eb88042244ba/
Log: try to optimize resoperation
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
@@ -33,16 +33,17 @@
llop.debug_print(lltype.Void, "setting forwarded on:", self.__class__.__name__)
raise SettingForwardedOnAbstractValue()
+ @specialize.arg(1)
def get_box_replacement(op, not_const=False):
- orig_op = op
- c = 0
- while (op.get_forwarded() is not None and
- not op.get_forwarded().is_info_class and
- (not not_const or not op.get_forwarded().is_constant())):
- c += 1
- op = op.get_forwarded()
- if op is not orig_op and c > 1:
- orig_op.set_forwarded(op)
+ # Read the chain "op, op._forwarded, op._forwarded._forwarded..."
+ # until we reach None or an Info instance, and return the last
+ # item before that.
+ while isinstance(op, AbstractResOpOrInputArg): # else, _forwarded is None
+ next_op = op._forwarded
+ if (next_op is None or next_op.is_info_class or
+ (not_const and next_op.is_constant())):
+ return op
+ op = next_op
return op
def reset_value(self):
@@ -62,10 +63,18 @@
return op
-class AbstractResOp(AbstractValue):
+class AbstractResOpOrInputArg(AbstractValue):
+ _attrs_ = ('_forwarded',)
+ _forwarded = None # either another resop or OptInfo
+
+ def get_forwarded(self):
+ return self._forwarded
+
+
+class AbstractResOp(AbstractResOpOrInputArg):
"""The central ResOperation class, representing one operation."""
- _attrs_ = ('_forwarded',)
+ _attrs_ = ()
# debug
name = ""
@@ -75,7 +84,6 @@
type = 'v'
boolreflex = -1
boolinverse = -1
- _forwarded = None # either another resop or OptInfo
def getopnum(self):
return self.opnum
@@ -85,9 +93,6 @@
# return self is other or self.getarg(0).same_box(other)
# return self is other
- def get_forwarded(self):
- return self._forwarded
-
def set_forwarded(self, forwarded_to):
assert forwarded_to is not self
self._forwarded = forwarded_to
@@ -447,12 +452,7 @@
return history.ConstPtr(self.getref_base())
-class AbstractInputArg(AbstractValue):
- _forwarded = None
-
- def get_forwarded(self):
- return self._forwarded
-
+class AbstractInputArg(AbstractResOpOrInputArg):
def set_forwarded(self, forwarded_to):
self._forwarded = forwarded_to
More information about the pypy-commit
mailing list