[pypy-commit] pypy default: Assuming quite a few ops are pure, remove the need to store a crazy dict
fijal
noreply at buildbot.pypy.org
Mon Jan 12 14:28:29 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r75304:99d27b9b9c8a
Date: 2015-01-12 15:28 +0200
http://bitbucket.org/pypy/pypy/changeset/99d27b9b9c8a/
Log: Assuming quite a few ops are pure, remove the need to store a crazy
dict of "emitted_pure_operations"
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
@@ -7,7 +7,7 @@
def __init__(self):
self.postponed_op = None
self.pure_operations = args_dict()
- self.emitted_pure_operations = {}
+ self.call_pure_positions = []
def propagate_forward(self, op):
dispatch_opt(self, op)
@@ -26,7 +26,6 @@
nextop = None
args = None
- remember = None
if canfold:
for i in range(op.numargs()):
if self.get_constant_box(op.getarg(i)) is None:
@@ -45,8 +44,6 @@
if oldvalue is not None:
self.optimizer.make_equal_to(op.result, oldvalue, True)
return
- else:
- remember = op
# otherwise, the operation remains
self.emit_operation(op)
@@ -56,8 +53,6 @@
self.emit_operation(nextop)
if args is not None:
self.pure_operations[args] = self.getvalue(op.result)
- if remember:
- self.remember_emitting_pure(remember)
def optimize_CALL_PURE(self, op):
# Step 1: check if all arguments are constant
@@ -85,7 +80,7 @@
args = op.getarglist()
self.emit_operation(ResOperation(rop.CALL, args, op.result,
op.getdescr()))
- self.remember_emitting_pure(op)
+ self.call_pure_positions.append(len(self.optimizer._newoperations) - 1)
def optimize_GUARD_NO_EXCEPTION(self, op):
if self.last_emitted_operation is REMOVED:
@@ -114,13 +109,17 @@
def get_pure_result(self, key):
return self.pure_operations.get(key, None)
- def remember_emitting_pure(self, op):
- if self.optimizer.exporting_state:
- op = self.optimizer.get_op_replacement(op)
- self.emitted_pure_operations[op] = True
-
def produce_potential_short_preamble_ops(self, sb):
- for op in self.emitted_pure_operations:
+ ops = sb.optimizer._newoperations
+ for i, op in enumerate(ops):
+ if op.is_always_pure():
+ sb.add_potential(op)
+ if op.is_ovf() and ops[i + 1].getopnum() == rop.GUARD_NO_OVERFLOW:
+ sb.add_potential(op)
+ for i in self.call_pure_positions:
+ op = ops[i]
+ assert op.getopnum() == rop.CALL
+ op = op.copy_and_change(rop.CALL_PURE)
sb.add_potential(op)
dispatch_opt = make_dispatcher_method(OptPure, 'optimize_',
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5527,6 +5527,5 @@
"""
self.optimize_loop(ops, ops)
-
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
More information about the pypy-commit
mailing list