[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