Author: Maciej Fijalkowski <[email protected]>
Branch:
Changeset: r74502:bd3a657b79af
Date: 2014-11-13 15:22 +0200
http://bitbucket.org/pypy/pypy/changeset/bd3a657b79af/
Log: try a slightly more efficient logic to avoid some dict lookups for
every operation (likely doomed to be lost in the noise though)
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
@@ -8,8 +8,7 @@
from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization,
REMOVED,
CONST_0, CONST_1)
from rpython.jit.metainterp.optimizeopt.util import _findall,
make_dispatcher_method
-from rpython.jit.metainterp.resoperation import (opboolinvers, opboolreflex,
rop,
- ResOperation)
+from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses
from rpython.rlib.rarithmetic import highest_bit
import math
@@ -26,9 +25,10 @@
sb.add_potential(op)
def propagate_forward(self, op):
- args = self.optimizer.make_args_key(op)
- if self.find_rewritable_bool(op, args):
- return
+ if op.boolinverse != -1 or op.boolreflex != -1:
+ args = self.optimizer.make_args_key(op)
+ if self.find_rewritable_bool(op, args):
+ return
dispatch_opt(self, op)
@@ -48,21 +48,15 @@
def find_rewritable_bool(self, op, args):
- try:
- oldopnum = opboolinvers[op.getopnum()]
- except KeyError:
- pass
- else:
+ oldopnum = op.boolinverse
+ if oldopnum != -1:
targs = self.optimizer.make_args_key(ResOperation(oldopnum,
[args[0], args[1]],
None))
if self.try_boolinvers(op, targs):
return True
- try:
- oldopnum = opboolreflex[op.getopnum()] # FIXME: add INT_ADD,
INT_MUL
- except KeyError:
- pass
- else:
+ oldopnum = op.boolreflex # FIXME: add INT_ADD, INT_MUL
+ if oldopnum != -1:
targs = self.optimizer.make_args_key(ResOperation(oldopnum,
[args[1], args[0]],
None))
oldop = self.get_pure_result(targs)
@@ -70,13 +64,12 @@
self.make_equal_to(op.result, self.getvalue(oldop.result))
return True
- try:
- oldopnum = opboolinvers[opboolreflex[op.getopnum()]]
- except KeyError:
- pass
- else:
- targs = self.optimizer.make_args_key(ResOperation(oldopnum,
[args[1], args[0]],
- None))
+ if op.boolreflex == -1:
+ return False
+ oldopnum = opclasses[op.boolreflex].boolinverse
+ if oldopnum != -1:
+ targs = self.optimizer.make_args_key(
+ ResOperation(oldopnum, [args[1], args[0]], None))
if self.try_boolinvers(op, targs):
return True
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
@@ -23,6 +23,8 @@
pc = 0
opnum = 0
_cls_has_bool_result = False
+ boolreflex = -1
+ boolinverse = -1
_attrs_ = ('result',)
@@ -623,7 +625,7 @@
setup(__name__ == '__main__') # print out the table when run directly
del _oplist
-opboolinvers = {
+_opboolinverse = {
rop.INT_EQ: rop.INT_NE,
rop.INT_NE: rop.INT_EQ,
rop.INT_LT: rop.INT_GE,
@@ -647,7 +649,7 @@
rop.PTR_NE: rop.PTR_EQ,
}
-opboolreflex = {
+_opboolreflex = {
rop.INT_EQ: rop.INT_EQ,
rop.INT_NE: rop.INT_NE,
rop.INT_LT: rop.INT_GT,
@@ -671,6 +673,19 @@
rop.PTR_NE: rop.PTR_NE,
}
+def setup2():
+ for cls in opclasses:
+ if cls is None:
+ continue
+ opnum = cls.opnum
+ if opnum in _opboolreflex:
+ cls.boolreflex = _opboolreflex[opnum]
+ if opnum in _opboolinverse:
+ cls.boolinverse = _opboolinverse[opnum]
+
+setup2()
+del _opboolinverse
+del _opboolreflex
def get_deep_immutable_oplist(operations):
"""
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit