[pypy-commit] pypy result-in-resops: good, now we start having real issues. hack until it works
fijal
noreply at buildbot.pypy.org
Thu Sep 20 19:18:41 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57409:0266377fadd0
Date: 2012-09-20 19:18 +0200
http://bitbucket.org/pypy/pypy/changeset/0266377fadd0/
Log: good, now we start having real issues. hack until it works
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
@@ -1,7 +1,13 @@
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization
-from pypy.jit.metainterp.optimizeopt.vstring import VAbstractStringValue
from pypy.jit.metainterp.resoperation import rop
+def check_early_force(opt, opnum, num, arg):
+ try:
+ value = arg.get_extra("optimizer_value")
+ except KeyError:
+ return
+ value.force_box(opt)
+
class OptEarlyForce(Optimization):
def propagate_forward(self, op):
opnum = op.getopnum()
@@ -12,11 +18,8 @@
opnum != rop.SAME_AS_p and
opnum != rop.SAME_AS_f and
opnum != rop.MARK_OPAQUE_PTR):
-
- for arg in op.getarglist():
- if arg in self.optimizer.values:
- value = self.getvalue(arg)
- value.force_box(self)
+
+ op.foreach_arg(check_early_force, self)
self.emit_operation(op)
def new(self):
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
@@ -4,7 +4,7 @@
from pypy.jit.metainterp.optimizeopt.intutils import (IntBound, IntLowerBound,
IntUpperBound)
from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from pypy.jit.metainterp.resoperation import rop, ConstInt
+from pypy.jit.metainterp.resoperation import rop, ConstInt, AbstractResOp
from pypy.jit.metainterp.optimize import InvalidLoop
@@ -31,7 +31,8 @@
b = v.intbound
if b.has_lower and b.has_upper and b.lower == b.upper:
v.make_constant(ConstInt(b.lower))
- dispatch_bounds_ops(self, box)
+ if isinstance(box, AbstractResOp):
+ dispatch_bounds_ops(self, box)
def optimize_GUARD_TRUE(self, op):
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
@@ -291,6 +291,7 @@
def new_const_item(self, arraydescr):
return self.optimizer.new_const_item(arraydescr)
+ @specialize.arg(1)
def pure(self, opnum, result, arg0, arg1):
if self.optimizer.optpure:
self.optimizer.optpure.pure(opnum, result, arg0, arg1)
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
@@ -96,9 +96,7 @@
def pure(self, opnum, result, arg0, arg1):
op = create_resop_2(opnum, result, arg0, arg1)
- key = self.optimizer.make_args_key(op)
- if key not in self.pure_operations:
- self.pure_operations[key] = op
+ self.pure_operations.add(op)
def has_pure_result(self, opnum, args, descr):
op = ResOperation(opnum, args, None, descr)
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
@@ -96,8 +96,8 @@
else:
self.emit_operation(op)
# Synthesize the reverse ops for optimize_default to reuse
- self.pure(rop.INT_ADD, op.getarg(0), op, op.getarg(1))
- self.pure(rop.INT_SUB, op.getarg(1), op.getarg(0), op)
+ 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)
def optimize_INT_ADD(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -111,9 +111,8 @@
else:
self.emit_operation(op)
# Synthesize the reverse op for optimize_default to reuse
- # XXX disable for now
- #self.pure(rop.INT_SUB, [op, op.getarg(1)], op.getarg(0))
- #self.pure(rop.INT_SUB, [op, op.getarg(0)], op.getarg(1))
+ 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))
def optimize_INT_MUL(self, op):
v1 = self.getvalue(op.getarg(0))
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
@@ -9,7 +9,7 @@
from pypy.jit.metainterp.history import get_const_ptr_for_string
from pypy.jit.metainterp import executor, compile, resume
from pypy.jit.metainterp.resoperation import rop, opname, ConstInt, BoxInt,\
- create_resop_1
+ create_resop_1, create_resop
from pypy.rlib.rarithmetic import LONG_BIT
def test_store_final_boxes_in_guard():
@@ -117,10 +117,10 @@
def optimize_loop(self, ops, optops, call_pure_results=None):
loop = self.parse(ops)
token = JitCellToken()
- loop.operations = [ResOperation(rop.LABEL, loop.inputargs, None, descr=TargetToken(token))] + \
+ loop.operations = [create_resop(rop.LABEL, None, loop.inputargs, descr=TargetToken(token))] + \
loop.operations
if loop.operations[-1].getopnum() == rop.JUMP:
- loop.operations[-1].setdescr(token)
+ loop.operations[-1]._descr = token
expected = convert_old_style_to_targets(self.parse(optops), jump=True)
self._do_optimize_loop(loop, call_pure_results)
print '\n'.join([str(o) for o in loop.operations])
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -381,8 +381,7 @@
def parse(self, s, boxkinds=None):
return parse(s, self.cpu, self.namespace,
type_system=self.type_system,
- boxkinds=boxkinds,
- invent_fail_descr=self.invent_fail_descr)
+ boxkinds=boxkinds)
def invent_fail_descr(self, model, fail_args):
if fail_args is None:
@@ -414,6 +413,11 @@
if hasattr(self, 'callinfocollection'):
metainterp_sd.callinfocollection = self.callinfocollection
#
+ for op in loop.operations:
+ if op.is_guard():
+ fail_args = op.get_extra("failargs")
+ op._rd_frame_info_list = resume.FrameInfo(None, "code", 11)
+ op._rd_snapshot = resume.Snapshot(None, _sortboxes(fail_args))
optimize_trace(metainterp_sd, loop, self.enable_opts)
def unroll_and_optimize(self, loop, call_pure_results=None):
@@ -487,11 +491,11 @@
def convert_old_style_to_targets(loop, jump):
newloop = TreeLoop(loop.name)
newloop.inputargs = loop.inputargs
- newloop.operations = [ResOperation(rop.LABEL, loop.inputargs, None, descr=FakeDescr())] + \
+ newloop.operations = [create_resop(rop.LABEL, None, loop.inputargs, descr=FakeDescr())] + \
loop.operations
if not jump:
assert newloop.operations[-1].getopnum() == rop.JUMP
- newloop.operations[-1] = ResOperation(rop.LABEL, newloop.operations[-1].getarglist(), None, descr=FakeDescr())
+ newloop.operations[-1] = create_resop(rop.LABEL, None, newloop.operations[-1].getarglist(), descr=FakeDescr())
return newloop
# ____________________________________________________________
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
@@ -150,8 +150,6 @@
assert op1.eq(remap[op2])
else:
remap[op2] = op1
- if op1.getopnum() not in (rop.JUMP, rop.LABEL): # xxx obscure
- assert op1.getdescr() == op2.getdescr()
if op1.is_guard():
assert op2.is_guard()
if op1.get_extra("failargs") or op2.get_extra("failargs"):
@@ -175,6 +173,8 @@
break
else:
assert False
+ elif op1.getopnum() not in (rop.JUMP, rop.LABEL): # xxx obscure
+ assert op1.getdescr() == op2.getdescr()
assert len(oplist1) == len(oplist2)
print '-'*totwidth
return 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
@@ -977,13 +977,17 @@
def getarg(self, i):
raise IndexError
- def foreach_arg(self, func):
+ def foreach_arg(self, func, arg):
pass
@specialize.arg(1)
def copy_and_change(self, newopnum, descr=None):
- return create_resop_0(newopnum, self.getresult(),
- descr or self.getdescr())
+ res = create_resop_0(newopnum, self.getresult(),
+ descr or self.getdescr())
+ if self.is_guard():
+ res.set_rd_frame_info_list(self.get_rd_frame_info_list())
+ res.set_rd_snapshot(self.get_rd_snapshot())
+ return res
def copy_if_modified_by_optimization(self, opt):
return self
@@ -1017,8 +1021,8 @@
raise IndexError
@specialize.arg(1)
- def foreach_arg(self, func):
- func(self.getopnum(), 0, self._arg0)
+ def foreach_arg(self, func, arg):
+ func(arg, self.getopnum(), 0, self._arg0)
@specialize.argtype(1)
def copy_if_modified_by_optimization(self, opt):
@@ -1030,8 +1034,12 @@
@specialize.arg(1)
def copy_and_change(self, newopnum, arg0=None, descr=None):
- return create_resop_1(newopnum, self.getresult(), arg0 or self._arg0,
- descr or self.getdescr())
+ res = create_resop_1(newopnum, self.getresult(), arg0 or self._arg0,
+ descr or self.getdescr())
+ if self.is_guard():
+ res.set_rd_frame_info_list(self.get_rd_frame_info_list())
+ res.set_rd_snapshot(self.get_rd_snapshot())
+ return res
def get_arg_hash(self):
return self._arg0._get_hash_()
@@ -1066,9 +1074,9 @@
return [self._arg0, self._arg1]
@specialize.arg(1)
- def foreach_arg(self, func):
- func(self.getopnum(), 0, self._arg0)
- func(self.getopnum(), 1, self._arg1)
+ def foreach_arg(self, func, arg):
+ func(arg, self.getopnum(), 0, self._arg0)
+ func(arg, self.getopnum(), 1, self._arg1)
@specialize.argtype(1)
def copy_if_modified_by_optimization(self, opt):
@@ -1083,9 +1091,13 @@
@specialize.arg(1)
def copy_and_change(self, newopnum, arg0=None, arg1=None, descr=None):
- return create_resop_2(newopnum, self.getresult(), arg0 or self._arg0,
- arg1 or self._arg1,
- descr or self.getdescr())
+ res = create_resop_2(newopnum, self.getresult(), arg0 or self._arg0,
+ arg1 or self._arg1,
+ descr or self.getdescr())
+ if self.is_guard():
+ res.set_rd_frame_info_list(self.get_rd_frame_info_list())
+ res.set_rd_snapshot(self.get_rd_snapshot())
+ return res
def get_arg_hash(self):
return (intmask(self._arg0._get_hash_() << 16) +
@@ -1124,10 +1136,10 @@
raise IndexError
@specialize.arg(1)
- def foreach_arg(self, func):
- func(self.getopnum(), 0, self._arg0)
- func(self.getopnum(), 1, self._arg1)
- func(self.getopnum(), 2, self._arg2)
+ def foreach_arg(self, func, arg):
+ func(arg, self.getopnum(), 0, self._arg0)
+ func(arg, self.getopnum(), 1, self._arg1)
+ func(arg, self.getopnum(), 2, self._arg2)
@specialize.argtype(1)
def copy_if_modified_by_optimization(self, opt):
@@ -1181,9 +1193,9 @@
return self._args[i]
@specialize.arg(1)
- def foreach_arg(self, func):
+ def foreach_arg(self, func, arg):
for i, arg in enumerate(self._args):
- func(self.getopnum(), i, arg)
+ func(arg, self.getopnum(), i, arg)
@specialize.argtype(1)
def copy_if_modified_by_optimization(self, opt):
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -52,6 +52,7 @@
def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
storage):
+ xxx
n = len(framestack)-1
top = framestack[n]
_ensure_parent_resumedata(framestack, n)
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -45,16 +45,12 @@
return FORCE_SPILL(self.OPNUM, self.getarglist()[:])
-def default_fail_descr(model, fail_args=None):
- return model.BasicFailDescr()
-
-
class OpParser(object):
use_mock_model = False
def __init__(self, input, cpu, namespace, type_system, boxkinds,
- invent_fail_descr=default_fail_descr,
+ invent_fail_descr=True,
nonstrict=False):
self.input = input
self.vars = {}
@@ -378,7 +374,7 @@
return base_indent, inpargs, lines
def parse(input, cpu=None, namespace=None, type_system='lltype',
- boxkinds=None, invent_fail_descr=default_fail_descr,
+ boxkinds=None, invent_fail_descr=True,
no_namespace=False, nonstrict=False, OpParser=OpParser):
if namespace is None and not no_namespace:
namespace = {}
@@ -386,7 +382,7 @@
invent_fail_descr, nonstrict).parse()
def pure_parse(*args, **kwds):
- kwds['invent_fail_descr'] = None
+ kwds['invent_fail_descr'] = False
return parse(*args, **kwds)
More information about the pypy-commit
mailing list