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