[pypy-commit] pypy result-in-resops: fix the pure ops and some cleanups
fijal
noreply at buildbot.pypy.org
Tue Sep 25 23:39:52 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57588:a8e4c82af18c
Date: 2012-09-25 23:39 +0200
http://bitbucket.org/pypy/pypy/changeset/a8e4c82af18c/
Log: fix the pure ops and some cleanups
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -141,6 +141,7 @@
# b.has_lower
if b.has_lower and b.has_upper:
# Synthesize the reverse op for optimize_default to reuse
+ xxx
self.pure(rop.INT_RSHIFT, [op, op.getarg(1)], op.getarg(0))
def optimize_INT_RSHIFT(self, op):
@@ -170,14 +171,16 @@
# Else, synthesize the non overflowing op for optimize_default to
# reuse, as well as the reverse op
elif opnum == rop.INT_ADD_OVF:
- self.pure(rop.INT_ADD, result.getint(), args[0], args[1])
- self.pure(rop.INT_SUB, args[0].getint(), result, args[1])
- self.pure(rop.INT_SUB, args[1].getint(), result, args[0])
+ self.pure(result, rop.INT_ADD, args[0], args[1])
+ self.pure(args[0], rop.INT_SUB, result, args[1])
+ self.pure(args[1], rop.INT_SUB, result, args[0])
elif opnum == rop.INT_SUB_OVF:
+ xxxx
self.pure(rop.INT_SUB, args[:], result)
self.pure(rop.INT_ADD, [result, args[1]], args[0])
self.pure(rop.INT_SUB, [args[0], result], args[1])
elif opnum == rop.INT_MUL_OVF:
+ xxxx
self.pure(rop.INT_MUL, args[:], result)
self.emit_operation(op)
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -320,9 +320,9 @@
return self.optimizer.new_const_item(arraydescr)
@specialize.arg(1)
- def pure(self, opnum, result, arg0, arg1):
+ def pure(self, oldop, opnum, arg0, arg1=None):
if self.optimizer.optpure:
- self.optimizer.optpure.pure(opnum, result, arg0, arg1)
+ self.optimizer.optpure.pure(oldop, opnum, arg0, arg1)
def has_pure_result(self, op_key):
if self.optimizer.optpure:
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -1,12 +1,14 @@
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED
-from pypy.jit.metainterp.resoperation import rop, create_resop_2, create_resop_1
+from pypy.jit.metainterp.resoperation import rop, create_resop_2,\
+ create_resop_1, example_for_opnum
from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method,\
- ArgsSet
+ ArgsDict
+from pypy.rlib.objectmodel import specialize
class OptPure(Optimization):
def __init__(self):
self.posponedop = None
- self.pure_operations = ArgsSet()
+ self.pure_operations = ArgsDict()
self.emitted_pure_operations = []
def propagate_forward(self, op):
@@ -40,11 +42,10 @@
# did we do the exact same operation already?
oldop = self.pure_operations.get(op)
if oldop is not None:
- assert oldop.getopnum() == op.getopnum()
self.replace(op, oldop)
return
else:
- self.pure_operations.add(op)
+ self.pure_operations.set(op, op)
self.remember_emitting_pure(op)
# otherwise, the operation remains
@@ -65,7 +66,7 @@
self.last_emitted_operation = REMOVED
return
else:
- self.pure_operations.add(op)
+ self.pure_operations.set(op, op)
self.remember_emitting_pure(op)
# replace CALL_PURE with just CALL
@@ -93,12 +94,14 @@
def setup(self):
self.optimizer.optpure = self
- def pure(self, opnum, result, arg0, arg1=None):
+ @specialize.arg(2)
+ def pure(self, oldop, opnum, arg0, arg1=None):
+ result = example_for_opnum(opnum)
if arg1 is None:
op = create_resop_1(opnum, result, arg0)
else:
op = create_resop_2(opnum, result, arg0, arg1)
- self.pure_operations.add(op)
+ self.pure_operations.set(op, oldop)
def has_pure_result(self, op_key):
op = self.pure_operations.get(op_key)
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -93,8 +93,8 @@
else:
self.emit_operation(op)
# Synthesize the reverse ops for optimize_default to reuse
- self.pure(rop.INT_ADD, op.getarg(0).getint(), op, op.getarg(1))
- self.pure(rop.INT_SUB, op.getarg(1).getint(), op.getarg(0), op)
+ self.pure(op.getarg(0), rop.INT_ADD, op, op.getarg(1))
+ self.pure(op.getarg(1), rop.INT_SUB, op.getarg(0), op)
def optimize_INT_ADD(self, op):
arg1 = op.getarg(0)
@@ -110,8 +110,8 @@
else:
self.emit_operation(op)
# Synthesize the reverse op for optimize_default to reuse
- self.pure(rop.INT_SUB, op.getarg(0).getint(), op, op.getarg(1))
- self.pure(rop.INT_SUB, op.getarg(1).getint(), op, op.getarg(0))
+ self.pure(op.getarg(0), rop.INT_SUB, op, op.getarg(1))
+ self.pure(op.getarg(1), rop.INT_SUB, op, op.getarg(0))
def optimize_INT_MUL(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -172,24 +172,22 @@
# work in all cases, including NaN and inf
for lhs, rhs in [(arg1, arg2), (arg2, arg1)]:
v1 = self.getvalue(lhs)
- v2 = self.getvalue(rhs)
if v1.is_constant():
if v1.op.getfloat() == 1.0:
- self.make_equal_to(op, v2)
+ self.replace(op, rhs)
return
elif v1.op.getfloat() == -1.0:
- self.emit_operation(ResOperation(
- rop.FLOAT_NEG, [rhs], op
- ))
+ new_op = create_resop_1(rop.FLOAT_NEG, 0.0, rhs)
+ self.replace(op, new_op)
+ self.emit_operation(new_op)
return
self.emit_operation(op)
- self.pure(rop.FLOAT_MUL, op.getfloat(), arg2, arg1)
+ self.pure(op, rop.FLOAT_MUL, arg2, arg1)
def optimize_FLOAT_NEG(self, op):
- v1 = op.getarg(0)
self.emit_operation(op)
- self.pure(rop.FLOAT_NEG, [op], v1)
+ self.pure(op.getarg(0), rop.FLOAT_NEG, op)
def optimize_guard(self, op, constbox, emit_operation=True):
value = self.getvalue(op.getarg(0))
@@ -508,10 +506,12 @@
self.emit_operation(op)
def optimize_CAST_PTR_TO_INT(self, op):
+ xxx
self.pure(rop.CAST_INT_TO_PTR, [op], op.getarg(0))
self.emit_operation(op)
def optimize_CAST_INT_TO_PTR(self, op):
+ xxx
self.pure(rop.CAST_PTR_TO_INT, [op], op.getarg(0))
self.emit_operation(op)
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -2307,13 +2307,13 @@
ops = """
[f0]
f1 = float_mul(1.0, f0)
- f2 = escape(f1)
- jump(f2)
+ escape(f1)
+ jump(f1)
"""
expected = """
[f0]
- f2 = escape(f0)
- jump(f2)
+ escape(f0)
+ jump(f0)
"""
self.optimize_loop(ops, expected)
@@ -2321,28 +2321,28 @@
ops = """
[f0]
f1 = float_mul(f0, -1.0)
- f2 = escape(f1)
- jump(f2)
+ escape(f1)
+ jump(f1)
"""
expected = """
[f0]
f1 = float_neg(f0)
- f2 = escape(f1)
- jump(f2)
+ escape(f1)
+ jump(f1)
"""
self.optimize_loop(ops, expected)
ops = """
[f0]
f1 = float_mul(-1.0, f0)
- f2 = escape(f1)
- jump(f2)
+ escape(f1)
+ jump(f1)
"""
expected = """
[f0]
f1 = float_neg(f0)
- f2 = escape(f1)
- jump(f2)
+ escape(f1)
+ jump(f1)
"""
self.optimize_loop(ops, expected)
diff --git a/pypy/jit/metainterp/optimizeopt/util.py b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -128,6 +128,9 @@
if has_value:
a.values = self.values[:]
return a
+
+ def __repr__(self):
+ return 'ArgsSet(%s)' % ([item for item in self.buckets if item is not None],)
return ArgsSet
ArgsSet = new_args_set()
ArgsDict = new_args_set(True)
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -1673,6 +1673,15 @@
rop.PTR_NE: rop.PTR_NE,
}
+ at specialize.memo()
+def example_for_opnum(opnum):
+ if opclasses[opnum].type == INT:
+ return 0
+ elif opclasses[opnum].type == FLOAT:
+ return 0.0
+ else:
+ return lltype.nullptr(llmemory.GCREF.TO)
+
opboolinvers = [-1] * len(opclasses)
opboolreflex = [-1] * len(opclasses)
for k, v in _opboolreflex.iteritems():
More information about the pypy-commit
mailing list