[pypy-commit] pypy record-exact-value: ( yodada, cfbolz )
yodada
pypy.commits at gmail.com
Wed Apr 3 10:14:10 EDT 2019
Author: Lin Cheng <lc873 at 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
More information about the pypy-commit
mailing list