Author: Ronan Lamy <ronan.l...@gmail.com> Branch: jit-cleanup Changeset: r96413:e6ca265bbc8a Date: 2019-04-03 20:28 +0100 http://bitbucket.org/pypy/pypy/changeset/e6ca265bbc8a/
Log: Move new_ref_dict() to rpython.jit.metainterp.history diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py --- a/rpython/jit/backend/llsupport/rewrite.py +++ b/rpython/jit/backend/llsupport/rewrite.py @@ -1,18 +1,15 @@ from rpython.rlib import rgc -from rpython.rlib.objectmodel import we_are_translated, r_dict, always_inline +from rpython.rlib.objectmodel import we_are_translated, always_inline from rpython.rlib.rarithmetic import ovfcheck, highest_bit from rpython.rtyper.lltypesystem import llmemory, lltype, rstr from rpython.rtyper.annlowlevel import cast_instance_to_gcref -from rpython.jit.metainterp import history -from rpython.jit.metainterp.history import ConstInt, ConstPtr +from rpython.jit.metainterp.history import ( + ConstInt, ConstPtr, JitCellToken, new_ref_dict) from rpython.jit.metainterp.resoperation import ResOperation, rop, OpHelpers -from rpython.jit.metainterp.typesystem import rd_eq, rd_hash from rpython.jit.codewriter import heaptracker from rpython.jit.backend.llsupport.symbolic import (WORD, get_field_token, get_array_token) -from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr,\ - FLAG_POINTER -from rpython.jit.metainterp.history import JitCellToken +from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr from rpython.jit.backend.llsupport.descr import (unpack_arraydescr, unpack_fielddescr, unpack_interiorfielddescr) from rpython.rtyper.lltypesystem.lloperation import llop @@ -608,11 +605,11 @@ def handle_call_assembler(self, op): descrs = self.gc_ll_descr.getframedescrs(self.cpu) loop_token = op.getdescr() - assert isinstance(loop_token, history.JitCellToken) + assert isinstance(loop_token, JitCellToken) jfi = loop_token.compiled_loop_token.frame_info llfi = heaptracker.adr2int(llmemory.cast_ptr_to_adr(jfi)) frame = self.gen_malloc_frame(llfi) - self.emit_setfield(frame, history.ConstInt(llfi), + self.emit_setfield(frame, ConstInt(llfi), descr=descrs.jf_frame_info) arglist = op.getarglist() index_list = loop_token.compiled_loop_token._ll_initial_locs @@ -948,7 +945,7 @@ def _gcref_index(self, gcref): if self.gcrefs_map is None: - self.gcrefs_map = r_dict(rd_eq, rd_hash) + self.gcrefs_map = new_ref_dict() try: return self.gcrefs_map[gcref] except KeyError: diff --git a/rpython/jit/backend/test/jitlog_test.py b/rpython/jit/backend/test/jitlog_test.py --- a/rpython/jit/backend/test/jitlog_test.py +++ b/rpython/jit/backend/test/jitlog_test.py @@ -3,7 +3,6 @@ from rpython.rlib import debug from rpython.jit.tool.oparser import pure_parse from rpython.jit.metainterp import logger -from rpython.jit.metainterp.typesystem import llhelper from rpython.rlib.rjitlog import rjitlog as jl from StringIO import StringIO from rpython.jit.metainterp.optimizeopt.util import equaloplists 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 @@ -3,8 +3,8 @@ from rpython.rtyper.lltypesystem import lltype, llmemory, rffi from rpython.rtyper.annlowlevel import ( cast_gcref_to_instance, cast_instance_to_gcref) -from rpython.rlib.objectmodel import we_are_translated, Symbolic -from rpython.rlib.objectmodel import compute_unique_id, specialize +from rpython.rlib.objectmodel import ( + we_are_translated, Symbolic, compute_unique_id, specialize, r_dict) from rpython.rlib.rarithmetic import r_int64, is_valid_int from rpython.rlib.rarithmetic import LONG_BIT, intmask, r_uint from rpython.rlib.jit import Counters @@ -386,6 +386,20 @@ return result _const_ptr_for_unicode = {} +# A dict whose keys are refs (like the .value of ConstPtr). +# It is an r_dict. Note that NULL is not allowed as a key. +@specialize.call_location() +def new_ref_dict(): + return r_dict(rd_eq, rd_hash, simple_hash_eq=True) + +def rd_eq(ref1, ref2): + return ref1 == ref2 + +def rd_hash(ref): + assert ref + return lltype.identityhash(ref) + + # ____________________________________________________________ # The JitCellToken class is the root of a tree of traces. Each branch ends diff --git a/rpython/jit/metainterp/opencoder.py b/rpython/jit/metainterp/opencoder.py --- a/rpython/jit/metainterp/opencoder.py +++ b/rpython/jit/metainterp/opencoder.py @@ -6,14 +6,14 @@ Snapshot index for guards points to snapshot stored in _snapshots of trace """ -from rpython.jit.metainterp.history import ConstInt, Const, ConstFloat, ConstPtr +from rpython.jit.metainterp.history import ( + ConstInt, Const, ConstFloat, ConstPtr, new_ref_dict) from rpython.jit.metainterp.resoperation import AbstractResOp, AbstractInputArg,\ ResOperation, oparity, rop, opwithdescr, GuardResOp, IntOp, FloatOp, RefOp,\ opclasses from rpython.rlib.rarithmetic import intmask, r_uint from rpython.rlib.objectmodel import we_are_translated, specialize from rpython.rtyper.lltypesystem import rffi, lltype, llmemory -from rpython.jit.metainterp.typesystem import llhelper TAGINT, TAGCONSTPTR, TAGCONSTOTHER, TAGBOX = range(4) TAGMASK = 0x3 @@ -179,7 +179,7 @@ if opwithdescr[opnum]: descr_index = self._next() if rop.is_guard(opnum): - update_liveranges(self.trace._snapshots[descr_index], index, + update_liveranges(self.trace._snapshots[descr_index], index, liveranges) if opclasses[opnum].type != 'v': return index + 1 @@ -274,7 +274,7 @@ self._consts_ptr = 0 self._descrs = [None] self._refs = [lltype.nullptr(llmemory.GCREF.TO)] - self._refs_dict = llhelper.new_ref_dict_3() + self._refs_dict = new_ref_dict() self._bigints = [] self._bigints_dict = {} self._floats = [] @@ -304,7 +304,7 @@ assert not self.tag_overflow self._bigints_dict = {} - self._refs_dict = llhelper.new_ref_dict_3() + self._refs_dict = new_ref_dict() debug_start("jit-trace-done") debug_print("trace length: " + str(self._pos)) debug_print(" total snapshots: " + str(self._total_snapshots)) diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -3,7 +3,7 @@ from rpython.jit.codewriter.effectinfo import EffectInfo from rpython.jit.metainterp.optimizeopt.util import args_dict -from rpython.jit.metainterp.history import Const, ConstInt +from rpython.jit.metainterp.history import Const, ConstInt, new_ref_dict from rpython.jit.metainterp.jitexc import JitException from rpython.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method @@ -14,7 +14,7 @@ GuardResOp from rpython.rlib.objectmodel import we_are_translated from rpython.jit.metainterp.optimizeopt import info - + class BogusImmutableField(JitException): @@ -97,7 +97,7 @@ # need any _lazy_set: the heap value is already right. # Note that this may reset to None a non-None lazy_set, # cancelling its previous effects with no side effect. - + # Now, we have to force the item in the short preamble self._getfield(structinfo, op.getdescr(), optheap) self._lazy_set = None @@ -251,7 +251,7 @@ def setup(self): self.optimizer.optheap = self # mapping const value -> info corresponding to it's heap cache - self.const_infos = self.optimizer.cpu.ts.new_ref_dict() + self.const_infos = new_ref_dict() def flush(self): self.cached_dict_reads.clear() 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 @@ -1,7 +1,7 @@ from rpython.jit.metainterp import jitprof, resume, compile from rpython.jit.metainterp.executor import execute_nonspec_const from rpython.jit.metainterp.history import ( - Const, ConstInt, ConstPtr, CONST_NULL) + Const, ConstInt, ConstPtr, CONST_NULL, new_ref_dict) from rpython.jit.metainterp.optimizeopt.intutils import IntBound,\ ConstIntBound, MININT, MAXINT, IntUnbounded from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method @@ -9,7 +9,6 @@ OpHelpers from rpython.jit.metainterp.optimizeopt import info from rpython.jit.metainterp.optimize import InvalidLoop -from rpython.jit.metainterp.typesystem import llhelper from rpython.rlib.objectmodel import specialize, we_are_translated from rpython.rlib.debug import debug_print from rpython.rtyper import rclass @@ -272,7 +271,7 @@ self.metainterp_sd = metainterp_sd self.jitdriver_sd = jitdriver_sd self.cpu = metainterp_sd.cpu - self.interned_refs = self.cpu.ts.new_ref_dict() + self.interned_refs = new_ref_dict() self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd) self.pendingfields = None # set temporarily to a list, normally by # heap.py, as we're about to generate a guard 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 @@ -2,9 +2,8 @@ from rpython.jit.metainterp.history import (Const, ConstInt, ConstPtr, get_const_ptr_for_string, get_const_ptr_for_unicode, REF, INT, DONT_CHANGE, CONST_NULL) -from rpython.jit.metainterp.optimizeopt import optimizer -from rpython.jit.metainterp.optimizeopt.optimizer import CONST_0, CONST_1 -from rpython.jit.metainterp.optimizeopt.optimizer import llhelper, REMOVED +from rpython.jit.metainterp.optimizeopt.optimizer import ( + CONST_0, CONST_1, REMOVED, Optimization) from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method from rpython.jit.metainterp.resoperation import rop, ResOperation from rpython.jit.metainterp.optimizeopt import info @@ -47,7 +46,6 @@ # ____________________________________________________________ - class StrPtrInfo(info.AbstractVirtualPtrInfo): #_attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo', '_is_virtual') @@ -72,7 +70,7 @@ @specialize.arg(2) def get_constant_string_spec(self, string_optimizer, mode): - return None # can't be constant + return None # can't be constant def force_box(self, op, optforce): if not self.is_virtual(): @@ -196,8 +194,8 @@ def initialize_forced_string(self, op, string_optimizer, targetbox, offsetbox, mode): for i in range(len(self._chars)): - assert not isinstance(targetbox, Const) # ConstPtr never makes sense - charbox = self.strgetitem(i) # can't be virtual + assert not isinstance(targetbox, Const) # ConstPtr never makes sense + charbox = self.strgetitem(i) # can't be virtual if charbox is not None: op = ResOperation(mode.STRSETITEM, [targetbox, offsetbox, @@ -247,7 +245,7 @@ length = vlength.getint() assert start >= 0 assert length >= 0 - return s1[start : start + length] + return s1[start: start + length] return None def getstrlen(self, op, string_optimizer, mode): @@ -353,7 +351,7 @@ charbox = string_optimizer.strgetitem(None, srcbox, srcoffsetbox, mode) srcoffsetbox = _int_add(string_optimizer, srcoffsetbox, CONST_1) - assert not isinstance(targetbox, Const)# ConstPtr never makes sense + assert not isinstance(targetbox, Const) # ConstPtr never makes sense string_optimizer.emit_extra(ResOperation(mode.STRSETITEM, [targetbox, offsetbox, charbox])) offsetbox = _int_add(string_optimizer, offsetbox, CONST_1) @@ -412,7 +410,7 @@ return resbox -class OptString(optimizer.Optimization): +class OptString(Optimization): "Handling of strings and unicodes." def setup(self): @@ -444,6 +442,7 @@ def optimize_NEWSTR(self, op): return self._optimize_NEWSTR(op, mode_string) + def optimize_NEWUNICODE(self, op): return self._optimize_NEWSTR(op, mode_unicode) @@ -480,6 +479,7 @@ def optimize_STRGETITEM(self, op): return self._optimize_STRGETITEM(op, mode_string) + def optimize_UNICODEGETITEM(self, op): return self._optimize_STRGETITEM(op, mode_unicode) @@ -522,6 +522,7 @@ def optimize_STRLEN(self, op): return self._optimize_STRLEN(op, mode_string) + def optimize_UNICODELEN(self, op): return self._optimize_STRLEN(op, mode_unicode) @@ -537,6 +538,7 @@ def optimize_STRHASH(self, op): return self._optimize_STRHASH(op, mode_string) + def optimize_UNICODEHASH(self, op): return self._optimize_STRHASH(op, mode_unicode) @@ -761,18 +763,15 @@ l1box = i1.getstrlen(arg1, self, mode) if isinstance(l1box, ConstInt) and l1box.value == 1: # comparing two single chars - vchar1 = self.strgetitem(None, arg1, optimizer.CONST_0, - mode) - vchar2 = self.strgetitem(None, arg2, optimizer.CONST_0, - mode) + vchar1 = self.strgetitem(None, arg1, CONST_0, mode) + vchar2 = self.strgetitem(None, arg2, CONST_0, mode) seo = self.optimizer.send_extra_operation op = self.optimizer.replace_op_with(resultop, rop.INT_EQ, [vchar1, vchar2], descr=DONT_CHANGE) seo(op) return True, None if isinstance(i1, VStringSliceInfo): - vchar = self.strgetitem(None, arg2, optimizer.CONST_0, - mode) + vchar = self.strgetitem(None, arg2, CONST_0, mode) do = EffectInfo.OS_STREQ_SLICE_CHAR return True, self.generate_modified_call(do, [i1.s, i1.start, i1.lgtop, vchar], @@ -801,7 +800,7 @@ l2info = self.getintbound(l2box) if l2info.is_constant(): if l2info.getint() == 1: - vchar = self.strgetitem(None, arg2, optimizer.CONST_0, mode) + vchar = self.strgetitem(None, arg2, CONST_0, mode) if i1 and i1.is_nonnull(): do = EffectInfo.OS_STREQ_NONNULL_CHAR else: @@ -832,8 +831,8 @@ isinstance(l2box, ConstInt) and l1box.getint() == l2box.getint() == 1): # comparing two single chars - char1 = self.strgetitem(None, op.getarg(1), optimizer.CONST_0, mode) - char2 = self.strgetitem(None, op.getarg(2), optimizer.CONST_0, mode) + char1 = self.strgetitem(None, op.getarg(1), CONST_0, mode) + char2 = self.strgetitem(None, op.getarg(2), CONST_0, mode) seo = self.optimizer.send_extra_operation op = self.replace_op_with(op, rop.INT_SUB, [char1, char2], descr=DONT_CHANGE) 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 @@ -2,7 +2,8 @@ from rpython.jit.metainterp import jitprof from rpython.jit.metainterp.history import ( Const, ConstInt, ConstPtr, getkind, INT, REF, FLOAT, CONST_NULL, - AbstractDescr, IntFrontendOp, RefFrontendOp, FloatFrontendOp) + AbstractDescr, IntFrontendOp, RefFrontendOp, FloatFrontendOp, + new_ref_dict) from rpython.jit.metainterp.resoperation import rop from rpython.rlib import rarithmetic, rstack from rpython.rlib.objectmodel import (we_are_translated, specialize, @@ -177,7 +178,7 @@ self.cpu = metainterp_sd.cpu self.consts = [] self.large_ints = {} - self.refs = self.cpu.ts.new_ref_dict_2() + self.refs = new_ref_dict() self.cached_boxes = {} self.cached_virtuals = {} diff --git a/rpython/jit/metainterp/test/test_history.py b/rpython/jit/metainterp/test/test_history.py --- a/rpython/jit/metainterp/test/test_history.py +++ b/rpython/jit/metainterp/test/test_history.py @@ -70,6 +70,30 @@ f.set_position(6519) assert f.get_position() == 6519 +def fresh_ref(): + S = lltype.GcStruct('S') + s = lltype.malloc(S) + return lltype.cast_opaque_ptr(llmemory.GCREF, s) + +def duplicate_ref(x): + s = x._obj.container._as_ptr() + return lltype.cast_opaque_ptr(llmemory.GCREF, s) + +def test_ref_dict(): + d = new_ref_dict() + ref1 = fresh_ref() + ref2 = fresh_ref() + ref3 = fresh_ref() + d[ref1] = 123 + d[ref2] = 456 + d[ref3] = 789 + ref1b = duplicate_ref(ref1) + ref2b = duplicate_ref(ref2) + ref3b = duplicate_ref(ref3) + assert d[ref1b] == 123 + assert d[ref2b] == 456 + assert d[ref3b] == 789 + class TestZTranslated(StandaloneTests): def test_ztranslated_same_constant_float(self): def fn(args): diff --git a/rpython/jit/metainterp/test/test_typesystem.py b/rpython/jit/metainterp/test/test_typesystem.py deleted file mode 100644 --- a/rpython/jit/metainterp/test/test_typesystem.py +++ /dev/null @@ -1,36 +0,0 @@ -from rpython.jit.metainterp import typesystem -from rpython.rtyper.lltypesystem import lltype, llmemory - - -class TypeSystemTests(object): - - def test_ref_dict(self): - d = self.helper.new_ref_dict() - ref1 = self.fresh_ref() - ref2 = self.fresh_ref() - ref3 = self.fresh_ref() - d[ref1] = 123 - d[ref2] = 456 - d[ref3] = 789 - ref1b = self.duplicate_ref(ref1) - ref2b = self.duplicate_ref(ref2) - ref3b = self.duplicate_ref(ref3) - assert d[ref1b] == 123 - assert d[ref2b] == 456 - assert d[ref3b] == 789 - - -class TestLLtype(TypeSystemTests): - helper = typesystem.llhelper - - def fresh_ref(self): - S = lltype.GcStruct('S') - s = lltype.malloc(S) - return lltype.cast_opaque_ptr(llmemory.GCREF, s) - - def duplicate_ref(self, x): - s = x._obj.container._as_ptr() - return lltype.cast_opaque_ptr(llmemory.GCREF, s) - - def null_ref(self): - return lltype.nullptr(llmemory.GCREF.TO) diff --git a/rpython/jit/metainterp/typesystem.py b/rpython/jit/metainterp/typesystem.py --- a/rpython/jit/metainterp/typesystem.py +++ b/rpython/jit/metainterp/typesystem.py @@ -19,23 +19,4 @@ cls = llmemory.cast_ptr_to_adr(obj.typeptr) return history.ConstInt(heaptracker.adr2int(cls)) - # A dict whose keys are refs (like the .value of BoxPtr). - # It is an r_dict on lltype. Two copies, to avoid conflicts with - # the value type. Note that NULL is not allowed as a key. - def new_ref_dict(self): - return r_dict(rd_eq, rd_hash, simple_hash_eq=True) - - def new_ref_dict_2(self): - return r_dict(rd_eq, rd_hash, simple_hash_eq=True) - - def new_ref_dict_3(self): - return r_dict(rd_eq, rd_hash, simple_hash_eq=True) - -def rd_eq(ref1, ref2): - return ref1 == ref2 - -def rd_hash(ref): - assert ref - return lltype.identityhash(ref) - llhelper = LLTypeHelper() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit