[pypy-commit] pypy result-in-resops: a little bit of dance with copying optimize_value. we need a better model I think
fijal
noreply at buildbot.pypy.org
Wed Sep 26 16:15:58 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57612:bf44c48658a3
Date: 2012-09-26 16:13 +0200
http://bitbucket.org/pypy/pypy/changeset/bf44c48658a3/
Log: a little bit of dance with copying optimize_value. we need a better
model I think
diff --git a/pypy/jit/metainterp/optimizeopt/earlyforce.py b/pypy/jit/metainterp/optimizeopt/earlyforce.py
--- a/pypy/jit/metainterp/optimizeopt/earlyforce.py
+++ b/pypy/jit/metainterp/optimizeopt/earlyforce.py
@@ -2,11 +2,9 @@
from pypy.jit.metainterp.resoperation import rop
def check_early_force(opt, opnum, num, arg):
- try:
- value = arg.get_extra("optimize_value")
- except KeyError:
- return
- value.force_box(opt)
+ value = opt.getvalue(arg, create=False)
+ if value is not None:
+ value.force_box(opt)
class OptEarlyForce(Optimization):
def propagate_forward(self, op):
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
@@ -113,8 +113,8 @@
# nonneg % power-of-two ==> nonneg & (power-of-two - 1)
arg1 = op.getarg(0)
arg2 = ConstInt(val-1)
- xxx
- op = op.copy_and_change(rop.INT_AND, args=[arg1, arg2])
+ op = self.optimizer.copy_and_change(op, rop.INT_AND, arg0=arg1,
+ arg1=arg2)
self.emit_operation(op)
if v2.is_constant():
val = v2.op.getint()
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
@@ -22,7 +22,7 @@
from pypy.jit.metainterp.resoperation import rop, AbstractResOp, opgroups,\
Const, ConstInt, ConstFloat, AbstractValue
from pypy.jit.metainterp.typesystem import llhelper
-from pypy.rlib.objectmodel import specialize
+from pypy.rlib.objectmodel import specialize, we_are_translated
from pypy.tool.pairtype import extendabletype
LEVEL_UNKNOWN = '\x00'
@@ -43,6 +43,11 @@
def clone(self):
return LenBound(self.mode, self.descr, self.bound.clone())
+class exploder(object):
+ def __getattribute__(self, attr):
+ import pdb
+ pdb.set_trace()
+
class OptValue(object):
_attrs_ = ('known_class', 'last_guard', 'level', 'intbound', 'lenbound', 'is_bool_box')
@@ -305,8 +310,8 @@
self.next_optimization.propagate_forward(op)
# FIXME: Move some of these here?
- def getvalue(self, box):
- return self.optimizer.getvalue(box)
+ def getvalue(self, box, create=True):
+ return self.optimizer.getvalue(box, create=create)
def setvalue(self, box, value):
self.optimizer.setvalue(box, value)
@@ -442,7 +447,7 @@
self.metainterp_sd.profiler.count(jitprof.Counters.OPT_FORCINGS)
self.resumedata_memo.forget_numberings(virtualbox)
- def getvalue(self, box):
+ def getvalue(self, box, create=True):
try:
while True:
box = box.get_extra("optimize_replace")
@@ -462,6 +467,8 @@
try:
value = box.get_extra("optimize_value")
except KeyError:
+ if not create:
+ return None
value = OptValue(box)
box.set_extra("optimize_value", value)
self.ensure_imported(value)
@@ -515,6 +522,13 @@
assert isinstance(with_, AbstractValue)
assert not what.has_extra("optimize_replace")
assert not what.is_constant()
+ if what.has_extra("optimize_value"):
+ v = what.get_extra("optimize_value")
+ v.op = with_
+ with_.set_extra("optimize_value", v)
+ #if not we_are_translated():
+ # if what.has_extra("optimize_value"):
+ # what.get_extra("optimize_value").__class__ = exploder
what.set_extra("optimize_replace", with_)
def make_constant(self, box, constbox):
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
@@ -4690,7 +4690,7 @@
ops = """
[p0, i0]
i1 = int_add(i0, 1)
- p1 = call(0, p0, i0, i1, descr=strslicedescr)
+ p1 = call_r(0, p0, i0, i1, descr=strslicedescr)
escape(p1)
jump(p0, i1)
"""
@@ -4859,7 +4859,7 @@
setarrayitem_gc(p0, 0, 3)
setarrayitem_gc(p0, 2, 4)
setarrayitem_gc(p0, i0, 15)
- i2 = getarrayitem_gc(p0, 2)
+ i2 = getarrayitem_gc_i(p0, 2)
jump(p0, i2)
"""
# Remove the getarrayitem_gc, because we know that p[i0] does not alias
@@ -4936,7 +4936,7 @@
[i1]
p0 = newstr(6)
copystrcontent(s"hello!", p0, 0, 0, 6)
- p1 = call(0, p0, s"abc123", descr=strconcatdescr)
+ p1 = call_r(0, p0, s"abc123", descr=strconcatdescr)
i0 = strgetitem(p1, i1)
finish(i0)
"""
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -409,9 +409,9 @@
vvalue = self.make_vstring_plain(op, mode)
vvalue.setup(length_box.getint())
else:
- self.getvalue(op.result).ensure_nonnull()
+ self.getvalue(op).ensure_nonnull()
self.emit_operation(op)
- self.pure(mode.STRLEN, [op.result], op.getarg(0))
+ self.pure(op.getarg(0), mode.STRLEN, op)
def optimize_STRSETITEM(self, op):
value = self.getvalue(op.getarg(0))
More information about the pypy-commit
mailing list