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

Reply via email to