Author: Justin Peel <notmuchtot...@gmail.com> Branch: rgc-mem-pressure Changeset: r48145:a2265c47e5dc Date: 2011-10-17 09:23 -0600 http://bitbucket.org/pypy/pypy/changeset/a2265c47e5dc/
Log: merge in default diff --git a/pypy/jit/metainterp/graphpage.py b/pypy/jit/metainterp/graphpage.py --- a/pypy/jit/metainterp/graphpage.py +++ b/pypy/jit/metainterp/graphpage.py @@ -12,8 +12,8 @@ def get_display_text(self): return None -def display_loops(loops, errmsg=None, highlight_loops=()): - graphs = [(loop, loop in highlight_loops) for loop in loops] +def display_loops(loops, errmsg=None, highlight_loops={}): + graphs = [(loop, highlight_loops.get(loop, 0)) for loop in loops] for graph, highlight in graphs: for op in graph.get_operations(): if is_interesting_guard(op): @@ -65,8 +65,7 @@ def add_graph(self, graph, highlight=False): graphindex = len(self.graphs) self.graphs.append(graph) - if highlight: - self.highlight_graphs[graph] = True + self.highlight_graphs[graph] = highlight for i, op in enumerate(graph.get_operations()): self.all_operations[op] = graphindex, i @@ -126,10 +125,13 @@ self.dotgen.emit('subgraph cluster%d {' % graphindex) label = graph.get_display_text() if label is not None: - if self.highlight_graphs.get(graph): - fillcolor = '#f084c2' + colorindex = self.highlight_graphs.get(graph, 0) + if colorindex == 1: + fillcolor = '#f084c2' # highlighted graph + elif colorindex == 2: + fillcolor = '#808080' # invalidated graph else: - fillcolor = '#84f0c2' + fillcolor = '#84f0c2' # normal color self.dotgen.emit_node(graphname, shape="octagon", label=label, fillcolor=fillcolor) self.pendingedges.append((graphname, diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py --- a/pypy/jit/metainterp/history.py +++ b/pypy/jit/metainterp/history.py @@ -732,6 +732,7 @@ failed_states = None retraced_count = 0 terminating = False # see TerminatingLoopToken in compile.py + invalidated = False outermost_jitdriver_sd = None # and more data specified by the backend when the loop is compiled number = -1 @@ -934,6 +935,7 @@ self.loops = [] self.locations = [] self.aborted_keys = [] + self.invalidated_token_numbers = set() def set_history(self, history): self.operations = history.operations @@ -1012,7 +1014,12 @@ if loop in loops: loops.remove(loop) loops.append(loop) - display_loops(loops, errmsg, extraloops) + highlight_loops = dict.fromkeys(extraloops, 1) + for loop in loops: + if hasattr(loop, '_looptoken_number') and ( + loop._looptoken_number in self.invalidated_token_numbers): + highlight_loops.setdefault(loop, 2) + display_loops(loops, errmsg, highlight_loops) # ---------------------------------------------------------------- diff --git a/pypy/jit/metainterp/memmgr.py b/pypy/jit/metainterp/memmgr.py --- a/pypy/jit/metainterp/memmgr.py +++ b/pypy/jit/metainterp/memmgr.py @@ -68,7 +68,8 @@ debug_print("Loop tokens before:", oldtotal) max_generation = self.current_generation - (self.max_age-1) for looptoken in self.alive_loops.keys(): - if 0 <= looptoken.generation < max_generation: + if (0 <= looptoken.generation < max_generation or + looptoken.invalidated): del self.alive_loops[looptoken] newtotal = len(self.alive_loops) debug_print("Loop tokens freed: ", oldtotal - newtotal) diff --git a/pypy/jit/metainterp/quasiimmut.py b/pypy/jit/metainterp/quasiimmut.py --- a/pypy/jit/metainterp/quasiimmut.py +++ b/pypy/jit/metainterp/quasiimmut.py @@ -2,6 +2,7 @@ from pypy.rpython.lltypesystem import lltype, rclass from pypy.rpython.annlowlevel import cast_base_ptr_to_instance from pypy.jit.metainterp.history import AbstractDescr +from pypy.rlib.objectmodel import we_are_translated def get_mutate_field_name(fieldname): @@ -50,13 +51,13 @@ class QuasiImmut(object): llopaque = True + compress_limit = 30 def __init__(self, cpu): self.cpu = cpu # list of weakrefs to the LoopTokens that must be invalidated if # this value ever changes self.looptokens_wrefs = [] - self.compress_limit = 30 def hide(self): qmut_ptr = self.cpu.ts.cast_instance_to_base_ref(self) @@ -73,8 +74,12 @@ self.looptokens_wrefs.append(wref_looptoken) def compress_looptokens_list(self): - self.looptokens_wrefs = [wref for wref in self.looptokens_wrefs - if wref() is not None] + newlist = [] + for wref in self.looptokens_wrefs: + looptoken = wref() + if looptoken is not None and not looptoken.invalidated: + newlist.append(wref) + self.looptokens_wrefs = newlist self.compress_limit = (len(self.looptokens_wrefs) + 15) * 2 def invalidate(self): @@ -85,8 +90,12 @@ self.looptokens_wrefs = [] for wref in wrefs: looptoken = wref() - if looptoken is not None: + if looptoken is not None and not looptoken.invalidated: + looptoken.invalidated = True self.cpu.invalidate_loop(looptoken) + if not we_are_translated(): + self.cpu.stats.invalidated_token_numbers.add( + looptoken.number) class QuasiImmutDescr(AbstractDescr): diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py --- a/pypy/jit/metainterp/resoperation.py +++ b/pypy/jit/metainterp/resoperation.py @@ -431,11 +431,11 @@ 'INT_IS_TRUE/1b', 'INT_NEG/1', 'INT_INVERT/1', + # + 'SAME_AS/1', # gets a Const or a Box, turns it into another Box 'CAST_PTR_TO_INT/1', 'CAST_INT_TO_PTR/1', # - 'SAME_AS/1', # gets a Const or a Box, turns it into another Box - # 'PTR_EQ/2b', 'PTR_NE/2b', 'CAST_OPAQUE_PTR/1b', diff --git a/pypy/jit/metainterp/test/test_memmgr.py b/pypy/jit/metainterp/test/test_memmgr.py --- a/pypy/jit/metainterp/test/test_memmgr.py +++ b/pypy/jit/metainterp/test/test_memmgr.py @@ -18,6 +18,7 @@ class FakeLoopToken: generation = 0 + invalidated = False class _TestMemoryManager: diff --git a/pypy/jit/metainterp/test/test_quasiimmut.py b/pypy/jit/metainterp/test/test_quasiimmut.py --- a/pypy/jit/metainterp/test/test_quasiimmut.py +++ b/pypy/jit/metainterp/test/test_quasiimmut.py @@ -48,6 +48,13 @@ class QuasiImmutTests(object): + def setup_method(self, meth): + self.prev_compress_limit = QuasiImmut.compress_limit + QuasiImmut.compress_limit = 1 + + def teardown_method(self, meth): + QuasiImmut.compress_limit = self.prev_compress_limit + def test_simple_1(self): myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total']) class Foo: @@ -289,7 +296,7 @@ return total res = self.meta_interp(main, []) - self.check_loop_count(9) + self.check_tree_loop_count(6) assert res == main() def test_change_during_running(self): @@ -317,7 +324,7 @@ assert f(100, 15) == 3009 res = self.meta_interp(f, [100, 15]) assert res == 3009 - self.check_loops(guard_not_invalidated=2, getfield_gc=0, + self.check_loops(guard_not_invalidated=4, getfield_gc=0, call_may_force=0, guard_not_forced=0) def test_list_simple_1(self): @@ -453,10 +460,30 @@ assert f(100, 15) == 3009 res = self.meta_interp(f, [100, 15]) assert res == 3009 - self.check_loops(guard_not_invalidated=2, getfield_gc=0, + self.check_loops(guard_not_invalidated=4, getfield_gc=0, getarrayitem_gc=0, getarrayitem_gc_pure=0, call_may_force=0, guard_not_forced=0) + def test_invalidated_loop_is_not_used_any_more_as_target(self): + myjitdriver = JitDriver(greens=['foo'], reds=['x']) + class Foo: + _immutable_fields_ = ['step?'] + @dont_look_inside + def residual(x, foo): + if x == 20: + foo.step = 1 + def f(x): + foo = Foo() + foo.step = 2 + while x > 0: + myjitdriver.jit_merge_point(foo=foo, x=x) + residual(x, foo) + x -= foo.step + return foo.step + res = self.meta_interp(f, [60]) + assert res == 1 + self.check_tree_loop_count(4) # at least not 2 like before + class TestLLtypeGreenFieldsTests(QuasiImmutTests, LLJitMixin): pass diff --git a/pypy/jit/metainterp/test/test_resume.py b/pypy/jit/metainterp/test/test_resume.py --- a/pypy/jit/metainterp/test/test_resume.py +++ b/pypy/jit/metainterp/test/test_resume.py @@ -1,3 +1,4 @@ +from __future__ import with_statement import py from pypy.rpython.lltypesystem import lltype, llmemory, rffi from pypy.jit.metainterp.optimizeopt.optimizer import OptValue diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py --- a/pypy/jit/metainterp/warmstate.py +++ b/pypy/jit/metainterp/warmstate.py @@ -178,7 +178,7 @@ if self.compiled_merge_points_wref is not None: for wref in self.compiled_merge_points_wref: looptoken = wref() - if looptoken is not None: + if looptoken is not None and not looptoken.invalidated: result.append(looptoken) return result diff --git a/pypy/module/__builtin__/__init__.py b/pypy/module/__builtin__/__init__.py --- a/pypy/module/__builtin__/__init__.py +++ b/pypy/module/__builtin__/__init__.py @@ -119,7 +119,7 @@ builtin = space.interpclass_w(w_builtin) if isinstance(builtin, module.Module): return builtin - # no builtin! make a default one. Given them None, at least. + # no builtin! make a default one. Give them None, at least. builtin = module.Module(space, None) space.setitem(builtin.w_dict, space.wrap('None'), space.w_None) return builtin diff --git a/pypy/module/__builtin__/compiling.py b/pypy/module/__builtin__/compiling.py --- a/pypy/module/__builtin__/compiling.py +++ b/pypy/module/__builtin__/compiling.py @@ -97,6 +97,9 @@ elif space.is_w(w_locals, space.w_None): w_locals = w_globals - space.builtin.pick_builtin(w_globals) + # xxx removed: adding '__builtins__' to the w_globals dict, if there + # is none. This logic was removed as costly (it requires to get at + # the gettopframe_nohidden()). I bet no test fails, and it's a really + # obscure case. return codeobj.exec_code(space, w_globals, w_locals) diff --git a/pypy/module/pypyjit/test_pypy_c/model.py b/pypy/module/pypyjit/test_pypy_c/model.py --- a/pypy/module/pypyjit/test_pypy_c/model.py +++ b/pypy/module/pypyjit/test_pypy_c/model.py @@ -387,8 +387,8 @@ return '' text = str(py.code.Source(src).deindent().indent()) lines = text.splitlines(True) - if opindex is not None and 0 <= opindex < len(lines): - lines[opindex] = lines[opindex].rstrip() + '\t<=====\n' + if opindex is not None and 0 <= opindex <= len(lines): + lines.insert(opindex, '\n\t===== HERE =====\n') return ''.join(lines) # expected_src = self.preprocess_expected_src(expected_src) diff --git a/pypy/module/pypyjit/test_pypy_c/test_string.py b/pypy/module/pypyjit/test_pypy_c/test_string.py --- a/pypy/module/pypyjit/test_pypy_c/test_string.py +++ b/pypy/module/pypyjit/test_pypy_c/test_string.py @@ -41,7 +41,7 @@ guard_true(i32, descr=...) i34 = int_add(i6, 1) --TICK-- - jump(p0, p1, p2, p3, p4, p5, i34, p7, p8, i9, i10, p11, i12, p13, descr=<Loop4>) + jump(p0, p1, p2, p3, p4, p5, i34, p7, p8, i9, i10, p11, i12, p13, descr=...) """) def test_long(self): @@ -106,7 +106,7 @@ i58 = int_add_ovf(i6, i57) guard_no_overflow(descr=...) --TICK-- - jump(p0, p1, p2, p3, p4, p5, i58, i7, descr=<Loop4>) + jump(p0, p1, p2, p3, p4, p5, i58, i7, descr=...) """) def test_str_mod(self): diff --git a/pypy/translator/platform/linux.py b/pypy/translator/platform/linux.py --- a/pypy/translator/platform/linux.py +++ b/pypy/translator/platform/linux.py @@ -1,5 +1,6 @@ """Support for Linux.""" +import sys from pypy.translator.platform.posix import BasePosix class BaseLinux(BasePosix): @@ -26,7 +27,11 @@ def library_dirs_for_libffi_a(self): # places where we need to look for libffi.a - return self.library_dirs_for_libffi() + ['/usr/lib'] + # XXX obscuuure! only look for libffi.a if run with translate.py + if 'translate' in sys.modules: + return self.library_dirs_for_libffi() + ['/usr/lib'] + else: + return [] class Linux(BaseLinux): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit