Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79152:b04b6f538add
Date: 2015-08-23 12:46 +0200
http://bitbucket.org/pypy/pypy/changeset/b04b6f538add/

Log:    write a test for bridge (failing so far)

diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -104,6 +104,10 @@
     def as_vtable_size_descr(self):
         return self
 
+    def get_vtable(self):
+        return heaptracker.adr2int(llmemory.cast_ptr_to_adr(
+            self._corresponding_vtable))
+
     def count_fields_if_immutable(self):
         return heaptracker.count_fields_if_immutable(self.S)
 
diff --git a/rpython/jit/metainterp/compile.py 
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -223,7 +223,7 @@
     jump_op = ops[-1]
     target_token = TargetToken(jitcell_token)
     target_token.original_jitcell_token = jitcell_token
-    label.setdescr(target_token)
+    label = ResOperation(rop.LABEL, loop_info.inputargs[:], descr=target_token)
     jump_op.setdescr(target_token)
     loop.operations = [label] + ops
     loop.check_consistency()
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
@@ -94,3 +94,25 @@
         jump(i0, i1, i2, i3)
         """
         self.optimize(loop, bridge, expected)
+
+    def test_virtual_state_in_bridge(self):
+        loop = """
+        [i0, p1]
+        p0 = new_with_vtable(descr=simpledescr)
+        setfield_gc(p0, i0, descr=simplevalue)
+        i3 = int_is_true(i0)
+        guard_true(i3) [p0]
+        i1 = int_add(i0, 1)
+        jump(i1, p0)
+        """
+        bridge = """
+        [p0]
+        p1 = new_with_vtable(descr=simpledescr)
+        setfield_gc(p1, 3, descr=simplevalue)
+        jump(1, p1)
+        """
+        expected = """
+        []
+        jump(1, 3)
+        """
+        self.optimize(loop, bridge, expected)
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
@@ -8253,7 +8253,7 @@
         [p22, p18]
         i1 = getfield_gc_i(p22, descr=valuedescr)
         guard_value(i1, 2) []
-        jump(p22, p18)
+        jump()
         """
         expected = """
         [p22, p18]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -212,6 +212,12 @@
                         ('one', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE)))))
     u_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
     u_vtable_adr = llmemory.cast_ptr_to_adr(u_vtable)
+    SIMPLE = lltype.GcStruct('simple',
+        ('parent', OBJECT),
+        ('value', lltype.Signed))
+    simpledescr = cpu.sizeof(SIMPLE, True)
+    simplevalue = cpu.fielddescrof(SIMPLE, 'value')
+    simple_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
     usize = cpu.sizeof(U, True)
     onedescr = cpu.fielddescrof(U, 'one')
 
@@ -350,6 +356,7 @@
     register_known_gctype(cpu, node_vtable2, NODE2)
     register_known_gctype(cpu, node_vtable3, NODE3)
     register_known_gctype(cpu, u_vtable,     U)
+    register_known_gctype(cpu, simple_vtable,     SIMPLE)
     register_known_gctype(cpu, jit_virtual_ref_vtable,vrefinfo.JIT_VIRTUAL_REF)
     register_known_gctype(cpu, intobj_noimmut_vtable, INTOBJ_NOIMMUT)
     register_known_gctype(cpu, intobj_immut_vtable,   INTOBJ_IMMUT)
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -140,8 +140,8 @@
             start_label.getarglist()[:], operations[:-1],
             call_pure_results, True)
         jump_op = operations[-1]
-        if not inline_short_preamble:
-            cell_token = jump_op.getdescr()
+        cell_token = jump_op.getdescr()
+        if not inline_short_preamble or len(cell_token.target_tokens) == 1:
             assert cell_token.target_tokens[0].virtual_state is None
             jump_op = jump_op.copy_and_change(rop.JUMP,
                                         descr=cell_token.target_tokens[0])
@@ -172,7 +172,11 @@
             except VirtualStatesCantMatch:
                 continue
             short_preamble = target_token.short_preamble
-            extra = self.inline_short_preamble(args,
+            pass_to_short = target_virtual_state.make_inputargs(args,
+                self.optimizer, force_boxes=True, append_virtuals=True)
+            args = target_virtual_state.make_inputargs(args,
+                self.optimizer)
+            extra = self.inline_short_preamble(pass_to_short,
                 short_preamble[0].getarglist(), short_preamble[1:-1],
                 short_preamble[-1].getarglist(), self.optimizer.patchguardop)
             self.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -2,7 +2,8 @@
 from rpython.jit.metainterp.history import (ConstInt, Const,
         ConstPtr, ConstFloat)
 from rpython.jit.metainterp.optimizeopt import info
-from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
+from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded,\
+     ConstIntBound
 from rpython.jit.metainterp.resoperation import rop, ResOperation,\
      AbstractInputArg
 from rpython.rlib.debug import debug_start, debug_stop, debug_print
@@ -24,6 +25,8 @@
 def get_forwarded(box):
     if not isinstance(box, Const):
         return box.get_forwarded()
+    if box.type == 'i':
+        return ConstIntBound(box.getint())
     xxx
 
 class GenerateGuardState(object):
@@ -627,7 +630,8 @@
         return NotVirtualStateInfo(self.optimizer.cpu, box.type,
                                    self.optimizer.getinfo(box))
 
-    def visit_virtual(self, known_class, fielddescrs):
+    def visit_virtual(self, descr, fielddescrs):
+        known_class = ConstInt(descr.get_vtable())
         return VirtualStateInfo(known_class, fielddescrs)
 
     def visit_vstruct(self, typedescr, fielddescrs):
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
@@ -1118,7 +1118,7 @@
             return x
         res = self.meta_interp(f, [20], enable_opts='')
         assert res == f(20)
-        self.check_resops(call=0)
+        self.check_resops(call_i=0, call_r=0)
 
     def test_zerodivisionerror(self):
         # test the case of exception-raising operation that is not delegated
diff --git a/rpython/jit/metainterp/walkvirtual.py 
b/rpython/jit/metainterp/walkvirtual.py
--- a/rpython/jit/metainterp/walkvirtual.py
+++ b/rpython/jit/metainterp/walkvirtual.py
@@ -5,7 +5,7 @@
     def visit_not_virtual(self, value):
         raise NotImplementedError("abstract base class")
 
-    def visit_virtual(self, known_class, fielddescrs):
+    def visit_virtual(self, descr, fielddescrs):
         raise NotImplementedError("abstract base class")
 
     def visit_vstruct(self, typedescr, fielddescrs):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to