Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch: record-known-result
Changeset: r97696:d6d92c45bc0b
Date: 2019-10-01 15:20 +0200
http://bitbucket.org/pypy/pypy/changeset/d6d92c45bc0b/
Log: support for integer values in record_exact_value
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
@@ -310,7 +310,13 @@
return op1
def rewrite_op_jit_record_exact_value(self, op):
- return SpaceOperation("record_exact_value", [op.args[0], op.args[1]],
None)
+ if getkind(op.args[0].concretetype) == "int":
+ assert getkind(op.args[1].concretetype) == "int"
+ return SpaceOperation("record_exact_value_i", [op.args[0],
op.args[1]], None)
+ else:
+ assert getkind(op.args[0].concretetype) == "ref"
+ assert getkind(op.args[1].concretetype) == "ref"
+ return SpaceOperation("record_exact_value_r", [op.args[0],
op.args[1]], None)
def rewrite_op_debug_assert_not_none(self, op):
if isinstance(op.args[0], Variable):
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
@@ -603,7 +603,11 @@
pass
@arguments("r", "r")
- def bhimpl_record_exact_value(a, b):
+ def bhimpl_record_exact_value_r(a, b):
+ pass
+
+ @arguments("i", "i")
+ def bhimpl_record_exact_value_i(a, b):
pass
@arguments("i", returns="i")
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
@@ -541,12 +541,15 @@
self.make_constant_class(op.getarg(0), expectedclassbox,
update_last_guard=False)
- def optimize_RECORD_EXACT_VALUE(self, op):
+ def optimize_record_exact_value(self, op):
box = op.getarg(0)
expectedconstbox = op.getarg(1)
assert isinstance(expectedconstbox, Const)
self.make_constant(box, expectedconstbox)
+ optimize_RECORD_EXACT_VALUE_R = optimize_record_exact_value
+ optimize_RECORD_EXACT_VALUE_I = optimize_record_exact_value
+
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
@@ -43,7 +43,10 @@
def optimize_RECORD_EXACT_CLASS(self, op):
pass
- def optimize_RECORD_EXACT_VALUE(self, op):
+ def optimize_RECORD_EXACT_VALUE_R(self, op):
+ pass
+
+ def optimize_RECORD_EXACT_VALUE_I(self, op):
pass
def optimize_GUARD_FUTURE_CONDITION(self, op):
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
@@ -7215,7 +7215,7 @@
def test_record_exact_value(self):
ops = """
[p0]
- record_exact_value(p0, ConstPtr(myptr3))
+ record_exact_value_r(p0, ConstPtr(myptr3))
i1 = getfield_gc_i(p0, descr=valuedescr3)
escape_i(i1)
jump(p0)
@@ -7227,6 +7227,20 @@
"""
self.optimize_loop(ops, expected)
+ def test_record_exact_value_int(self):
+ ops = """
+ [i0]
+ record_exact_value_i(i0, 15)
+ escape_i(i0)
+ jump(i0)
+ """
+ expected = """
+ []
+ escape_i(15)
+ jump()
+ """
+ self.optimize_loop(ops, expected)
+
def test_quasi_immut(self):
ops = """
[p0, p1, i0]
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
@@ -314,9 +314,15 @@
self.metainterp._record_helper_nonpure_varargs(rop.RECORD_KNOWN_RESULT, None,
calldescr, allboxes)
@arguments("box", "box")
- def opimpl_record_exact_value(self, box, const_box):
+ def opimpl_record_exact_value_r(self, box, const_box):
+ return self._record_exact_value(rop.RECORD_EXACT_VALUE_R, box,
const_box)
+ @arguments("box", "box")
+ def opimpl_record_exact_value_i(self, box, const_box):
+ return self._record_exact_value(rop.RECORD_EXACT_VALUE_I, box,
const_box)
+
+ def _record_exact_value(self, opname, box, const_box):
if isinstance(const_box, Const):
- self.execute(rop.RECORD_EXACT_VALUE, box, const_box)
+ self.execute(opname, box, const_box)
elif have_debug_prints():
if len(self.metainterp.framestack) >= 2:
# caller of ll_record_exact_value
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
@@ -1143,7 +1143,8 @@
'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]
+ 'RECORD_EXACT_VALUE_R/2/n', # [objptr, objptr]
+ 'RECORD_EXACT_VALUE_I/2/n', # [int, int]
'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
@@ -4041,7 +4041,22 @@
return inst.x
res = self.interp_operations(f, [1])
assert res == 42
- self.check_operations_history(record_exact_value=1)
+ self.check_operations_history(record_exact_value_r=1)
+
+ def test_record_exact_value_int(self):
+ @dont_look_inside
+ def make(x):
+ if x > 0:
+ return 16
+ else:
+ return x
+ def f(x):
+ y = make(x)
+ record_exact_value(y >= 0, True)
+ return y < 0
+ res = self.interp_operations(f, [1])
+ assert res == 0
+ self.check_operations_history(record_exact_value_i=1)
def test_generator(self):
def g(n):
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -1236,22 +1236,21 @@
"""
Assure the JIT that value is the same as const_value
"""
- assert value is const_value
+ assert value == const_value
def ll_record_exact_value(ll_value, ll_const_value):
from rpython.rlib.debug import ll_assert
from rpython.rtyper.lltypesystem.lloperation import llop
from rpython.rtyper.lltypesystem import lltype
- ll_assert(ll_value is ll_const_value, "record_exact_value called with two
different arguments")
+ ll_assert(ll_value == ll_const_value, "record_exact_value called with two
different arguments")
llop.jit_record_exact_value(lltype.Void, ll_value, ll_const_value)
class Entry(ExtRegistryEntry):
_about_ = record_exact_value
- def compute_result_annotation(self, s_inst, s_const_inst):
+ def compute_result_annotation(self, s_val, s_const_val):
from rpython.annotator import model as annmodel
- assert isinstance(s_inst, annmodel.SomeInstance)
- assert isinstance(s_const_inst, annmodel.SomeInstance)
+ annmodel.unionof(s_val, s_const_val) # produce error if types are
incompatible
def specialize_call(self, hop):
from rpython.rtyper.lltypesystem import lltype
diff --git a/rpython/rlib/test/test_jit.py b/rpython/rlib/test/test_jit.py
--- a/rpython/rlib/test/test_jit.py
+++ b/rpython/rlib/test/test_jit.py
@@ -367,7 +367,16 @@
def g():
a = A()
b = A()
- record_exact_value(a,a) # assume not crash
+ record_exact_value(a, a) # assume not crash
+ self.interpret(g, [])
+
+ def test_record_exact_value_int(self):
+ @dont_look_inside
+ def f():
+ return 4
+ def g():
+ a = f()
+ record_exact_value(a >= 0, True) # does not crash
self.interpret(g, [])
def test_record_known_result(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit