[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