Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: guard-compatible
Changeset: r85356:3c07b3cda170
Date: 2016-06-22 15:41 +0200
http://bitbucket.org/pypy/pypy/changeset/3c07b3cda170/

Log:    produce guards for QuasiimmutGetfieldAndPureCallCondition

        (more mess)

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
@@ -270,6 +270,8 @@
     def __init__(self, op, qmutdescr, optimizer):
         PureCallCondition.__init__(self, op, optimizer)
         self.args[2] = None
+        # XXX not 100% sure whether it's save to store the whole descr
+        self.qmutdescr = qmutdescr
         self.qmut = qmutdescr.qmut
         self.mutatefielddescr = qmutdescr.mutatefielddescr
         self.fielddescr = qmutdescr.fielddescr
@@ -330,6 +332,33 @@
                 return False
         return True
 
+    def emit_condition(self, op, short, optimizer):
+        from rpython.jit.metainterp.resoperation import rop, ResOperation
+        # more mess
+        fielddescr = self.fielddescr
+        if fielddescr.is_pointer_field():
+            getfield_op = ResOperation(
+                rop.GETFIELD_GC_R, [op], fielddescr)
+        elif fielddescr.is_float_field():
+            getfield_op = ResOperation(
+                rop.GETFIELD_GC_F, [op], fielddescr)
+        else:
+            getfield_op = ResOperation(
+                rop.GETFIELD_GC_I, [op], fielddescr)
+        short.extend([
+            ResOperation(
+                rop.QUASIIMMUT_FIELD, [op], self.qmutdescr),
+            ResOperation(
+                rop.GUARD_NOT_INVALIDATED, []),
+            getfield_op])
+        index = len(short)
+        PureCallCondition.emit_condition(self, op, short, optimizer)
+        call_op = short[index]
+        assert call_op.opnum in (
+                rop.CALL_PURE_I, rop.CALL_PURE_R,
+                rop.CALL_PURE_F, rop.CALL_PURE_N)
+        call_op.setarg(2, getfield_op)
+
     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/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
@@ -28,6 +28,7 @@
         self.optearlyforce = None
         self.metainterp_sd = None
         self._last_debug_merge_point = None
+        self.quasi_immutable_deps = None
 
 class BaseTestGenerateGuards(BaseTest):
     def setup_class(self):
@@ -488,21 +489,43 @@
         value1 = info.PtrInfo()
         ptr = "fakeptr"
         ccond = value1._compatibility_conditions = CompatibilityCondition(
-                ConstPtr(self.myptr))
+                ConstPtr(self.quasiptr))
+
+        # regular call
         op = ResOperation(
-                rop.CALL_PURE_I, [ConstInt(123), ConstPtr(self.myptr)],
+                rop.CALL_PURE_I, [ConstInt(123), ConstPtr(self.quasiptr)],
                 descr=self.plaincalldescr)
         copied_op, cond = ccond.prepare_const_arg_call(
                 op, optimizer)
         ccond.record_condition(cond, ConstInt(5), optimizer)
+
+        # call with quasi-immut
+        box = InputArgRef()
+        ccond.register_quasi_immut_field(
+            ResOperation(rop.QUASIIMMUT_FIELD, [box], self.quasiimmutdescr))
+        getfield_op = ResOperation(
+                rop.GETFIELD_GC_I, [box], self.quasifielddescr)
+        op = ResOperation(
+                rop.CALL_PURE_I,
+                [ConstInt(123), ConstPtr(self.quasiptr), getfield_op],
+                descr=self.nonwritedescr)
+        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)) []
+        guard_compatible(p0, ConstPtr(quasiptr)) []
         i1 = call_pure_i(123, p0, descr=plaincalldescr)
         guard_value(i1, 5) []
+        quasiimmut_field(p0, descr=quasiimmutdescr)
+        guard_not_invalidated() []
+        i0 = getfield_gc_i(p0, descr=quasifielddescr)
+        i2 = call_pure_i(123, p0, i0, descr=nonwritedescr)
+        guard_value(i2, 5) []
         """
         self.compare(guards, expected, [box])
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to