[pypy-commit] pypy guard-compatible: add debug prints to at least have a chance to figure out what is going on
cfbolz
pypy.commits at gmail.com
Tue Sep 20 07:54:04 EDT 2016
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: guard-compatible
Changeset: r87248:4f02e3d3f6f9
Date: 2016-08-23 15:03 +0100
http://bitbucket.org/pypy/pypy/changeset/4f02e3d3f6f9/
Log: add debug prints to at least have a chance to figure out what is
going on
diff --git a/rpython/jit/metainterp/compatible.py b/rpython/jit/metainterp/compatible.py
--- a/rpython/jit/metainterp/compatible.py
+++ b/rpython/jit/metainterp/compatible.py
@@ -2,6 +2,8 @@
from rpython.jit.metainterp.history import newconst
from rpython.jit.codewriter import longlong
from rpython.jit.metainterp.resoperation import rop
+from rpython.rlib.debug import (have_debug_prints, debug_start, debug_stop,
+ debug_print)
def do_call(cpu, argboxes, descr):
from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID
@@ -64,8 +66,11 @@
self.last_quasi_immut_field_op = op
def check_compat(self, cpu, ref):
- for cond in self.conditions:
- if not cond.check(cpu, ref):
+ for i, cond in enumerate(self.conditions):
+ res = cond.check_and_return_result_if_different(cpu, ref)
+ if res is not None:
+ if have_debug_prints():
+ debug_print("incompatible condition", i, ", got", cond._repr_const(res), ":", cond.repr())
return False
return True
@@ -168,7 +173,7 @@
if const is None:
return False
ref = const.getref_base()
- if cond.check(cpu, ref):
+ if cond.check_and_return_result_if_different(cpu, ref) is None:
if not have_guard:
# NB: the guard_compatible here needs to use const,
# otherwise the optimizer will just complain
@@ -254,7 +259,9 @@
self.debug_mp_str = s
self.rpyfunc = None
- def check(self, cpu, ref):
+ def check_and_return_result_if_different(self, cpu, ref):
+ """ checks the condition using ref as an argument to the function. if
+ the result is different, return the result. otherwise return None. """
raise NotImplementedError
def activate(self, ref, optimizer):
@@ -309,8 +316,7 @@
self.descr = op.getdescr()
self.rpyfunc = op.rpyfunc
- def check(self, cpu, ref):
- from rpython.rlib.debug import debug_print, debug_start, debug_stop
+ def check_and_return_result_if_different(self, cpu, ref):
calldescr = self.descr
# change exactly the first argument
arglist = self.args
@@ -318,15 +324,17 @@
try:
res = do_call(cpu, arglist, calldescr)
except Exception:
- debug_start("jit-guard-compatible")
- debug_print("call to elidable_compatible function raised")
- debug_stop("jit-guard-compatible")
+ if have_debug_prints():
+ debug_start("jit-guard-compatible")
+ debug_print("call to elidable_compatible function raised")
+ debug_print(self.repr())
+ debug_stop("jit-guard-compatible")
return False
finally:
arglist[1] = None
if not res.same_constant(self.res):
- return False
- return True
+ return res
+ return None
def same_cond(self, other, res=None):
if type(other) is not PureCallCondition:
@@ -433,7 +441,7 @@
self.mutatefielddescr)
qmut.register_loop_token(loop_token.loop_token_wref)
- def check(self, cpu, ref):
+ def check_and_return_result_if_different(self, cpu, ref):
from rpython.rlib.debug import debug_print, debug_start, debug_stop
from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr
calldescr = self.descr
@@ -444,15 +452,17 @@
try:
res = do_call(cpu, arglist, calldescr)
except Exception:
- debug_start("jit-guard-compatible")
- debug_print("call to elidable_compatible function raised")
- debug_stop("jit-guard-compatible")
+ if have_debug_prints():
+ debug_start("jit-guard-compatible")
+ debug_print("call to elidable_compatible function raised")
+ debug_print(self.repr())
+ debug_stop("jit-guard-compatible")
return False
finally:
arglist[1] = arglist[2] = None
if not res.same_constant(self.res):
- return False
- return True
+ return res
+ return None
def same_cond(self, other, res=None):
if type(other) is not QuasiimmutGetfieldAndPureCallCondition:
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
@@ -1,7 +1,7 @@
import weakref
from rpython.rtyper.lltypesystem import lltype, llmemory
from rpython.rtyper.annlowlevel import cast_instance_to_gcref
-from rpython.rlib.objectmodel import we_are_translated
+from rpython.rlib.objectmodel import we_are_translated, compute_unique_id
from rpython.rlib.debug import debug_start, debug_stop, debug_print, have_debug_prints
from rpython.rlib.rarithmetic import r_uint, intmask
from rpython.rlib import rstack
@@ -1110,18 +1110,31 @@
"""
# need to do the checking oldest to newest, to check the most specific
# condition first
- if self._compatibility_conditions:
- if self._compatibility_conditions.check_compat_and_activate(
- cpu, ref, self.rd_loop_token):
- return self._compatibility_conditions.jump_target
- for _compatibility_conditions in self.other_compat_conditions:
- if _compatibility_conditions.check_compat_and_activate(
- cpu, ref, self.rd_loop_token):
- return _compatibility_conditions.jump_target
- # none of the other conditions matched. if we have a
- # fallback_jump_target, go there (otherwise we run the risk of
- # producing arbitrary amounts of code)
- return self.fallback_jump_target
+ debug_start("jit-guard-compatible")
+ try:
+ if have_debug_prints():
+ debug_print("Guard0x%x check compatibility of" % (compute_unique_id(self), ), ref)
+ if self._compatibility_conditions:
+ if self._compatibility_conditions.check_compat_and_activate(
+ cpu, ref, self.rd_loop_token):
+ debug_print("first guard is compatible")
+ return self._compatibility_conditions.jump_target
+ for i, _compatibility_conditions in enumerate(self.other_compat_conditions):
+ if _compatibility_conditions.check_compat_and_activate(
+ cpu, ref, self.rd_loop_token):
+ debug_print("attached guard", i, "is compatible")
+ return _compatibility_conditions.jump_target
+ if have_debug_prints():
+ if self.fallback_jump_target:
+ debug_print("all incompatible, going to fallback")
+ else:
+ debug_print("all incompatible, failing")
+ # none of the other conditions matched. if we have a
+ # fallback_jump_target, go there (otherwise we run the risk of
+ # producing arbitrary amounts of code)
+ return self.fallback_jump_target
+ finally:
+ debug_stop("jit-guard-compatible")
def compile_and_attach(self, metainterp, new_loop, orig_inputargs):
# if new_loop starts with another guard_compatible on the same argument
More information about the pypy-commit
mailing list