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