[pypy-commit] pypy guard-compatible: start emitting guards from infos, bit of a pain
cfbolz
pypy.commits at gmail.com
Thu Jun 23 11:14:28 EDT 2016
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: guard-compatible
Changeset: r85355:8729edc0c66a
Date: 2016-06-22 14:56 +0200
http://bitbucket.org/pypy/pypy/changeset/8729edc0c66a/
Log: start emitting guards from infos, bit of a pain
diff --git a/rpython/jit/metainterp/compatible.py b/rpython/jit/metainterp/compatible.py
--- a/rpython/jit/metainterp/compatible.py
+++ b/rpython/jit/metainterp/compatible.py
@@ -24,6 +24,7 @@
return None
raise AssertionError("bad rettype")
+
class CompatibilityCondition(object):
""" A collections of conditions that an object needs to fulfil. """
def __init__(self, ptr):
@@ -105,10 +106,17 @@
return copied_op, QuasiimmutGetfieldAndPureCallCondition(
op, qmutdescr, optimizer)
+ def emit_conditions(self, op, short, optimizer):
+ """ re-emit the conditions about variable op into the short preamble
+ """
+ for cond in self.conditions:
+ cond.emit_condition(op, short, optimizer)
+
def repr_of_conditions(self, argrepr="?"):
return "\n".join([cond.repr(argrepr) for cond in self.conditions])
+
class Condition(object):
def __init__(self, optimizer):
self.metainterp_sd = optimizer.metainterp_sd
@@ -138,6 +146,9 @@
def repr(self):
return ""
+ def emit_condition(self, op, short, optimizer):
+ raise NotImplementedError("abstract base class")
+
def _repr_const(self, arg):
from rpython.jit.metainterp.history import ConstInt, ConstFloat, ConstPtr
from rpython.rtyper.annlowlevel import llstr, hlstr
@@ -211,6 +222,30 @@
return False
return True
+ def emit_condition(self, op, short, optimizer):
+ from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID
+ from rpython.jit.metainterp.resoperation import rop, ResOperation
+ # woah, mess
+ args = self.args[:]
+ args[1] = op
+ descr = self.descr
+ rettype = descr.get_result_type()
+ if rettype == INT:
+ call_op = ResOperation(rop.CALL_PURE_I, args, descr)
+ elif rettype == FLOAT:
+ call_op = ResOperation(rop.CALL_PURE_F, args, descr)
+ elif rettype == REF:
+ call_op = ResOperation(rop.CALL_PURE_R, args, descr)
+ else:
+ assert rettype == VOID
+ # XXX maybe we should forbid this
+ call_op = ResOperation(rop.CALL_PURE_R, args, descr)
+ short.append(call_op)
+ return
+ short.append(call_op)
+ short.append(ResOperation(rop.GUARD_VALUE, [call_op, self.res]))
+
+
def repr(self, argrepr="?"):
addr = self.args[0].getaddr()
funcname = self.metainterp_sd.get_name_from_address(addr)
diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -78,7 +78,13 @@
pass
def make_guards(self, op, short, optimizer):
- pass
+ compat_cond = self._compatibility_conditions
+ if compat_cond is None:
+ return
+ short.append(
+ ResOperation(rop.GUARD_COMPATIBLE, [
+ op, compat_cond.known_valid]))
+ compat_cond.emit_conditions(op, short, optimizer)
@specialize.arg(2)
def get_constant_string_spec(self, string_optimizer, mode):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -26,6 +26,8 @@
def __init__(self, cpu):
self.cpu = cpu
self.optearlyforce = None
+ self.metainterp_sd = None
+ self._last_debug_merge_point = None
class BaseTestGenerateGuards(BaseTest):
def setup_class(self):
@@ -465,6 +467,45 @@
"""
self.compare(guards, expected, [box])
+ def test_guard_compatible(self):
+ from rpython.jit.metainterp.compatible import CompatibilityCondition
+ value1 = info.PtrInfo()
+ ptr = "fakeptr"
+ value1._compatibility_conditions = CompatibilityCondition(
+ ConstPtr(self.myptr))
+ box = InputArgRef()
+ guards = []
+ value1.make_guards(box, guards, FakeOptimizer(self.cpu))
+ expected = """
+ [p0]
+ guard_compatible(p0, ConstPtr(myptr)) []
+ """
+ self.compare(guards, expected, [box])
+
+ def test_guard_compatible_with_conditions(self):
+ from rpython.jit.metainterp.compatible import CompatibilityCondition
+ optimizer = FakeOptimizer(self.cpu)
+ value1 = info.PtrInfo()
+ ptr = "fakeptr"
+ ccond = value1._compatibility_conditions = CompatibilityCondition(
+ ConstPtr(self.myptr))
+ op = ResOperation(
+ rop.CALL_PURE_I, [ConstInt(123), ConstPtr(self.myptr)],
+ descr=self.plaincalldescr)
+ copied_op, cond = ccond.prepare_const_arg_call(
+ op, optimizer)
+ ccond.record_condition(cond, ConstInt(5), optimizer)
+ box = InputArgRef()
+ guards = []
+ value1.make_guards(box, guards, FakeOptimizer(self.cpu))
+ expected = """
+ [p0]
+ guard_compatible(p0, ConstPtr(myptr)) []
+ i1 = call_pure_i(123, p0, descr=plaincalldescr)
+ guard_value(i1, 5) []
+ """
+ self.compare(guards, expected, [box])
+
def test_equal_inputargs(self):
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.nodeaddr))
value = info.InstancePtrInfo(None, classbox)
More information about the pypy-commit
mailing list