[pypy-commit] pypy dynamic-specialized-tuple: small bit of progress in making optimizeopt happy

alex_gaynor noreply at buildbot.pypy.org
Wed Mar 14 23:53:27 CET 2012


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: dynamic-specialized-tuple
Changeset: r53620:aa5fbb622e01
Date: 2012-03-14 15:53 -0700
http://bitbucket.org/pypy/pypy/changeset/aa5fbb622e01/

Log:	small bit of progress in making optimizeopt happy

diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5067,6 +5067,20 @@
         """
         self.optimize_strunicode_loop(ops, expected)
 
+    def test_gcstruct_as_array(self):
+        ops = """
+        [i0]
+        p0 = new_array(3, descr=gcstructarraydescr)
+        setfield_gc(p0, i0, descr=gcstructarray_fielddescr)
+        i1 = getfield_gc(p0, descr=gcstructarray_fielddescr)
+        finish(i1)
+        """
+        expected = """
+        [i0]
+        finish(i0)
+        """
+        self.optimize_loop(ops, expected)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -207,6 +207,13 @@
     complexrealdescr = cpu.interiorfielddescrof(complexarray, "real")
     compleximagdescr = cpu.interiorfielddescrof(complexarray, "imag")
 
+    gcstructarray = lltype.GcStruct("StructArray",
+        ("x", lltype.Signed),
+        ("y", lltype.Array(lltype.Signed)),
+    )
+    gcstructarraydescr = cpu.arraydescrof(gcstructarray)
+    gcstructarray_fielddescr = cpu.fielddescrof(gcstructarray, "x")
+
     for _name, _os in [
         ('strconcatdescr',               'OS_STR_CONCAT'),
         ('strslicedescr',                'OS_STR_SLICE'),
@@ -432,7 +439,7 @@
         preamble.inputargs = inputargs
         preamble.resume_at_jump_descr = FakeDescrWithSnapshot()
 
-        token = JitCellToken() 
+        token = JitCellToken()
         preamble.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(token))] + \
                               operations +  \
                               [ResOperation(rop.LABEL, jump_args, None, descr=token)]
@@ -445,7 +452,7 @@
         loop.operations = [preamble.operations[-1]] + \
                           [inliner.inline_op(op, clone=False) for op in cloned_operations] + \
                           [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jump_args],
-                                        None, descr=token)] 
+                                        None, descr=token)]
                           #[inliner.inline_op(jumpop)]
         assert loop.operations[-1].getopnum() == rop.JUMP
         assert loop.operations[0].getopnum() == rop.LABEL
@@ -464,7 +471,7 @@
             preamble.operations.insert(-1, op)
 
         return preamble
-        
+
 
 class FakeDescr(compile.ResumeGuardDescr):
     def clone_if_mutable(self):
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -242,6 +242,7 @@
         self.arraydescr = arraydescr
         self.constvalue = constvalue
         self._items = [self.constvalue] * size
+        self._fields = None
 
     def getlength(self):
         return len(self._items)
@@ -254,6 +255,15 @@
         assert isinstance(itemvalue, optimizer.OptValue)
         self._items[index] = itemvalue
 
+    def getfield(self, ofs, default):
+        return self._fields.get(ofs, default)
+
+    def setfield(self, ofs, fieldvalue):
+        assert isinstance(fieldvalue, optimizer.OptValue)
+        if self._fields is None:
+            self._fields = {}
+        self._fields[ofs] = fieldvalue
+
     def force_at_end_of_preamble(self, already_forced, optforce):
         if self in already_forced:
             return self


More information about the pypy-commit mailing list