[pypy-commit] pypy rewrite-unrolling: progress
fijal
noreply at buildbot.pypy.org
Tue Jan 13 10:16:54 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: rewrite-unrolling
Changeset: r75314:278be974c29d
Date: 2015-01-13 11:16 +0200
http://bitbucket.org/pypy/pypy/changeset/278be974c29d/
Log: progress
diff --git a/rpython/jit/metainterp/optimizeopt/earlyforce.py b/rpython/jit/metainterp/optimizeopt/earlyforce.py
--- a/rpython/jit/metainterp/optimizeopt/earlyforce.py
+++ b/rpython/jit/metainterp/optimizeopt/earlyforce.py
@@ -25,7 +25,8 @@
for arg in op.getarglist():
if arg in self.optimizer.values:
value = self.getvalue(arg)
- value.force_box(self)
+ if value.is_virtual():
+ value.force_box(self)
self.emit_operation(op)
def setup(self):
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -861,6 +861,27 @@
label1_args.append(box)
label2_args.append(box)
+ def pure_reverse(self, op):
+ if self.optpure is None:
+ return
+ optpure = self.optpure
+ if op.getopnum() == rop.INT_ADD:
+ optpure.pure(rop.INT_ADD, [op.getarg(1), op.getarg(0)], op.result)
+ # Synthesize the reverse op for optimize_default to reuse
+ optpure.pure(rop.INT_SUB, [op.result, op.getarg(1)], op.getarg(0))
+ optpure.pure(rop.INT_SUB, [op.result, op.getarg(0)], op.getarg(1))
+ elif op.getopnum() == rop.INT_SUB:
+ optpure.pure(rop.INT_ADD, [op.result, op.getarg(1)], op.getarg(0))
+ optpure.pure(rop.INT_SUB, [op.getarg(0), op.result], op.getarg(1))
+ elif op.getopnum() == rop.FLOAT_MUL:
+ optpure.pure(rop.FLOAT_MUL, [op.getarg(1), op.getarg(0)], op.result)
+ elif op.getopnum() == rop.FLOAT_NEG:
+ optpure.pure(rop.FLOAT_NEG, [op.result], op.getarg(0))
+ elif op.getopnum() == rop.CAST_INT_TO_PTR:
+ optpure.pure(rop.CAST_PTR_TO_INT, [op.result], op.getarg(0))
+ elif op.getopnum() == rop.CAST_PTR_TO_INT:
+ optpure.pure(rop.CAST_INT_TO_PTR, [op.result], op.getarg(0))
+
#def optimize_GUARD_NO_OVERFLOW(self, op):
# # otherwise the default optimizer will clear fields, which is unwanted
# # in this case
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -117,9 +117,7 @@
self.make_constant_int(op.result, 0)
else:
self.emit_operation(op)
- # Synthesize the reverse ops for optimize_default to reuse
- self.pure(rop.INT_ADD, [op.result, op.getarg(1)], op.getarg(0))
- self.pure(rop.INT_SUB, [op.getarg(0), op.result], op.getarg(1))
+ self.optimizer.pure_reverse(op)
def optimize_INT_ADD(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -132,10 +130,7 @@
self.make_equal_to(op.result, v1)
else:
self.emit_operation(op)
- self.pure(rop.INT_ADD, [op.getarg(1), op.getarg(0)], op.result)
- # Synthesize the reverse op for optimize_default to reuse
- self.pure(rop.INT_SUB, [op.result, op.getarg(1)], op.getarg(0))
- self.pure(rop.INT_SUB, [op.result, op.getarg(0)], op.getarg(1))
+ self.optimizer.pure_reverse(op)
def optimize_INT_MUL(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -222,7 +217,7 @@
))
return
self.emit_operation(op)
- self.pure(rop.FLOAT_MUL, [arg2, arg1], op.result)
+ self.optimizer.pure_reverse(op)
def optimize_FLOAT_TRUEDIV(self, op):
arg1 = op.getarg(0)
@@ -244,9 +239,8 @@
self.emit_operation(op)
def optimize_FLOAT_NEG(self, op):
- v1 = op.getarg(0)
self.emit_operation(op)
- self.pure(rop.FLOAT_NEG, [op.result], v1)
+ self.optimizer.pure_reverse(op)
def optimize_guard(self, op, constbox, emit_operation=True):
value = self.getvalue(op.getarg(0))
@@ -583,11 +577,11 @@
self.emit_operation(op)
def optimize_CAST_PTR_TO_INT(self, op):
- self.pure(rop.CAST_INT_TO_PTR, [op.result], op.getarg(0))
+ self.optimizer.pure_reverse(op)
self.emit_operation(op)
def optimize_CAST_INT_TO_PTR(self, op):
- self.pure(rop.CAST_PTR_TO_INT, [op.result], op.getarg(0))
+ self.optimizer.pure_reverse(op)
self.emit_operation(op)
def optimize_SAME_AS(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -20,12 +20,18 @@
self.unroller = unroller
self.keybox = keybox
+ def is_virtual(self):
+ return False
+
def force_box(self, optforce):
if self.box is None:
self.box = self.keybox
optforce.optimizer.reuse_pure_result(self.box)
return self.box
+ def get_key_box(self):
+ return self.keybox
+
class Unroller(object):
optimizer = None
@@ -50,7 +56,7 @@
pure_value = OptPureValue(self, op.result)
new_optpure.pure(op.getopnum(), op.getarglist(),
op.result, pure_value)
-
+ self.optimizer.pure_reverse(op)
# for opargs, value in old_optpure.pure_operations.items():
# if not value.is_virtual():
# pure_value = OptPureValue(self, value.box)
More information about the pypy-commit
mailing list