Author: Maciej Fijalkowski <[email protected]>
Branch: vmprof2
Changeset: r76818:680943462021
Date: 2015-04-17 16:31 +0200
http://bitbucket.org/pypy/pypy/changeset/680943462021/
Log: exchange the logic with something much simpler
diff --git a/rpython/jit/backend/arm/assembler.py
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -575,8 +575,8 @@
self.mc.BL(self.stack_check_slowpath, c=c.HI) # call if ip >
lr
# cpu interface
- def assemble_loop(self, logger, loopname, inputargs, operations, looptoken,
- log):
+ def assemble_loop(self, jd_id, unique_id, logger, loopname, inputargs,
+ operations, looptoken, log):
clt = CompiledLoopToken(self.cpu, looptoken.number)
looptoken.compiled_loop_token = clt
clt._debug_nbargs = len(inputargs)
@@ -586,6 +586,9 @@
assert len(set(inputargs)) == len(inputargs)
self.setup(looptoken)
+ self.codemap_builder.enter_portal_frame(jd_id, unique_id,
+ self.mc.get_relative_pos())
+
frame_info = self.datablockwrapper.malloc_aligned(
jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
diff --git a/rpython/jit/backend/arm/regalloc.py
b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -373,6 +373,12 @@
return gcmap
# ------------------------------------------------------------
+ def perform_enter_portal_frame(self, op):
+ self.assembler.enter_portal_frame(op)
+
+ def perform_leave_portal_frame(self, op):
+ self.assembler.leave_portal_frame(op)
+
def perform_extra(self, op, args, fcond):
return self.assembler.regalloc_emit_extra(op, args, fcond, self)
@@ -392,9 +398,6 @@
else:
self.rm._sync_var(v)
- def prepare_op_debug_merge_point(self, op, fcond):
- self.assembler.codemap.debug_merge_point(op)
-
def _prepare_op_int_add(self, op, fcond):
boxes = op.getarglist()
a0, a1 = boxes
diff --git a/rpython/jit/backend/arm/runner.py
b/rpython/jit/backend/arm/runner.py
--- a/rpython/jit/backend/arm/runner.py
+++ b/rpython/jit/backend/arm/runner.py
@@ -56,11 +56,6 @@
def finish_once(self):
self.assembler.finish_once()
- def compile_loop(self, inputargs, operations, looptoken,
- log=True, name='', logger=None):
- return self.assembler.assemble_loop(logger, name, inputargs,
operations,
- looptoken, log=log)
-
def compile_bridge(self, faildescr, inputargs, operations,
original_loop_token, log=True, logger=None):
clt = original_loop_token.compiled_loop_token
diff --git a/rpython/jit/backend/llsupport/assembler.py
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -199,11 +199,15 @@
guardtok.faildescr.rd_locs = positions
return fail_descr, target
- def debug_merge_point(self, op):
- self.codemap_builder.debug_merge_point(op.getarg(1).getint(),
- op.getarg(3).getint(),
+ def enter_portal_frame(self, op):
+ self.codemap_builder.debug_merge_point(op.getarg(0).getint(),
+ op.getarg(1).getint(),
self.mc.get_relative_pos())
+ def leave_portal_frame(self, op):
+ self.codemap_builder.leave_portal_frame(op.getarg(0).getint(),
+ self.mc.get_relative_pos())
+
def call_assembler(self, op, guard_op, argloc, vloc, result_loc, tmploc):
self._store_force_index(guard_op)
descr = op.getdescr()
diff --git a/rpython/jit/backend/llsupport/codemap.py
b/rpython/jit/backend/llsupport/codemap.py
--- a/rpython/jit/backend/llsupport/codemap.py
+++ b/rpython/jit/backend/llsupport/codemap.py
@@ -145,29 +145,21 @@
self.patch_position = []
self.last_call_depth = -1
- def debug_merge_point(self, call_depth, unique_id, pos):
- if call_depth != self.last_call_depth:
- if unique_id == 0: # uninteresting case
- return
- assert unique_id & 1 == 0
- if call_depth > self.last_call_depth:
- assert call_depth == self.last_call_depth + 1
- # ^^^ It should never be the case that we see
- # debug_merge_points that suddenly go more than *one*
- # call deeper than the previous one (unless we're at
- # the start of a bridge, handled by
- # inherit_code_from_position()).
- self.l.append(unique_id)
- self.l.append(pos) # <- this is a relative pos
- self.patch_position.append(len(self.l))
- self.l.append(0) # marker
- self.l.append(0) # second marker
- else:
- for i in range(self.last_call_depth - call_depth):
- to_patch = self.patch_position.pop()
- self.l[to_patch] = pos
- self.l[to_patch + 1] = len(self.l)
- self.last_call_depth = call_depth
+ def enter_portal_frame(self, jd_id, unique_id, relpos):
+ if jd_id != 0:
+ return
+ self.l.append(unique_id)
+ self.l.append(relpos)
+ self.patch_position.append(len(self.l))
+ self.l.append(0) # marker
+ self.l.append(0) # second marker
+
+ def leave_portal_frame(self, jd_id, relpos):
+ if jd_id != 0:
+ return
+ to_patch = self.patch_position.pop()
+ self.l[to_patch] = relpos
+ self.l[to_patch + 1] = len(self.l)
def inherit_code_from_position(self, pos):
lst = unpack_traceback(pos)
diff --git a/rpython/jit/backend/llsupport/llmodel.py
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -82,6 +82,12 @@
def finish_once(self):
self.codemap.finish_once()
+ def compile_loop(self, jd_id, unique_id, inputargs, operations, looptoken,
+ log=True, name='', logger=None):
+ return self.assembler.assemble_loop(jd_id, unique_id, logger, name,
+ inputargs, operations,
+ looptoken, log=log)
+
def _setup_frame_realloc(self, translate_support_code):
FUNC_TP = lltype.Ptr(lltype.FuncType([llmemory.GCREF, lltype.Signed],
llmemory.GCREF))
diff --git a/rpython/jit/backend/llsupport/rewrite.py
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -67,6 +67,8 @@
self.emit_pending_zeros()
elif op.can_malloc():
self.emitting_an_operation_that_can_collect()
+ elif op.getopnum() == rop.DEBUG_MERGE_POINT:
+ continue # ignore debug_merge_points
elif op.getopnum() == rop.LABEL:
self.emitting_an_operation_that_can_collect()
self.known_lengths.clear()
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -51,7 +51,7 @@
"""
return False
- def compile_loop(self, inputargs, operations, looptoken,
+ def compile_loop(self, jd_id, unique_id, inputargs, operations, looptoken,
log=True, name='', logger=None):
"""Assemble the given loop.
Should create and attach a fresh CompiledLoopToken to
diff --git a/rpython/jit/backend/x86/assembler.py
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -438,8 +438,8 @@
self.wb_slowpath[withcards + 2 * withfloats] = rawstart
@rgc.no_release_gil
- def assemble_loop(self, inputargs, operations, looptoken, log,
- loopname, logger):
+ def assemble_loop(self, jd_id, unique_id, logger, loopname, inputargs,
+ operations, looptoken, log):
'''adds the following attributes to looptoken:
_ll_function_addr (address of the generated func, as an int)
_ll_loop_code (debug: addr of the start of the ResOps)
@@ -457,7 +457,8 @@
assert len(set(inputargs)) == len(inputargs)
self.setup(looptoken)
-
+ self.codemap_builder.enter_portal_frame(jd_id, unique_id,
+ self.mc.get_relative_pos())
frame_info = self.datablockwrapper.malloc_aligned(
jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info)
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1323,8 +1323,11 @@
self.possibly_free_vars_for_op(op)
assembler.closing_jump(self.jump_target_descr)
- def consider_debug_merge_point(self, op):
- self.assembler.debug_merge_point(op)
+ def consider_enter_portal_frame(self, op):
+ self.assembler.enter_portal_frame(op)
+
+ def consider_leave_portal_frame(self, op):
+ self.assembler.leave_portal_frame(op)
def consider_jit_debug(self, op):
pass
diff --git a/rpython/jit/backend/x86/runner.py
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -92,11 +92,6 @@
lines = machine_code_dump(data, addr, self.backend_name, label_list)
print ''.join(lines)
- def compile_loop(self, inputargs, operations, looptoken, log=True,
- name='', logger=None):
- return self.assembler.assemble_loop(inputargs, operations, looptoken,
log,
- name, logger)
-
def compile_bridge(self, faildescr, inputargs, operations,
original_loop_token, log=True, logger=None):
clt = original_loop_token.compiled_loop_token
diff --git a/rpython/jit/metainterp/compile.py
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -303,11 +303,12 @@
token.original_jitcell_token = trace.original_jitcell_token
-def do_compile_loop(metainterp_sd, inputargs, operations, looptoken,
- log=True, name=''):
+def do_compile_loop(jd_id, unique_id, metainterp_sd, inputargs, operations,
+ looptoken, log=True, name=''):
metainterp_sd.logger_ops.log_loop(inputargs, operations, -2,
'compiling', name=name)
- return metainterp_sd.cpu.compile_loop(inputargs, operations, looptoken,
+ return metainterp_sd.cpu.compile_loop(jd_id, unique_id, inputargs,
+ operations, looptoken,
log=log, name=name,
logger=metainterp_sd.logger_ops)
@@ -347,7 +348,9 @@
debug_start("jit-backend")
try:
loopname = jitdriver_sd.warmstate.get_location_str(greenkey)
- asminfo = do_compile_loop(metainterp_sd, loop.inputargs,
+ unique_id = jitdriver_sd.warmstate.get_unique_id(greenkey)
+ asminfo = do_compile_loop(jitdriver_sd.index, unique_id, metainterp_sd,
+ loop.inputargs,
operations, original_jitcell_token,
name=loopname)
finally:
@@ -925,7 +928,7 @@
]
operations[1].setfailargs([])
operations = get_deep_immutable_oplist(operations)
- cpu.compile_loop(inputargs, operations, jitcell_token, log=False)
+ cpu.compile_loop(0, -1, inputargs, operations, jitcell_token, log=False)
if memory_manager is not None: # for tests
memory_manager.keep_loop_alive(jitcell_token)
return jitcell_token
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1804,8 +1804,8 @@
self.history.record(rop.ENTER_PORTAL_FRAME,
[ConstInt(jd_no), ConstInt(unique_id)], None)
- def leave_portal_frame(self):
- self.history.record(rop.LEAVE_PORTAL_FRAME, [], None)
+ def leave_portal_frame(self, jd_no):
+ self.history.record(rop.LEAVE_PORTAL_FRAME, [ConstInt(jd_no)], None)
def popframe(self):
@@ -1813,7 +1813,7 @@
jitcode = frame.jitcode
if jitcode.jitdriver_sd:
self.portal_call_depth -= 1
- self.leave_portal_frame()
+ self.leave_portal_frame(jitcode.jitdriver_sd.index)
self.call_ids.pop()
if frame.greenkey is not None and self.is_main_jitcode(jitcode):
self.portal_trace_positions.append(
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -523,7 +523,7 @@
'COND_CALL_GC_WB_ARRAY/2d', # [objptr, arrayindex] (write barr. for array)
'DEBUG_MERGE_POINT/*', # debugging only
'ENTER_PORTAL_FRAME/2', # debugging only
- 'LEAVE_PORTAL_FRAME/0', # debugging only
+ 'LEAVE_PORTAL_FRAME/1', # debugging only
'JIT_DEBUG/*', # debugging only
'VIRTUAL_REF_FINISH/2', # removed before it's passed to the backend
'COPYSTRCONTENT/5', # src, dst, srcstart, dststart, length
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit