Author: Armin Rigo <[email protected]>
Branch: conditional_call_value_4
Changeset: r88600:19979eb85207
Date: 2016-11-24 09:11 +0100
http://bitbucket.org/pypy/pypy/changeset/19979eb85207/
Log: Tracing: constant-fold strhash(). Makes
test_virtual_dict_constant_keys pass. Also, in bh_strhash(), always
compute the hash, never returns zero.
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -15,11 +15,12 @@
from rpython.rtyper.llinterp import LLInterpreter, LLException
from rpython.rtyper.lltypesystem import lltype, llmemory, rffi, rstr
from rpython.rtyper.lltypesystem.lloperation import llop
+from rpython.rtyper.annlowlevel import hlstr, hlunicode
from rpython.rtyper import rclass
from rpython.rlib.clibffi import FFI_DEFAULT_ABI
from rpython.rlib.rarithmetic import ovfcheck, r_uint, r_ulonglong, intmask
-from rpython.rlib.objectmodel import Symbolic
+from rpython.rlib.objectmodel import Symbolic, compute_hash
class LLAsmInfo(object):
def __init__(self, lltrace):
@@ -789,7 +790,8 @@
rstr.copy_string_contents(src, dst, srcstart, dststart, length)
def bh_strhash(self, s):
- return s._obj.container.hash
+ lls = s._obj.container
+ return compute_hash(hlstr(lls._as_ptr()))
def bh_newunicode(self, length):
return lltype.cast_opaque_ptr(llmemory.GCREF,
@@ -814,7 +816,8 @@
rstr.copy_unicode_contents(src, dst, srcstart, dststart, length)
def bh_unicodehash(self, s):
- return s._obj.container.hash
+ lls = s._obj.container
+ return compute_hash(hlunicode(lls._as_ptr()))
def bh_new(self, sizedescr):
return lltype.cast_opaque_ptr(llmemory.GCREF,
diff --git a/rpython/jit/backend/llsupport/llmodel.py
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -3,8 +3,9 @@
from rpython.rtyper.lltypesystem.lloperation import llop
from rpython.rtyper.llinterp import LLInterpreter
from rpython.rtyper.annlowlevel import llhelper, MixLevelHelperAnnotator
+from rpython.rtyper.annlowlevel import hlstr, hlunicode
from rpython.rtyper.llannotation import lltype_to_annotation
-from rpython.rlib.objectmodel import we_are_translated, specialize
+from rpython.rlib.objectmodel import we_are_translated, specialize,
compute_hash
from rpython.jit.metainterp import history, compile
from rpython.jit.metainterp.optimize import SpeculativeError
from rpython.jit.codewriter import heaptracker, longlong
@@ -665,11 +666,11 @@
def bh_strhash(self, string):
s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
- return s.hash
+ return compute_hash(hlstr(s))
def bh_unicodehash(self, string):
u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
- return u.hash
+ return compute_hash(hlunicode(u))
def bh_strgetitem(self, string, index):
s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1164,10 +1164,16 @@
@arguments("box")
def opimpl_strhash(self, strbox):
+ if isinstance(strbox, ConstPtr):
+ h = self.metainterp.cpu.bh_strhash(strbox.getref_base())
+ return ConstInt(h)
return self.execute(rop.STRHASH, strbox)
@arguments("box")
def opimpl_unicodehash(self, unicodebox):
+ if isinstance(unicodebox, ConstPtr):
+ h = self.metainterp.cpu.bh_unicodehash(unicodebox.getref_base())
+ return ConstInt(h)
return self.execute(rop.UNICODEHASH, unicodebox)
@arguments("box")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit