[pypy-svn] r36304 - in pypy/branch/jit-codegen-refactor/pypy/jit: codegen/llgraph timeshifter
arigo at codespeak.net
arigo at codespeak.net
Mon Jan 8 18:33:05 CET 2007
Author: arigo
Date: Mon Jan 8 18:33:00 2007
New Revision: 36304
Modified:
pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/llimpl.py
pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py
pypy/branch/jit-codegen-refactor/pypy/jit/timeshifter/rtimeshift.py
Log:
(mwh, arigo)
Updates to make the promotion tests work with the new changes.
Fix an old obscure**42 problem that was always there, but not
found because show_incremental_progress() didn't call checkgraph().
Modified: pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/llimpl.py
==============================================================================
--- pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/llimpl.py (original)
+++ pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/llimpl.py Mon Jan 8 18:33:00 2007
@@ -6,7 +6,7 @@
from pypy.rpython.lltypesystem import lltype, llmemory, rtupletype
from pypy.objspace.flow import model as flowmodel
-from pypy.translator.simplify import eliminate_empty_blocks, join_blocks
+from pypy.translator.simplify import eliminate_empty_blocks
from pypy.translator.unsimplify import varoftype
from pypy.rpython.module.support import init_opaque_object
from pypy.rpython.module.support import to_opaque_object, from_opaque_object
@@ -350,28 +350,28 @@
graph = _getgraph(gv_func)
_closelink(link, [returnvar], graph.prereturnblock)
-def closelinktofreshblock(link, inputargs=None):
+def closelinktofreshblock(link, inputargs=None, otherlink=None):
link = from_opaque_object(link)
- vars = link.prevblock.getvariables()
- if inputargs is not None:
- existing_vars = dict.fromkeys(vars)
- vars = _inputvars(inputargs)
- for v in vars:
- assert v in existing_vars
- nextblock = flowmodel.Block(list(vars))
- link.args = vars
- link.target = nextblock
- return to_opaque_object(nextblock)
-
-def closelinktofreshblockwithsameargsasotherlink(link, otherlink):
- link = from_opaque_object(link)
- otherlink = from_opaque_object(otherlink)
- existing_vars = dict.fromkeys(link.prevblock.getvariables())
- vars = list(otherlink.args)
- for v in vars:
+ prevblockvars = link.prevblock.getvariables()
+ # the next block's inputargs come from 'inputargs' if specified
+ if inputargs is None:
+ inputvars = prevblockvars
+ else:
+ inputvars = _inputvars(inputargs)
+ # the link's arguments are the same as the inputvars, except
+ # if otherlink is specified, in which case they are copied from otherlink
+ if otherlink is None:
+ linkvars = list(inputvars)
+ else:
+ otherlink = from_opaque_object(otherlink)
+ linkvars = list(otherlink.args)
+ # check linkvars for consistency
+ existing_vars = dict.fromkeys(prevblockvars)
+ for v in linkvars:
assert v in existing_vars
- nextblock = flowmodel.Block(list(vars))
- link.args = vars
+
+ nextblock = flowmodel.Block(inputvars)
+ link.args = linkvars
link.target = nextblock
return to_opaque_object(nextblock)
@@ -398,29 +398,29 @@
self.type_system = LowLevelTypeSystem.instance
def fixduplicatevars(graph):
- incomingvars = {} # {block: {var_from_link_args: True}}
- for link in graph.iterlinks():
- vars = incomingvars.setdefault(link.target, {})
- for v in link.args:
- if isinstance(v, flowmodel.Variable):
- vars[v] = True
- for block, vars in incomingvars.items():
- for v in block.inputargs:
- if v in vars:
- # this block needs renaming of all its input variables
- mapping = {}
- for a in block.inputargs:
- mapping[a] = a1 = flowmodel.Variable(a)
- a1.concretetype = a.concretetype
- block.renamevariables(mapping)
- break
+ # just rename all vars in all blocks
+ try:
+ done = graph._llimpl_blocks_already_renamed
+ except AttributeError:
+ done = graph._llimpl_blocks_already_renamed = {}
+
+ for block in graph.iterblocks():
+ if block not in done:
+ mapping = {}
+ for a in block.inputargs:
+ mapping[a] = a1 = flowmodel.Variable(a)
+ a1.concretetype = a.concretetype
+ block.renamevariables(mapping)
+ done[block] = True
def _buildgraph(graph):
# rgenop makes graphs that use the same variable in several blocks,
fixduplicatevars(graph) # fix this now
flowmodel.checkgraph(graph)
eliminate_empty_blocks(graph)
- join_blocks(graph)
+ # we cannot call join_blocks(graph) here! It has a subtle problem:
+ # it copies operations between blocks without renaming op.result.
+ # See test_promotion.test_many_promotions for a failure.
graph.rgenop = True
return graph
@@ -441,8 +441,10 @@
def show_incremental_progress(gv_func):
from pypy import conftest
+ graph = _getgraph(gv_func)
+ fixduplicatevars(graph)
+ flowmodel.checkgraph(graph)
if conftest.option.view:
- graph = _getgraph(gv_func)
eliminate_empty_blocks(graph)
graph.show()
@@ -532,7 +534,6 @@
setannotation(closelink, None)
setannotation(closereturnlink, None)
setannotation(closelinktofreshblock, s_Block)
-setannotation(closelinktofreshblockwithsameargsasotherlink, s_Block)
setannotation(isptrtype, annmodel.SomeBool())
Modified: pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py (original)
+++ pypy/branch/jit-codegen-refactor/pypy/jit/codegen/llgraph/rgenop.py Mon Jan 8 18:33:00 2007
@@ -47,22 +47,22 @@
class LLFlexSwitch(CodeGenSwitch):
- def __init__(self, b, g):
+ def __init__(self, b, g, args_gv):
self.b = b
self.gv_f = g
self.cases_gv = []
+ self.args_gv = args_gv
def add_case(self, gv_case):
self.cases_gv.append(gv_case) # not used so far, but keeps ptrs alive
l_case = llimpl.add_case(self.b, gv_case.v)
- b = llimpl.closelinktofreshblockwithsameargsasotherlink(l_case,
- self.l_default)
+ b = llimpl.closelinktofreshblock(l_case, self.args_gv, self.l_default)
return LLBuilder(self.gv_f, b)
- def _add_default(self, args_gv):
+ def _add_default(self):
l_default = llimpl.add_default(self.b)
self.l_default = l_default
- b = llimpl.closelinktofreshblock(l_default, args_gv)
+ b = llimpl.closelinktofreshblock(l_default, self.args_gv, None)
return LLBuilder(self.gv_f, b)
class LLBuilder(GenBuilder):
@@ -176,8 +176,8 @@
self._close()
def _jump(self, l_jump, l_no_jump, args_for_jump_gv):
- self.b = llimpl.closelinktofreshblock(l_no_jump, None)
- b2 = llimpl.closelinktofreshblock(l_jump, args_for_jump_gv)
+ self.b = llimpl.closelinktofreshblock(l_no_jump, None, None)
+ b2 = llimpl.closelinktofreshblock(l_jump, args_for_jump_gv, None)
later_builder = LLBuilder(self.gv_f, llimpl.nullblock)
later_builder.later_block = b2
later_builder.jumped_from = self
@@ -193,9 +193,9 @@
def flexswitch(self, gv_switchvar, args_gv):
llimpl.closeblockswitch(self.b, gv_switchvar.v)
- flexswitch = LLFlexSwitch(self.b, self.gv_f)
+ flexswitch = LLFlexSwitch(self.b, self.gv_f, args_gv)
self._close()
- return (flexswitch, flexswitch._add_default(args_gv))
+ return (flexswitch, flexswitch._add_default())
def _close(self):
self.b = llimpl.nullblock
@@ -210,7 +210,7 @@
def pause_writing(self, args_gv):
lnk = llimpl.closeblock1(self.b)
- b2 = llimpl.closelinktofreshblock(lnk, args_gv)
+ b2 = llimpl.closelinktofreshblock(lnk, args_gv, None)
self._close()
later_builder = LLBuilder(self.gv_f, llimpl.nullblock)
later_builder.later_block = b2
@@ -282,7 +282,7 @@
constPrebuiltGlobal = genconst
def replay(self, label, kinds):
- builder = LLBuilder(label.g)
+ builder = LLBuilder(label.g, llimpl.nullblock)
args_gv = builder._newblock(kinds)
return builder, args_gv
Modified: pypy/branch/jit-codegen-refactor/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-codegen-refactor/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/branch/jit-codegen-refactor/pypy/jit/timeshifter/rtimeshift.py Mon Jan 8 18:33:00 2007
@@ -628,14 +628,12 @@
jitstate.enter_block(incoming, memo)
switchblock = enter_next_block(jitstate, incoming)
gv_switchvar = promotebox.genvar
- flexswitch = builder.flexswitch(gv_switchvar)
-
+ incoming_gv = [box.genvar for box in incoming]
+ flexswitch, default_builder = builder.flexswitch(gv_switchvar,
+ incoming_gv)
if jitstate.resuming is None:
- incoming_gv = [box.genvar for box in incoming]
- default_builder = flexswitch.add_default()
jitstate.curbuilder = default_builder
# default case of the switch:
- enter_block(jitstate)
pm = PromotionPoint(flexswitch, incoming_gv,
jitstate.promotion_path)
#debug_print(lltype.Void, "PROMOTE")
@@ -683,8 +681,6 @@
newbuilder = flexswitch.add_case(promotenode.gv_value)
jitstate.curbuilder = newbuilder
-
- enter_block(jitstate)
return False
# ____________________________________________________________
More information about the Pypy-commit
mailing list