[pypy-commit] pypy optresult: push push push, until we get back to optpure
fijal
noreply at buildbot.pypy.org
Tue Nov 18 07:43:22 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74569:3c538c4e3d52
Date: 2014-11-17 17:10 +0200
http://bitbucket.org/pypy/pypy/changeset/3c538c4e3d52/
Log: push push push, until we get back to optpure
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -237,14 +237,13 @@
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
resbound = v1.intbound.add_bound(v2.intbound)
- r = self.getvalue(op)
if resbound.bounded():
# Transform into INT_ADD. The following guard will be killed
# by optimize_GUARD_NO_OVERFLOW; if we see instead an
# optimize_GUARD_OVERFLOW, then InvalidLoop.
- op = op.copy_and_change(rop.INT_ADD)
+ op = self.optimizer.replace_op_with(op, rop.INT_ADD)
self.emit_operation(op) # emit the op
- r.box = op
+ r = self.getvalue(op)
r.intbound.intersect(resbound)
def optimize_INT_SUB_OVF(self, op):
@@ -255,8 +254,7 @@
return
resbound = v1.intbound.sub_bound(v2.intbound)
if resbound.bounded():
- xxxx
- op = op.copy_and_change(rop.INT_SUB)
+ op = self.optimizer.replace_op_with(op, rop.INT_SUB)
self.emit_operation(op) # emit the op
r = self.getvalue(op)
r.intbound.intersect(resbound)
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
@@ -1,6 +1,6 @@
from rpython.jit.metainterp import jitprof, resume, compile
from rpython.jit.metainterp.executor import execute_nonspec_const
-from rpython.jit.metainterp.history import BoxInt, BoxFloat, Const, ConstInt, REF
+from rpython.jit.metainterp.history import Const, ConstInt, REF
from rpython.jit.metainterp.optimizeopt.intutils import IntBound, IntUnbounded, \
ImmutableIntUnbounded, \
IntLowerBound, MININT, MAXINT
@@ -55,7 +55,7 @@
if intbound:
self.intbound = intbound
else:
- if isinstance(box, BoxInt):
+ if box is not None and box.type == 'i':
self.intbound = IntBound(MININT, MAXINT)
else:
self.intbound = IntUnbounded()
@@ -64,6 +64,15 @@
self.make_constant(box)
# invariant: box is a Const if and only if level == LEVEL_CONSTANT
+ def copy_attributes_from(self, other):
+ assert other.__class__ is OptValue
+ self.level = other.level
+ self.known_class = other.known_class
+ self.intbound = other.intbound
+ self.lenbound = other.lenbound
+ self.box = other.box
+ self.last_guard = other.last_guard
+
def make_len_gt(self, mode, descr, val):
if self.lenbound:
assert self.lenbound.mode == mode
@@ -503,21 +512,37 @@
def clear_newoperations(self):
self._newoperations = []
- def make_equal_to(self, box, value, replace=False):
- assert isinstance(value, OptValue)
- assert replace or box not in self.values
- self.values[box] = value
+ def make_equal_to(self, box, newvalue):
+ if box in self.values:
+ v = self.getvalue(box)
+ v.copy_attributes_from(newvalue)
+ else:
+ self.values[box] = newvalue
+
+ def replace_op_with(self, oldop, newopnum, args=None):
+ newop = oldop._copy_and_change(newopnum, args=args)
+ v = self.getvalue(oldop)
+ v.box = newop
+ self.values[newop] = v
+ return newop
def make_constant(self, box, constbox):
- self.make_equal_to(box, ConstantValue(constbox))
+ try:
+ value = self.values[box]
+ value.level = LEVEL_CONSTANT
+ value.make_constant(constbox)
+ except KeyError:
+ self.values[box] = ConstantValue(constbox)
def make_constant_int(self, box, intvalue):
self.make_constant(box, ConstInt(intvalue))
def new_ptr_box(self):
+ xxx
return self.cpu.ts.BoxRef()
def new_box(self, fieldofs):
+ xxx
if fieldofs.is_pointer_field():
return self.new_ptr_box()
elif fieldofs.is_float_field():
@@ -534,6 +559,7 @@
return CVAL_ZERO
def new_box_item(self, arraydescr):
+ xxx
if arraydescr.is_array_of_pointers():
return self.new_ptr_box()
elif arraydescr.is_array_of_floats():
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
@@ -43,7 +43,7 @@
oldop = self.pure_operations.get(args, None)
if oldop is not None and oldop.getdescr() is op.getdescr():
assert oldop.getopnum() == op.getopnum()
- self.optimizer.make_equal_to(op, self.getvalue(oldop), True)
+ self.optimizer.make_equal_to(op, self.getvalue(oldop))
return
else:
self.pure_operations[args] = op
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
@@ -215,13 +215,13 @@
v2 = self.getvalue(rhs)
if v1.is_constant():
- if v1.box.getfloat() == 1.0:
- self.make_equal_to(op.result, v2)
+ if v1.box.getfloatstorage() == 1.0:
+ self.make_equal_to(op, v2)
return
- elif v1.box.getfloat() == -1.0:
- self.emit_operation(ResOperation(
- rop.FLOAT_NEG, [rhs], op.result
- ))
+ elif v1.box.getfloatstorage() == -1.0:
+ newop = self.optimizer.replace_op_with(op, rop.FLOAT_NEG,
+ args=[rhs])
+ self.emit_operation(newop)
return
self.emit_operation(op)
self.pure(rop.FLOAT_MUL, [arg2, arg1], op)
@@ -248,7 +248,7 @@
def optimize_FLOAT_NEG(self, op):
v1 = op.getarg(0)
self.emit_operation(op)
- self.pure(rop.FLOAT_NEG, [op.result], v1)
+ self.pure(rop.FLOAT_NEG, [op], v1)
def optimize_guard(self, op, constbox, emit_operation=True):
value = self.getvalue(op.getarg(0))
@@ -313,8 +313,10 @@
if not previous_classbox.same_constant(expected_classbox):
r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op)
raise InvalidLoop('A GUARD_VALUE (%s) was proven to always fail' % r)
- op = old_guard_op.copy_and_change(rop.GUARD_VALUE,
- args = [old_guard_op.getarg(0), op.getarg(1)])
+ arglist = [old_guard_op.getarg(0), op.getarg(1)]
+ op = self.optimizer.replace_op_with(old_guard_op,
+ rop.GUARD_VALUE,
+ args=arglist)
self.getvalue(old_guard_op).box = op
self.optimizer.replaces_guard[op] = old_guard_op
# hack hack hack. Change the guard_opnum on
@@ -364,8 +366,10 @@
if old_guard_op.getopnum() == rop.GUARD_NONNULL:
# it was a guard_nonnull, which we replace with a
# guard_nonnull_class.
- op = old_guard_op.copy_and_change (rop.GUARD_NONNULL_CLASS,
- args = [old_guard_op.getarg(0), op.getarg(1)])
+ args = [old_guard_op.getarg(0), op.getarg(1)]
+ op = self.optimizer.replace_op_with(old_guard_op,
+ rop.GUARD_NONNULL_CLASS,
+ args)
self.optimizer.replaces_guard[op] = old_guard_op
# hack hack hack. Change the guard_opnum on
# new_guard_op.getdescr() so that when resuming,
@@ -399,7 +403,8 @@
# change the op to be a normal call, from the backend's point of view
# there is no reason to have a separate operation for this
self.loop_invariant_producer[key] = op
- newop = op.copy_and_change(self.optimizer.call_for_descr(op.getdescr()))
+ opnum = self.optimizer.call_for_descr(op.getdescr())
+ newop = self.optimizer.replace_op_with(op, opnum)
self.emit_operation(newop)
resvalue = self.getvalue(op)
resvalue.box = newop
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
@@ -86,7 +86,7 @@
# common methods
# --------------
- def copy_and_change(self, opnum, args=None, result=None, descr=None):
+ def _copy_and_change(self, opnum, args=None, result=None, descr=None):
"shallow copy: the returned operation is meant to be used in place of self"
if args is None:
args = self.getarglist()
@@ -270,8 +270,8 @@
def setfailargs(self, fail_args):
self._fail_args = fail_args
- def copy_and_change(self, opnum, args=None, result=None, descr=None):
- newop = AbstractResOp.copy_and_change(self, opnum, args, result, descr)
+ def _copy_and_change(self, opnum, args=None, result=None, descr=None):
+ newop = AbstractResOp._copy_and_change(self, opnum, args, result, descr)
newop.setfailargs(self.getfailargs())
return newop
More information about the pypy-commit
mailing list