Author: Maciej Fijalkowski <[email protected]>
Branch: result-in-resops
Changeset: r56450:4f48fde082c0
Date: 2012-07-25 21:47 +0200
http://bitbucket.org/pypy/pypy/changeset/4f48fde082c0/
Log: work in progress
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -119,8 +119,9 @@
part.resume_at_jump_descr = resume_at_jump_descr
part.operations = ([create_resop(rop.LABEL, None, inputargs,
descr=TargetToken(jitcell_token))] +
- h_ops[start:] + [create_resop(rop.LABEL, None, jumpargs,
- descr=jitcell_token)])
+ [h_ops[i].clone() for i in range(start, len(h_ops))]+
+ [create_resop(rop.LABEL, None, jumpargs,
+ descr=jitcell_token)])
try:
optimize_trace(metainterp_sd, part, jitdriver_sd.warmstate.enable_opts)
@@ -139,10 +140,11 @@
while part.operations[-1].getopnum() == rop.LABEL:
inliner = Inliner(inputargs, jumpargs)
part.quasi_immutable_deps = None
- part.operations = [part.operations[-1]] + \
- [inliner.inline_op(h_ops[i]) for i in range(start,
len(h_ops))] + \
- [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a
in jumpargs],
- None, descr=jitcell_token)]
+ part.operations = ([part.operations[-1]] +
+ [inliner.inline_op(h_ops[i]) for i in range(start, len(h_ops))] +
+ [create_resop(rop.JUMP, None,
+ [inliner.get_value_replacement(a) for a in
jumpargs],
+ descr=jitcell_token)])
target_token = part.operations[0].getdescr()
assert isinstance(target_token, TargetToken)
all_target_tokens.append(target_token)
diff --git a/pypy/jit/metainterp/inliner.py b/pypy/jit/metainterp/inliner.py
--- a/pypy/jit/metainterp/inliner.py
+++ b/pypy/jit/metainterp/inliner.py
@@ -12,27 +12,15 @@
self.argmap[inputargs[i]] = jump_args[i]
self.snapshot_map = {None: None}
- def inline_op(self, newop, ignore_result=False, clone=True,
- ignore_failargs=False):
- if clone:
- newop = newop.clone()
- args = newop.getarglist()
- newop.initarglist([self.inline_arg(a) for a in args])
+ def inline_op(self, op):
+ newop = op.copy_if_modified_by_optimization(self, force_copy=True)
+ if newop.is_guard():
+ args = op.getfailargs()
+ if args:
+ newop.setfailargs([self.get_value_replacement(a) for a in
args])
- if newop.is_guard():
- args = newop.getfailargs()
- if args and not ignore_failargs:
- newop.setfailargs([self.inline_arg(a) for a in args])
- else:
- newop.setfailargs([])
-
- if newop.result and not ignore_result:
- old_result = newop.result
- newop.result = newop.result.clonebox()
- self.argmap[old_result] = newop.result
-
+ self.argmap[op] = newop
self.inline_descr_inplace(newop.getdescr())
-
return newop
def inline_descr_inplace(self, descr):
@@ -40,7 +28,7 @@
if isinstance(descr, ResumeGuardDescr):
descr.rd_snapshot = self.inline_snapshot(descr.rd_snapshot)
- def inline_arg(self, arg):
+ def get_value_replacement(self, arg):
if arg is None:
return None
if isinstance(arg, Const):
@@ -50,7 +38,7 @@
def inline_snapshot(self, snapshot):
if snapshot in self.snapshot_map:
return self.snapshot_map[snapshot]
- boxes = [self.inline_arg(a) for a in snapshot.boxes]
+ boxes = [self.get_value_replacement(a) for a in snapshot.boxes]
new_snapshot = Snapshot(self.inline_snapshot(snapshot.prev), boxes)
self.snapshot_map[snapshot] = new_snapshot
return new_snapshot
diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py
b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -36,7 +36,7 @@
def build_opt_chain(metainterp_sd, enable_opts):
config = metainterp_sd.config
optimizations = []
- enable_opts = {}
+ enable_opts = {} # XXX
unroll = 'unroll' in enable_opts # 'enable_opts' is normally a dict
for name, opt in unroll_all_opts:
if name in enable_opts:
diff --git a/pypy/jit/metainterp/optimizeopt/simplify.py
b/pypy/jit/metainterp/optimizeopt/simplify.py
--- a/pypy/jit/metainterp/optimizeopt/simplify.py
+++ b/pypy/jit/metainterp/optimizeopt/simplify.py
@@ -39,23 +39,26 @@
if not self.unroll:
descr = op.getdescr()
if isinstance(descr, JitCellToken):
- return self.optimize_JUMP(op.copy_and_change(rop.JUMP))
+ return self.optimize_JUMP(op)
self.last_label_descr = op.getdescr()
self.emit_operation(op)
def optimize_JUMP(self, op):
if not self.unroll:
descr = op.getdescr()
+ newdescr = None
assert isinstance(descr, JitCellToken)
if not descr.target_tokens:
assert self.last_label_descr is not None
target_token = self.last_label_descr
assert isinstance(target_token, TargetToken)
assert target_token.targeting_jitcell_token is descr
- op.setdescr(self.last_label_descr)
+ newdescr = self.last_label_descr
else:
assert len(descr.target_tokens) == 1
- op.setdescr(descr.target_tokens[0])
+ newdescr = descr.target_tokens[0]
+ if newdescr is not descr or op.opnum != rop.JUMP:
+ op = op.copy_and_change(op.opnum, descr=newdescr)
self.emit_operation(op)
dispatch_opt = make_dispatcher_method(OptSimplify, 'optimize_',
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
@@ -485,14 +485,17 @@
return r
@specialize.arg(1)
- def copy_and_change(self, newopnum):
- r = create_resop_0(newopnum, self.getresult(), self.getdescrclone())
+ def copy_and_change(self, newopnum, descr=None):
+ r = create_resop_0(newopnum, self.getresult(),
+ descr or self.getdescrclone())
if r.is_guard():
r.setfailargs(self.getfailargs())
assert self.is_guard()
return r
- def copy_if_modified_by_optimization(self, opt):
+ def copy_if_modified_by_optimization(self, opt, force_copy=False):
+ if force_copy:
+ return self.clone()
return self
class UnaryOp(object):
@@ -528,17 +531,18 @@
r.setfailargs(self.getfailargs())
return r
- def copy_if_modified_by_optimization(self, opt):
+ @specialize.argtype(1)
+ def copy_if_modified_by_optimization(self, opt, force_copy=False):
new_arg = opt.get_value_replacement(self._arg0)
- if new_arg is None:
+ if not force_copy and new_arg is None:
return self
return create_resop_1(self.opnum, self.getresult(), new_arg,
self.getdescrclone())
@specialize.arg(1)
- def copy_and_change(self, newopnum, arg0=None):
+ def copy_and_change(self, newopnum, arg0=None, descr=None):
r = create_resop_1(newopnum, self.getresult(), arg0 or self._arg0,
- self.getdescrclone())
+ descr or self.getdescrclone())
if r.is_guard():
r.setfailargs(self.getfailargs())
assert self.is_guard()
@@ -581,10 +585,11 @@
r.setfailargs(self.getfailargs())
return r
- def copy_if_modified_by_optimization(self, opt):
+ @specialize.argtype(1)
+ def copy_if_modified_by_optimization(self, opt, force_copy=False):
new_arg0 = opt.get_value_replacement(self._arg0)
new_arg1 = opt.get_value_replacement(self._arg1)
- if new_arg0 is None and new_arg1 is None:
+ if not force_copy and new_arg0 is None and new_arg1 is None:
return self
return create_resop_2(self.opnum, self.getresult(),
new_arg0 or self._arg0,
@@ -592,10 +597,10 @@
self.getdescrclone())
@specialize.arg(1)
- def copy_and_change(self, newopnum, arg0=None, arg1=None):
+ def copy_and_change(self, newopnum, arg0=None, arg1=None, descr=None):
r = create_resop_2(newopnum, self.getresult(), arg0 or self._arg0,
arg1 or self._arg1,
- self.getdescrclone())
+ descr or self.getdescrclone())
if r.is_guard():
r.setfailargs(self.getfailargs())
assert self.is_guard()
@@ -640,12 +645,14 @@
return create_resop_3(self.opnum, self.getresult(), self._arg0,
self._arg1, self._arg2, self.getdescrclone())
- def copy_if_modified_by_optimization(self, opt):
+ @specialize.argtype(1)
+ def copy_if_modified_by_optimization(self, opt, force_copy=False):
assert not self.is_guard()
new_arg0 = opt.get_value_replacement(self._arg0)
new_arg1 = opt.get_value_replacement(self._arg1)
new_arg2 = opt.get_value_replacement(self._arg2)
- if new_arg0 is None and new_arg1 is None and new_arg2 is None:
+ if (not force_copy and new_arg0 is None and new_arg1 is None and
+ new_arg2 is None):
return self
return create_resop_3(self.opnum, self.getresult(),
new_arg0 or self._arg0,
@@ -654,10 +661,11 @@
self.getdescrclone())
@specialize.arg(1)
- def copy_and_change(self, newopnum, arg0=None, arg1=None, arg2=None):
+ def copy_and_change(self, newopnum, arg0=None, arg1=None, arg2=None,
+ descr=None):
r = create_resop_3(newopnum, self.getresult(), arg0 or self._arg0,
arg1 or self._arg1, arg2 or self._arg2,
- self.getdescrclone())
+ descr or self.getdescrclone())
assert not r.is_guard()
return r
@@ -689,8 +697,12 @@
return create_resop(self.opnum, self.getresult(), self._args[:],
self.getdescrclone())
- def copy_if_modified_by_optimization(self, opt):
- newargs = None
+ @specialize.argtype(1)
+ def copy_if_modified_by_optimization(self, opt, force_copy=False):
+ if force_copy:
+ newargs = []
+ else:
+ newargs = None
for i, arg in enumerate(self._args):
new_arg = opt.get_value_replacement(arg)
if new_arg is not None:
@@ -708,9 +720,10 @@
newargs, self.getdescrclone())
@specialize.arg(1)
- def copy_and_change(self, newopnum, newargs=None):
+ def copy_and_change(self, newopnum, newargs=None, descr=None):
r = create_resop(newopnum, self.getresult(),
- newargs or self.getarglist(), self.getdescrclone())
+ newargs or self.getarglist(),
+ descr or self.getdescrclone())
assert not r.is_guard()
return r
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit