Author: Armin Rigo <[email protected]>
Branch: guard-compatible
Changeset: r84529:0717682946eb
Date: 2016-05-20 17:28 +0200
http://bitbucket.org/pypy/pypy/changeset/0717682946eb/
Log: Finish llgraph support for guard_compatible, fix tests
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
@@ -1145,7 +1145,7 @@
info = info.next()
def fail_guard(self, descr, saved_data=None, extra_value=None,
- propagate_exception=False):
+ propagate_exception=False, force_bridge=None):
if not propagate_exception:
assert self.last_exception is None
values = []
@@ -1156,12 +1156,14 @@
value = None
values.append(value)
self._accumulate(descr, self.current_op.getfailargs(), values)
- if hasattr(descr, '_llgraph_bridge'):
+ if force_bridge is None:
+ force_bridge = getattr(descr, '_llgraph_bridge', None)
+ if force_bridge is not None:
if propagate_exception:
- assert (descr._llgraph_bridge.operations[0].opnum in
+ assert (force_bridge.operations[0].opnum in
(rop.SAVE_EXC_CLASS, rop.GUARD_EXCEPTION,
rop.GUARD_NO_EXCEPTION))
- target = (descr._llgraph_bridge, -1)
+ target = (force_bridge, -1)
values = [value for value in values if value is not None]
raise Jump(target, values)
else:
@@ -1288,22 +1290,25 @@
def execute_guard_compatible(self, descr, arg1, arg2):
if arg1 != arg2:
- if hasattr(descr, '_guard_compatible_llgraph_lst'):
+ assert not hasattr(descr, '_llgraph_bridge')
+ try:
lst = descr._guard_compatible_llgraph_lst
- for ref, target in lst:
- if ref == arg1:
- if target == -1:
- return
- XXX
+ except AttributeError:
+ lst = descr._guard_compatible_llgraph_lst = []
+ for ref, target in lst:
+ if ref == arg1:
+ break
else:
- descr._guard_compatible_llgraph_lst = []
- target = descr.find_compatible(self.cpu, arg1)
- if target:
+ target = descr.find_compatible(self.cpu, arg1)
+ if target == 0:
+ self.fail_guard(descr, extra_value=arg1)
+ assert 0, "fail_guard should raise"
descr._guard_compatible_llgraph_lst.append((arg1, target))
- if target == -1:
- return
- XXX
- self.fail_guard(descr, extra_value=arg1)
+ #
+ if target == -1:
+ return
+ else:
+ self.fail_guard(descr, force_bridge=target)
def execute_int_add_ovf(self, _, x, y):
try:
diff --git a/rpython/jit/backend/test/runner_test.py
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -23,7 +23,11 @@
from rpython.jit.backend.llsupport import jitframe
from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU
from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler
-
+from rpython.jit.metainterp.compile import GuardCompatibleDescr
+
+
+class BasicCompatDescr(BasicFailDescr, GuardCompatibleDescr):
+ pass
IS_32_BIT = sys.maxint < 2**32
IS_64_BIT = sys.maxint > 2**32
@@ -199,7 +203,7 @@
t1_box, T1_box, d1 = self.alloc_instance(self.T)
t2_box, T2_box, d2 = self.alloc_instance(self.T)
t3_box, T3_box, d3 = self.alloc_instance(self.T)
- faildescr1 = BasicFailDescr(1)
+ faildescr1 = BasicCompatDescr(1)
faildescr1.find_compatible = find_compatible
loop = parse("""
[p0]
@@ -240,7 +244,7 @@
t1_box, T1_box, d1 = self.alloc_instance(self.T)
t2_box, T2_box, d2 = self.alloc_instance(self.T)
t3_box, T3_box, d3 = self.alloc_instance(self.T)
- faildescr1 = BasicFailDescr(1)
+ faildescr1 = BasicCompatDescr(1)
faildescr1.find_compatible = find_compatible
loop = parse("""
[p0]
@@ -270,6 +274,7 @@
seen = []
def find_compatible(cpu, arg):
assert cpu is self.cpu
+ seen.append(arg)
if arg == t2_box._resref:
return asminfo43.asmaddr
if arg == t3_box._resref:
@@ -278,11 +283,11 @@
t1_box, T1_box, d1 = self.alloc_instance(self.T)
t2_box, T2_box, d2 = self.alloc_instance(self.T)
t3_box, T3_box, d3 = self.alloc_instance(self.T)
- faildescr1 = BasicFailDescr(1)
+ faildescr1 = BasicCompatDescr(1)
faildescr1.find_compatible = find_compatible
loop = parse("""
[p0]
- guard_compatible(p0, ConstPtr(t1), descr=faildescr1) []
+ guard_compatible(p0, ConstPtr(t1), descr=faildescr1) [p0]
finish(p0, descr=fdescr)
""", namespace={'fdescr': BasicFinalDescr(2),
'faildescr1': faildescr1,
@@ -291,14 +296,14 @@
self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
bridge43 = parse("""
- []
+ [p0]
finish(p0, descr=fdescr43)
""", namespace={'fdescr43': BasicFinalDescr(43)})
asminfo43 = self.cpu.compile_bridge(faildescr1, bridge43.inputargs,
bridge43.operations, looptoken)
bridge44 = parse("""
- []
+ [p0]
finish(p0, descr=fdescr44)
""", namespace={'fdescr44': BasicFinalDescr(44)})
asminfo44 = self.cpu.compile_bridge(faildescr1, bridge44.inputargs,
@@ -311,6 +316,7 @@
for t in t_list * 2:
# find_compatible() returns a bridge's address: switch goes there
deadframe = self.cpu.execute_token(looptoken, t)
+ assert self.cpu.get_ref_value(deadframe, 0) == t
fail = self.cpu.get_latest_descr(deadframe)
if t == t1_box._resref:
assert fail.identifier == 2
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit