Author: Lin Cheng <lc...@cornell.edu> Branch: record-exact-value Changeset: r96408:61bad9af9284 Date: 2019-04-03 10:04 -0400 http://bitbucket.org/pypy/pypy/changeset/61bad9af9284/
Log: ( yodada, cfbolz ) In progress: teach the optimizer about record_exact_value Something is still wrong. diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -287,6 +287,9 @@ def rewrite_op_jit_record_exact_class(self, op): return SpaceOperation("record_exact_class", [op.args[0], op.args[1]], None) + def rewrite_op_jit_record_exact_value(self, op): + return SpaceOperation("record_exact_value", [op.args[0], op.args[1]], None) + def rewrite_op_debug_assert_not_none(self, op): if isinstance(op.args[0], Variable): return SpaceOperation('assert_not_none', [op.args[0]], None) diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py --- a/rpython/jit/metainterp/blackhole.py +++ b/rpython/jit/metainterp/blackhole.py @@ -590,6 +590,10 @@ def bhimpl_record_exact_class(a, b): pass + @arguments("r", "r") + def bhimpl_record_exact_value(a, b): + pass + @arguments("i", returns="i") def bhimpl_int_copy(a): return a 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 @@ -542,6 +542,12 @@ self.make_constant_class(op.getarg(0), expectedclassbox, update_last_guard=False) + def optimize_RECORD_EXACT_VALUE(self, op): + box = op.getarg(0) + expectedconstbox = op.getarg(1) + assert isinstance(expectedconstbox, Const) + self.make_constant(box, expectedconstbox) + def optimize_GUARD_CLASS(self, op): expectedclassbox = op.getarg(1) info = self.ensure_ptr_info_arg0(op) diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py b/rpython/jit/metainterp/optimizeopt/simplify.py --- a/rpython/jit/metainterp/optimizeopt/simplify.py +++ b/rpython/jit/metainterp/optimizeopt/simplify.py @@ -48,6 +48,9 @@ def optimize_RECORD_EXACT_CLASS(self, op): pass + def optimize_RECORD_EXACT_VALUE(self, op): + pass + # def optimize_LABEL(self, op): # if not self.unroll: # descr = op.getdescr() diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -7221,6 +7221,21 @@ """ self.optimize_loop(ops, expected) + def test_record_exact_value(self): + ops = """ + [p0] + record_exact_value(p0, ConstPtr(myptr3)) + i1 = getfield_gc_i(p0, descr=valuedescr3) + escape_i(i1) + jump(p0) + """ + expected = """ + [] + escape_i(7) + jump() + """ + self.optimize_loop(ops, expected) + def test_quasi_immut(self): ops = """ [p0, p1, i0] @@ -8809,7 +8824,7 @@ i2 = int_add(i1, 1) i3 = int_le(i2, 13) guard_true(i3) [p1] - jump(p0, i2) + jump(p0, i2) """ expected = """ [p0, i1, p1] @@ -8824,7 +8839,7 @@ i2 = int_add(i1, 1) i3 = int_le(i2, 13) guard_true(i3) [p1] - jump(p0, i2, p1) + jump(p0, i2, p1) """ self.optimize_loop(ops, expected, preamble) @@ -8846,7 +8861,7 @@ escape_n(i4) setfield_gc(p0, i1, descr=valuedescr) ii = same_as_i(i1) - jump(p0, i0, i3, i1, ii) + jump(p0, i0, i3, i1, ii) """ expected = """ [p0, i0, i2, i4, i5] @@ -8887,7 +8902,7 @@ jump(i19) """ self.optimize_loop(ops, expected, expected_short=expected_short) - + def test_cached_arrayitem_write_descr(self): ops = """ 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 @@ -301,6 +301,21 @@ debug_print("record_exact_class with non-constant second argument, ignored", name, loc) + @arguments("box", "box") + def opimpl_record_exact_value(self, box, const_box): + if isinstance(const_box, Const): + self.execute(rop.RECORD_EXACT_VALUE, box, const_box) + elif have_debug_prints(): + if len(self.metainterp.framestack) >= 2: + # caller of ll_record_exact_value + name = self.metainterp.framestack[-2].jitcode.name + else: + name = self.jitcode.name + loc = self.metainterp.jitdriver_sd.warmstate.get_location_str(self.greenkey) + debug_print("record_exact_value with non-constant second argument, ignored", + name, loc) + + @arguments("box") def _opimpl_any_return(self, box): self.metainterp.finishframe(box) 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 @@ -137,7 +137,7 @@ return 'v' + str(num) if hasattr(self, '_vec_debug_info'): vecinfo = self._vec_debug_info - count = vecinfo.count + count = vecinfo.count datatype = vecinfo.datatype bytesize = vecinfo.bytesize elif self.vector == -2: @@ -322,7 +322,7 @@ "shallow copy: the returned operation is meant to be used in place of self" # XXX specialize from rpython.jit.metainterp.history import DONT_CHANGE - + if args is None: args = self.getarglist_copy() if descr is None: @@ -1140,6 +1140,7 @@ 'QUASIIMMUT_FIELD/1d/n', # [objptr], descr=SlowMutateDescr 'ASSERT_NOT_NONE/1/n', # [objptr] 'RECORD_EXACT_CLASS/2/n', # [objptr, clsptr] + 'RECORD_EXACT_VALUE/2/n', # [objptr, objptr] 'KEEPALIVE/1/n', 'SAVE_EXCEPTION/0/r', 'SAVE_EXC_CLASS/0/i', # XXX kill me 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 @@ -13,7 +13,7 @@ from rpython.rlib.jit import (JitDriver, we_are_jitted, hint, dont_look_inside, loop_invariant, elidable, promote, jit_debug, assert_green, AssertGreenFailed, unroll_safe, current_trace_length, look_inside_iff, - isconstant, isvirtual, set_param, record_exact_class) + isconstant, isvirtual, set_param, record_exact_class, record_exact_value) from rpython.rlib.longlong2float import float2longlong, longlong2float from rpython.rlib.rarithmetic import ovfcheck, is_valid_int, int_force_ge_zero from rpython.rtyper.lltypesystem import lltype, rffi @@ -4038,6 +4038,32 @@ assert res1 == res2 self.check_operations_history(guard_class=1, record_exact_class=0) + def test_record_exact_value(self): + class A(object): + _immutable_fields_ = ['x'] + + a = A() + b = A() + a.x = 42 + b.x = 233 + + @dont_look_inside + def make(x): + if x > 0: + return a + else: + return b + def f(x): + inst = make(x) + if x > 0: + record_exact_value(inst, a) + else: + record_exact_value(inst, b) + return inst.x + res = self.interp_operations(f, [1]) + assert res == 42 + self.check_operations_history(record_exact_value=1) + def test_generator(self): def g(n): yield n+1 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit