[pypy-commit] pypy remove-getfield-pure: Ignore getfield operations in pure pass

sbauman noreply at buildbot.pypy.org
Thu Oct 29 12:11:59 EDT 2015


Author: Spenser Bauman <sabauma at gmail.com>
Branch: remove-getfield-pure
Changeset: r80484:64ea6827371e
Date: 2015-10-28 21:06 -0400
http://bitbucket.org/pypy/pypy/changeset/64ea6827371e/

Log:	Ignore getfield operations in pure pass

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -493,6 +493,10 @@
         return pendingfields
 
     def optimize_GETFIELD_GC_I(self, op):
+        if op.is_always_pure() and self.get_constant_box(op.getarg(0)):
+            resbox = self.optimizer.constant_fold(op)
+            self.optimizer.make_constant(op, resbox)
+            return
         structinfo = self.ensure_ptr_info_arg0(op)
         cf = self.field_cache(op.getdescr())
         field = cf.getfield_from_cache(self, structinfo, op.getdescr())
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -74,7 +74,7 @@
         dispatch_opt(self, op)
 
     def optimize_default(self, op):
-        canfold = op.is_always_pure()
+        canfold = op.is_always_pure() and not op.is_getfield()
         if op.is_ovf():
             self.postponed_op = op
             return
@@ -220,7 +220,7 @@
     def produce_potential_short_preamble_ops(self, sb):
         ops = self.optimizer._newoperations
         for i, op in enumerate(ops):
-            if op.is_always_pure():
+            if op.is_always_pure() and not op.is_getfield():
                 sb.add_pure_op(op)
             if op.is_ovf() and ops[i + 1].getopnum() == rop.GUARD_NO_OVERFLOW:
                 sb.add_pure_op(op)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -8778,7 +8778,7 @@
     def test_virtual_back_and_forth(self):
         ops = """
         [p0]
-        p1 = getfield_gc_r(p0, descr=valuedescr3)
+        p1 = getfield_gc_r(p0, descr=nextdescr3)
         ptemp = new_with_vtable(descr=nodesize)
         setfield_gc(ptemp, p1, descr=nextdescr)
         p2 = getfield_gc_r(ptemp, descr=nextdescr)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -227,7 +227,7 @@
         jump(p0)
         """
         es, loop, preamble = self.optimize(loop)
-        assert len(es.short_boxes) == 7
+        assert len(es.short_boxes) == 4
         # both getfields are available as
         # well as getfield_gc
         


More information about the pypy-commit mailing list