Author: Spenser Andrew Bauman <[email protected]>
Branch: remove-getfield-pure
Changeset: r81734:90797881ada9
Date: 2016-01-12 17:16 -0500
http://bitbucket.org/pypy/pypy/changeset/90797881ada9/

Log:    Directly consult descr for getfield operations Only consider the
        opcode for is_always_pure on resoperations

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
@@ -515,13 +515,14 @@
         return pendingfields
 
     def optimize_GETFIELD_GC_I(self, op):
-        if op.is_always_pure() and self.get_constant_box(op.getarg(0)) is not 
None:
+        descr = op.getdescr()
+        if descr.is_always_pure() and self.get_constant_box(op.getarg(0)) is 
not None:
             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())
+        cf = self.field_cache(descr)
+        field = cf.getfield_from_cache(self, structinfo, descr)
         if field is not None:
             self.make_equal_to(op, field)
             return
@@ -529,7 +530,7 @@
         self.make_nonnull(op.getarg(0))
         self.emit_operation(op)
         # then remember the result of reading the field
-        structinfo.setfield(op.getdescr(), op.getarg(0), op, optheap=self, 
cf=cf)
+        structinfo.setfield(descr, op.getarg(0), op, optheap=self, cf=cf)
     optimize_GETFIELD_GC_R = optimize_GETFIELD_GC_I
     optimize_GETFIELD_GC_F = optimize_GETFIELD_GC_I
 
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
@@ -75,7 +75,7 @@
         dispatch_opt(self, op)
 
     def optimize_default(self, op):
-        canfold = op.is_always_pure() and not op.is_getfield()
+        canfold = op.is_always_pure()
         if op.is_ovf():
             self.postponed_op = op
             return
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -249,7 +249,7 @@
 def is_pure_getfield(opnum, descr):
     if opnum not in (rop.GETFIELD_GC_I, rop.GETFIELD_GC_F, rop.GETFIELD_GC_R):
         return False
-    return descr is not None and descr.is_always_pure() != False
+    return descr is not None and descr.is_always_pure()
 
 class AbstractResOp(AbstractResOpOrInputArg):
     """The central ResOperation class, representing one operation."""
@@ -417,6 +417,8 @@
         return rop._JIT_DEBUG_FIRST <= self.getopnum() <= rop._JIT_DEBUG_LAST
 
     def is_always_pure(self):
+        # Tells whether an operation is pure based solely on the opcode.
+        # Other operations (e.g. getfield ops) may be pure in some cases are 
well.
         return rop._ALWAYS_PURE_FIRST <= self.getopnum() <= 
rop._ALWAYS_PURE_LAST
 
     def has_no_side_effect(self):
@@ -567,11 +569,6 @@
 
     _descr = None
 
-    def is_always_pure(self):
-        if self.is_getfield():
-            return self._descr.is_always_pure() != False
-        return AbstractResOp.is_always_pure(self)
-
     def getdescr(self):
         return self._descr
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to