[pypy-svn] pypy jit-short-preamble: Reordering the snapshot boxes correctly
hakanardo
commits-noreply at bitbucket.org
Fri Jan 21 13:44:09 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short-preamble
Changeset: r41128:7d69bcd700c1
Date: 2011-01-21 13:43 +0100
http://bitbucket.org/pypy/pypy/changeset/7d69bcd700c1/
Log: Reordering the snapshot boxes correctly
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
@@ -6,17 +6,19 @@
from pypy.jit.metainterp.optimizeopt.string import OptString
from pypy.jit.metainterp.optimizeopt.unroll import optimize_unroll, OptInlineShortPreamble
-def optimize_loop_1(metainterp_sd, loop, unroll=True):
+def optimize_loop_1(metainterp_sd, loop, unroll=True, inline_short_preamble=True):
"""Optimize loop.operations to remove internal overheadish operations.
"""
opt_str = OptString()
- optimizations = [OptInlineShortPreamble(),
- OptIntBounds(),
+ optimizations = [OptIntBounds(),
OptRewrite(),
OptVirtualize(),
opt_str,
OptHeap(),
]
+ if inline_short_preamble:
+ optimizations = [OptInlineShortPreamble()] + optimizations
+
if metainterp_sd.jit_ffi:
from pypy.jit.metainterp.optimizeopt.fficall import OptFfiCall
optimizations = optimizations + [
@@ -31,6 +33,6 @@
optimizer = Optimizer(metainterp_sd, loop, optimizations)
optimizer.propagate_all_forward()
-def optimize_bridge_1(metainterp_sd, bridge):
+def optimize_bridge_1(metainterp_sd, bridge, inline_short_preamble=True):
"""The same, but for a bridge. """
- optimize_loop_1(metainterp_sd, bridge, False)
+ optimize_loop_1(metainterp_sd, bridge, False, inline_short_preamble)
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
@@ -595,10 +595,14 @@
new_loop.operations = [op.clone() for op in metainterp.history.operations]
metainterp_sd = metainterp.staticdata
state = metainterp.jitdriver_sd.warmstate
+ if isinstance(resumekey, ResumeAtPositionDescr):
+ inline_short_preamble = False
+ else:
+ inline_short_preamble = True
try:
target_loop_token = state.optimize_bridge(metainterp_sd,
old_loop_tokens,
- new_loop)
+ new_loop, inline_short_preamble)
except InvalidLoop:
# XXX I am fairly convinced that optimize_bridge cannot actually raise
# InvalidLoop
diff --git a/pypy/jit/metainterp/optimize.py b/pypy/jit/metainterp/optimize.py
--- a/pypy/jit/metainterp/optimize.py
+++ b/pypy/jit/metainterp/optimize.py
@@ -22,20 +22,20 @@
# ____________________________________________________________
-def optimize_bridge(metainterp_sd, old_loop_tokens, bridge):
+def optimize_bridge(metainterp_sd, old_loop_tokens, bridge, inline_short_preamble=True):
debug_start("jit-optimize")
try:
- return _optimize_bridge(metainterp_sd, old_loop_tokens, bridge)
+ return _optimize_bridge(metainterp_sd, old_loop_tokens, bridge, inline_short_preamble)
finally:
debug_stop("jit-optimize")
-def _optimize_bridge(metainterp_sd, old_loop_tokens, bridge):
+def _optimize_bridge(metainterp_sd, old_loop_tokens, bridge, inline_short_preamble):
cpu = metainterp_sd.cpu
metainterp_sd.logger_noopt.log_loop(bridge.inputargs, bridge.operations)
if old_loop_tokens:
old_loop_token = old_loop_tokens[0]
bridge.operations[-1].setdescr(old_loop_token) # patch jump target
- optimize_bridge_1(metainterp_sd, bridge)
+ optimize_bridge_1(metainterp_sd, bridge, inline_short_preamble)
return old_loop_tokens[0]
#return bridge.operations[-1].getdescr()
return None
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
@@ -152,7 +152,6 @@
if jumpop:
assert jumpop.getdescr() is loop.token
loop.preamble.operations = self.optimizer.newoperations
-
self.optimizer = self.optimizer.reconstruct_for_next_iteration()
jump_args = jumpop.getarglist()
@@ -166,6 +165,13 @@
loop.operations = self.optimizer.newoperations
+ new_snapshot_args = []
+ start_resumedescr = loop.preamble.token.start_resumedescr.clone_if_mutable()
+ snapshot_args = start_resumedescr.rd_snapshot.prev.boxes
+ for a in snapshot_args:
+ new_snapshot_args.append(loop.preamble.inputargs[jump_args.index(a)])
+ start_resumedescr.rd_snapshot.prev.boxes = new_snapshot_args
+
short = self.create_short_preamble(loop.preamble, loop)
if short:
if False:
@@ -180,9 +186,7 @@
op = op.clone()
#op.setfailargs(loop.preamble.inputargs)
#op.setjumptarget(loop.preamble.token)
- start_resumedescr = loop.preamble.token.start_resumedescr.clone_if_mutable()
- start_resumedescr.rd_snapshot.prev.boxes = loop.preamble.inputargs[:]
- op.setdescr(start_resumedescr)
+ op.setdescr(start_resumedescr.clone_if_mutable())
short[i] = op
short_loop = TreeLoop('short preamble')
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -819,9 +819,13 @@
self.generate_guard(rop.GUARD_CLASS, box, [clsbox], resumepc=orgpc)
return clsbox
- @arguments("int")
- def opimpl_loop_header(self, jdindex):
+ @arguments("int", "orgpc")
+ def opimpl_loop_header(self, jdindex, orgpc):
+ #resumedescr = compile.ResumeGuardDescr()
+ resumedescr = compile.ResumeAtPositionDescr()
+ self.capture_resumedata(resumedescr, orgpc)
self.metainterp.seen_loop_header_for_jdindex = jdindex
+ self.metainterp.loop_header_resumedescr = resumedescr
def verify_green_args(self, jitdriver_sd, varargs):
num_green_args = jitdriver_sd.num_green_args
@@ -833,19 +837,21 @@
def opimpl_jit_merge_point(self, orgpc, jdindex, greenboxes,
jcposition, redboxes):
#try:
- #resumedescr = compile.ResumeAtPositionDescr() #ResumeGuardDescr()
- resumedescr = compile.ResumeGuardDescr()
- self.capture_resumedata(resumedescr, orgpc)
+ #resumedescr = compile.ResumeAtPositionDescr()
+ #resumedescr = compile.ResumeGuardDescr()
+ #self.capture_resumedata(resumedescr, orgpc)
#except MissingLiveness:
# resumedescr = None
#resumedescr.rd_frame_info_list.pc = orgpc # FIXME: IS this safe?
-
+ resumedescr = self.metainterp.loop_header_resumedescr
+
any_operation = len(self.metainterp.history.operations) > 0
jitdriver_sd = self.metainterp.staticdata.jitdrivers_sd[jdindex]
self.verify_green_args(jitdriver_sd, greenboxes)
# xxx we may disable the following line in some context later
self.debug_merge_point(jitdriver_sd, self.metainterp.in_recursion,
greenboxes)
+
if self.metainterp.seen_loop_header_for_jdindex < 0:
if not jitdriver_sd.no_loop_header or not any_operation:
return
@@ -856,6 +862,7 @@
"found a loop_header for a JitDriver that does not match "
"the following jit_merge_point's")
self.metainterp.seen_loop_header_for_jdindex = -1
+
#
if not self.metainterp.in_recursion:
assert jitdriver_sd is self.metainterp.jitdriver_sd
@@ -1419,6 +1426,7 @@
self.free_frames_list = []
self.last_exc_value_box = None
self.retracing_loop_from = None
+ self.loop_header_resumedescr = None
def perform_call(self, jitcode, boxes, greenkey=None):
# causes the metainterp to enter the given subfunction
More information about the Pypy-commit
mailing list