[pypy-commit] pypy jit-targets: test_ajit.test_basic now passing
hakanardo
noreply at buildbot.pypy.org
Sat Nov 5 18:06:25 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-targets
Changeset: r48797:faab93fbbec4
Date: 2011-11-05 18:06 +0100
http://bitbucket.org/pypy/pypy/changeset/faab93fbbec4/
Log: test_ajit.test_basic now passing
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
@@ -596,6 +596,7 @@
class ResumeFromInterpDescr(ResumeDescr):
def __init__(self, original_greenkey):
self.original_greenkey = original_greenkey
+ self.procedure_token = ProcedureToken()
def compile_and_attach(self, metainterp, new_loop):
# We managed to create a bridge going from the interpreter
@@ -605,34 +606,23 @@
metainterp_sd = metainterp.staticdata
jitdriver_sd = metainterp.jitdriver_sd
redargs = new_loop.inputargs
- # We make a new LoopToken for this entry bridge, and stick it
- # to every guard in the loop.
- new_loop_token = make_loop_token(len(redargs), jitdriver_sd)
- new_loop.token = new_loop_token
+ self.procedure_token.outermost_jitdriver_sd = jitdriver_sd
+ new_loop.token = self.procedure_token
send_loop_to_backend(self.original_greenkey, metainterp.jitdriver_sd,
metainterp_sd, new_loop, "entry bridge")
# send the new_loop to warmspot.py, to be called directly the next time
- jitdriver_sd.warmstate.attach_unoptimized_bridge_from_interp(
- self.original_greenkey,
- new_loop_token)
- # store the new loop in compiled_merge_points_wref too
- old_loop_tokens = metainterp.get_compiled_merge_points(
- self.original_greenkey)
- # it always goes at the end of the list, as it is the most
- # general loop token
- old_loop_tokens.append(new_loop_token)
- metainterp.set_compiled_merge_points(self.original_greenkey,
- old_loop_tokens)
+ jitdriver_sd.warmstate.attach_procedure_to_interp(
+ self.original_greenkey, self.procedure_token)
def reset_counter_from_failure(self):
pass
-def compile_new_bridge(metainterp, old_loop_tokens, resumekey, retraced=False):
+def compile_new_bridge(metainterp, resumekey, retraced=False):
"""Try to compile a new bridge leading from the beginning of the history
to some existing place.
"""
- from pypy.jit.metainterp.optimize import optimize_bridge
+ from pypy.jit.metainterp.optimizeopt import optimize_trace
# The history contains new operations to attach as the code for the
# failure of 'resumekey.guard_op'.
@@ -640,9 +630,11 @@
# Attempt to use optimize_bridge(). This may return None in case
# it does not work -- i.e. none of the existing old_loop_tokens match.
new_loop = create_empty_loop(metainterp)
- new_loop.inputargs = metainterp.history.inputargs[:]
+ new_loop.inputargs = inputargs = metainterp.history.inputargs[:]
# clone ops, as optimize_bridge can mutate the ops
- new_loop.operations = [op.clone() for op in metainterp.history.operations]
+ procedure_token = resumekey.procedure_token
+ new_loop.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(procedure_token))] + \
+ [op.clone() for op in metainterp.history.operations]
metainterp_sd = metainterp.staticdata
state = metainterp.jitdriver_sd.warmstate
if isinstance(resumekey, ResumeAtPositionDescr):
@@ -650,38 +642,18 @@
else:
inline_short_preamble = True
try:
- target_loop_token = optimize_bridge(metainterp_sd, old_loop_tokens,
- new_loop, state.enable_opts,
- inline_short_preamble, retraced)
+ optimize_trace(metainterp_sd, new_loop, state.enable_opts)
except InvalidLoop:
debug_print("compile_new_bridge: got an InvalidLoop")
# XXX I am fairly convinced that optimize_bridge cannot actually raise
# InvalidLoop
debug_print('InvalidLoop in compile_new_bridge')
return None
- # Did it work?
- if target_loop_token is not None:
- # Yes, we managed to create a bridge. Dispatch to resumekey to
- # know exactly what we must do (ResumeGuardDescr/ResumeFromInterpDescr)
- prepare_last_operation(new_loop, target_loop_token)
- resumekey.compile_and_attach(metainterp, new_loop)
- record_loop_or_bridge(metainterp_sd, new_loop)
- return target_loop_token
-
-def prepare_last_operation(new_loop, target_loop_token):
- op = new_loop.operations[-1]
- if not isinstance(target_loop_token, TerminatingLoopToken):
- # normal case
- #op.setdescr(target_loop_token) # patch the jump target
- pass
- else:
- # The target_loop_token is a pseudo loop token,
- # e.g. loop_tokens_done_with_this_frame_void[0]
- # Replace the operation with the real operation we want, i.e. a FINISH
- descr = target_loop_token.finishdescr
- args = op.getarglist()
- new_op = ResOperation(rop.FINISH, args, None, descr=descr)
- new_loop.operations[-1] = new_op
+ # We managed to create a bridge. Dispatch to resumekey to
+ # know exactly what we must do (ResumeGuardDescr/ResumeFromInterpDescr)
+ resumekey.compile_and_attach(metainterp, new_loop)
+ record_loop_or_bridge(metainterp_sd, new_loop)
+ return new_loop.operations[-1].getdescr()
# ____________________________________________________________
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
@@ -74,15 +74,18 @@
self.import_state(start_targetop)
lastop = loop.operations[-1]
- assert lastop.getopnum() == rop.LABEL
- loop.operations = loop.operations[:-1]
- #if lastop.getopnum() == rop.LABEL or lastop.getopnum() == rop.JUMP:
- # loop.operations = loop.operations[:-1]
- #FIXME: FINISH
+ if lastop.getopnum() == rop.LABEL:
+ loop.operations = loop.operations[:-1]
+ else:
+ lastop = None
self.optimizer.propagate_all_forward(clear=False)
+
+ if not lastop:
+ self.optimizer.flush()
+ loop.operations = self.optimizer.get_newoperations()
+ return
- #if lastop.getopnum() == rop.LABEL:
if not self.did_peel_one: # Enforce the previous behaviour of always peeling exactly one iteration (for now)
self.optimizer.flush()
KillHugeIntBounds(self.optimizer).apply()
@@ -97,8 +100,6 @@
self.close_loop(jumpop)
self.finilize_short_preamble(lastop)
start_targetop.getdescr().short_preamble = self.short
- #else:
- # loop.operations = self.optimizer.get_newoperations()
def export_state(self, targetop):
original_jump_args = targetop.getarglist()
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
@@ -2118,10 +2118,10 @@
loop_tokens = sd.loop_tokens_done_with_this_frame_float
else:
assert False
- self.history.record(rop.JUMP, exits, None)
- target_loop_token = compile.compile_new_bridge(self, loop_tokens,
- self.resumekey)
- if target_loop_token is not loop_tokens[0]:
+ # FIXME: kill TerminatingLoopToken?
+ self.history.record(rop.FINISH, exits, None, descr=loop_tokens[0].finishdescr)
+ target_loop_token = compile.compile_new_bridge(self, self.resumekey)
+ if not target_loop_token:
compile.giveup()
def compile_exit_frame_with_exception(self, valuebox):
diff --git a/pypy/jit/metainterp/test/support.py b/pypy/jit/metainterp/test/support.py
--- a/pypy/jit/metainterp/test/support.py
+++ b/pypy/jit/metainterp/test/support.py
@@ -16,15 +16,16 @@
from pypy.jit.codewriter import support
class FakeJitCell(object):
- __compiled_merge_points = []
- def get_compiled_merge_points(self):
- return self.__compiled_merge_points[:]
- def set_compiled_merge_points(self, lst):
- self.__compiled_merge_points = lst
+ __product_token = None
+ def get_procedure_token(self):
+ return self.__product_token
+ def set_procedure_token(self, token):
+ self.__product_token = token
class FakeWarmRunnerState(object):
- def attach_unoptimized_bridge_from_interp(self, greenkey, newloop):
- pass
+ def attach_procedure_to_interp(self, greenkey, procedure_token):
+ cell = self.jit_cell_at_key(greenkey)
+ cell.set_procedure_token(procedure_token)
def helper_func(self, FUNCPTR, func):
from pypy.rpython.annlowlevel import llhelper
@@ -132,16 +133,14 @@
def _run_with_machine_code(testself, args):
metainterp = testself.metainterp
num_green_args = metainterp.jitdriver_sd.num_green_args
- loop_tokens = metainterp.get_compiled_merge_points(args[:num_green_args])
- if len(loop_tokens) != 1:
- return NotImplemented
+ procedure_token = metainterp.get_procedure_token(args[:num_green_args])
# a loop was successfully created by _run_with_pyjitpl(); call it
cpu = metainterp.cpu
for i in range(len(args) - num_green_args):
x = args[num_green_args + i]
typecode = history.getkind(lltype.typeOf(x))
set_future_value(cpu, i, x, typecode)
- faildescr = cpu.execute_token(loop_tokens[0])
+ faildescr = cpu.execute_token(procedure_token)
assert faildescr.__class__.__name__.startswith('DoneWithThisFrameDescr')
if metainterp.jitdriver_sd.result_type == history.INT:
return cpu.get_latest_value_int(0)
More information about the pypy-commit
mailing list