[pypy-commit] pypy jit-duplicated_short_boxes: ensure values are imported when accessed from optimizer.values

hakanardo noreply at buildbot.pypy.org
Tue Aug 30 09:48:46 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-duplicated_short_boxes
Changeset: r46916:d8a4678476e8
Date: 2011-08-30 09:23 +0200
http://bitbucket.org/pypy/pypy/changeset/d8a4678476e8/

Log:	ensure values are imported when accessed from optimizer.values

diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -40,7 +40,7 @@
 
         # Hack to ensure constants are imported from the preamble
         if cached_fieldvalue and fieldvalue.is_constant(): 
-            optheap.getvalue(cached_fieldvalue.get_key_box())
+            optheap.optimizer.ensure_imported(cached_fieldvalue)
             cached_fieldvalue = self._cached_fields.get(structvalue, None)
 
         if cached_fieldvalue is not fieldvalue:
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -415,17 +415,21 @@
             value = self.values[box]
         except KeyError:
             value = self.values[box] = OptValue(box)
+        self.ensure_imported(value)
+        return value
+
+    def ensure_imported(self, value):
         if not self.emitting_dissabled and value in self.importable_values:
             imp = self.importable_values[value]
             del self.importable_values[value]
-            imp.import_value(box, value)
-        return value
+            imp.import_value(value)
 
     def get_constant_box(self, box):
         if isinstance(box, Const):
             return box
         try:
             value = self.values[box]
+            self.ensure_imported(value)
         except KeyError:
             return None
         if value.is_constant():
@@ -561,7 +565,7 @@
         for i in range(n):
             arg = op.getarg(i)
             try:
-                value = self.values[arg]
+                value = self.getvalue(arg)
             except KeyError:
                 pass
             else:
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -7111,7 +7111,21 @@
         """
         self.optimize_loop(ops, expected)
 
-        
+    def test_import_constants_when_folding_pure_operations(self):
+        ops = """
+        [p0]
+        f1 = getfield_gc(p0, descr=valuedescr)
+        f2 = float_abs(f1)
+        call(7.0, descr=nonwritedescr)
+        setfield_gc(p0, -7.0, descr=valuedescr)
+        jump(p0)
+        """
+        expected = """
+        [p0]
+        call(7.0, descr=nonwritedescr)
+        jump(p0)
+        """
+        self.optimize_loop(ops, expected)
 
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
     pass
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -425,7 +425,7 @@
         inputargs.append(box)
         box = newresult
         if box in self.optimizer.values:
-            box = self.optimizer.values[box].force_box()
+            box = self.optimizer.getvalue(box).force_box()
         jumpargs.append(box)
         
 
@@ -531,7 +531,7 @@
         self.preamble_value = value
         self.op = op
 
-    def import_value(self, box, value):
+    def import_value(self, value):
         value.import_from(self.preamble_value, self.unroll.optimizer)
         self.unroll.add_op_to_short(self.op, self.unroll.short, self.unroll.short_seen, False, True)        
         


More information about the pypy-commit mailing list