[pypy-svn] pypy jit-short_from_state: overflow support
hakanardo
commits-noreply at bitbucket.org
Wed Apr 13 21:17:20 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r43334:2af533e2b048
Date: 2011-04-13 20:12 +0200
http://bitbucket.org/pypy/pypy/changeset/2af533e2b048/
Log: overflow support
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -166,17 +166,17 @@
inputargs = virtual_state.make_inputargs(values)
short_boxes = preamble_optimizer.produce_short_preamble_ops(inputargs)
initial_inputargs_len = len(inputargs)
+
- try:
- inputargs, short = self.inline(self.cloned_operations,
- loop.inputargs, jump_args,
- virtual_state, short_boxes)
- except KeyError:
- debug_print("Unrolling failed.")
- loop.preamble.operations = None
- jumpop.initarglist(jump_args)
- preamble_optimizer.send_extra_operation(jumpop)
- return
+ inputargs, short = self.inline(self.cloned_operations,
+ loop.inputargs, jump_args,
+ virtual_state, short_boxes)
+ #except KeyError:
+ # debug_print("Unrolling failed.")
+ # loop.preamble.operations = None
+ # jumpop.initarglist(jump_args)
+ # preamble_optimizer.send_extra_operation(jumpop)
+ # return
loop.inputargs = inputargs
jmp = ResOperation(rop.JUMP, loop.inputargs[:], None)
jmp.setdescr(loop.token)
@@ -212,7 +212,9 @@
if op.is_guard():
op = op.clone()
op.setfailargs(None)
- op.setdescr(start_resumedescr.clone_if_mutable())
+ descr = start_resumedescr.clone_if_mutable()
+ self.inliner.inline_descr_inplace(descr)
+ op.setdescr(descr)
short[i] = op
short_loop = TreeLoop('short preamble')
@@ -291,6 +293,16 @@
newop = short_inliner.inline_op(short_op)
self.optimizer.send_extra_operation(newop)
inputargs.append(a)
+ if newop.is_ovf():
+ # FIXME: ensure that GUARD_OVERFLOW:ed ops not end up here
+ guard = ResOperation(rop.GUARD_NO_OVERFLOW, [], None)
+ short.append(guard)
+ # FIXME: Emit a proper guard here in case it is not
+ # removed by the optimizer.
+ # add test_loop_variant_mul1_ovf
+ self.optimizer.send_extra_operation(guard)
+ assert self.optimizer.newoperations[-1] is not guard
+
box = newop.result
if box in self.optimizer.values:
box = self.optimizer.values[box].force_box()
More information about the Pypy-commit
mailing list