Author: Armin Rigo <[email protected]>
Branch: conditional_call_value_4
Changeset: r88610:e15e2e2c8a63
Date: 2016-11-24 10:32 +0100
http://bitbucket.org/pypy/pypy/changeset/e15e2e2c8a63/
Log: Next fix, now the test passes with less operations than before
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
@@ -1,5 +1,5 @@
-from rpython.rlib.objectmodel import specialize, we_are_translated
+from rpython.rlib.objectmodel import specialize, we_are_translated,
compute_hash
from rpython.jit.metainterp.resoperation import AbstractValue, ResOperation,\
rop, OpHelpers
from rpython.jit.metainterp.history import ConstInt, Const
@@ -73,6 +73,9 @@
def getstrlen(self, op, string_optimizer, mode, create_ops=True):
return None
+ def getstrhash(self, op, mode):
+ return None
+
def copy_fields_to_const(self, constinfo, optheap):
pass
@@ -790,6 +793,20 @@
return None
return ConstInt(len(s))
+ def getstrhash(self, op, mode):
+ from rpython.jit.metainterp.optimizeopt import vstring
+
+ if mode is vstring.mode_string:
+ s = self._unpack_str(vstring.mode_string)
+ if s is None:
+ return None
+ return ConstInt(compute_hash(s))
+ else:
+ s = self._unpack_str(vstring.mode_unicode)
+ if s is None:
+ return None
+ return ConstInt(compute_hash(s))
+
def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox,
mode):
from rpython.jit.metainterp.optimizeopt import vstring
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
@@ -537,6 +537,20 @@
return
return self.emit(op)
+ def optimize_STRHASH(self, op):
+ return self._optimize_STRHASH(op, mode_string)
+ def optimize_UNICODEHASH(self, op):
+ return self._optimize_STRHASH(op, mode_unicode)
+
+ def _optimize_STRHASH(self, op, mode):
+ opinfo = self.getptrinfo(op.getarg(0))
+ if opinfo:
+ lgtop = opinfo.getstrhash(op, mode)
+ if lgtop is not None:
+ self.make_equal_to(op, lgtop)
+ return
+ return self.emit(op)
+
def optimize_COPYSTRCONTENT(self, op):
return self._optimize_COPYSTRCONTENT(op, mode_string)
diff --git a/rpython/jit/metainterp/test/test_ajit.py
b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -3775,9 +3775,8 @@
return n
res = self.meta_interp(f, [10])
assert res == 0
- self.check_resops({'int_gt': 2, 'getfield_gc_i': 1, 'int_eq': 1,
- 'guard_true': 2, 'int_sub': 2, 'jump': 1,
- 'guard_false': 1})
+ self.check_resops({'int_sub': 2, 'int_gt': 2, 'guard_true': 2,
+ 'jump': 1})
def test_virtual_after_bridge(self):
myjitdriver = JitDriver(greens = [], reds = ["n"])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit