[pypy-svn] r23213 - pypy/dist/pypy/jit

pedronis at codespeak.net pedronis at codespeak.net
Fri Feb 10 19:18:08 CET 2006


Author: pedronis
Date: Fri Feb 10 19:18:07 2006
New Revision: 23213

Modified:
   pypy/dist/pypy/jit/hintrtyper.py
   pypy/dist/pypy/jit/rtimeshift.py
Log:
some preparatoy work and refactorings for optimistic constant propagation



Modified: pypy/dist/pypy/jit/hintrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/hintrtyper.py	(original)
+++ pypy/dist/pypy/jit/hintrtyper.py	Fri Feb 10 19:18:07 2006
@@ -24,6 +24,7 @@
     	RPythonTyper.__init__(self, hannotator, 
                               type_system=HintTypeSystem.instance)
         self.green_reprs = PRECOMPUTED_GREEN_REPRS.copy()
+        self.red_reprs = {}
         self.timeshifter = timeshifter
 
     def make_new_lloplist(self, block):
@@ -37,6 +38,14 @@
             self.green_reprs[lowleveltype] = r
             return r
 
+    def getredrepr(self, lowleveltype):
+        try:
+            return self.red_reprs[lowleveltype]
+        except KeyError:
+            r = RedRepr(lowleveltype)
+            self.red_reprs[lowleveltype] = r
+            return r
+
     def generic_translate_operation(self, hop):
         # detect all-green operations
         green = True
@@ -95,13 +104,13 @@
         if hs_c.is_fixed() or hs_c.eager_concrete:
             return hrtyper.getgreenrepr(hs_c.concretetype)
         else:
-            return red_repr
+            return hrtyper.getredrepr(hs_c.concretetype)
 
     def rtyper_makekey((ts, hs_c), hrtyper):
         if hs_c.is_fixed() or hs_c.eager_concrete:
             return hs_c.__class__, "green", hs_c.concretetype
         else:
-            return hs_c.__class__, "red"
+            return hs_c.__class__, "red", hs_c.concretetype
 
 class __extend__(pairtype(HintTypeSystem, annmodel.SomeImpossibleValue)):
 
@@ -114,24 +123,20 @@
 class RedRepr(Repr):
     lowleveltype = rtimeshift.REDBOX_PTR
 
+    def __init__(self, original_concretetype):
+        self.original_concretetype = original_concretetype
+
     def get_genop_var(self, v, llops):
+        c_TYPE = inputconst(lltype.Void, self.original_concretetype)
         return llops.gendirectcall(rtimeshift.ll_gvar_from_redbox,
-                                   llops.getjitstate(), v)
+                                   llops.getjitstate(), v, c_TYPE)
 
     def convert_const(self, ll_value):
-        assert lltype.typeOf(ll_value) == lltype.Signed # XXX other ll types!
-        # this should be immutable!
-        box = lltype.malloc(rtimeshift.SIGNED_REDBOX)
-        box.basebox.genvar = rgenop.genconst(ll_value)
-        box.value = ll_value
-        box = lltype.cast_pointer(rtimeshift.REDBOX_PTR,  box)
-        return box
+        return rtimeshift.REDBOX.make_from_const(ll_value)
 
     def residual_values(self, ll_value):
         return [ll_value]
 
-red_repr = RedRepr()
-
 class GreenRepr(Repr):
     def __init__(self, lowleveltype):
         self.lowleveltype = lowleveltype

Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/rtimeshift.py	Fri Feb 10 19:18:07 2006
@@ -5,21 +5,45 @@
 STATE = lltype.GcStruct("jitstate", ("curblock", rgenop.BLOCK))
 STATE_PTR = lltype.Ptr(STATE)
 
-REDBOX = lltype.GcStruct("redbox", ("genvar", rgenop.CONSTORVAR))
+
+def make_for_gvar(gvar):
+    box = lltype.malloc(REDBOX)
+    box.isvar = True
+    box.genvar = gvar
+    return box
+
+def make_from_const(value):
+    sbox = lltype.malloc(REDBOX_FOR_SIGNED) # XXX Float, Ptr
+    sbox.value = lltype.cast_primitive(lltype.Signed, value)
+    box = lltype.cast_pointer(REDBOX_PTR, sbox)
+    box.genvar = lltype.nullptr(REDBOX.genvar.TO)
+    return box
+
+def getvalue(box, T):
+    sbox = lltype.cast_pointer(REDBOX_FOR_SIGNED_PTR, box)
+    return lltype.cast_primitive(T, sbox.value)
+
+REDBOX = lltype.GcStruct("redbox", ("genvar", rgenop.CONSTORVAR),
+                                   ("isvar", lltype.Bool),
+                         adtmeths = {
+    'make_for_gvar': make_for_gvar,
+    'make_from_const': make_from_const,
+    'getvalue': getvalue,
+    })
+
 REDBOX_PTR = lltype.Ptr(REDBOX)
 
-SIGNED_REDBOX = lltype.GcStruct("signed_redbox", 
-                                ('basebox', REDBOX),
-                                ("value", lltype.Signed))
-SIGNED_REDBOX_PTR = lltype.Ptr(SIGNED_REDBOX)
+REDBOX_FOR_SIGNED = lltype.GcStruct("signed_redbox", 
+                                    ('basebox', REDBOX),
+                                    ("value", lltype.Signed))
+REDBOX_FOR_SIGNED_PTR = lltype.Ptr(REDBOX_FOR_SIGNED)
+
 
 
-def ll_gvar_from_redbox(jitstate, box):
+def ll_gvar_from_redbox(jitstate, box, TYPE):
     if not box.genvar:
-        # XXX other ll types!
-        # XXX support for polymorphism needs rethinking
-        sbox = lltype.cast_pointer(SIGNED_REDBOX_PTR, box)
-        box.genvar = ll_gvar_from_const(jitstate, sbox.value)
+        value = box.getvalue(TYPE)
+        box.genvar = ll_gvar_from_const(jitstate, value)
     return box.genvar
 
 def ll_gvar_from_const(jitstate, value):
@@ -27,9 +51,7 @@
 
 def ll_generate_operation(jitstate, opname, args, RESULTTYPE):
     gvar = rgenop.genop(jitstate.curblock, opname, args, RESULTTYPE)
-    box = lltype.malloc(REDBOX)
-    box.genvar = gvar
-    return box
+    return REDBOX.make_for_gvar(gvar)
 
 def ll_setup_jitstate():
     jitstate = lltype.malloc(STATE)
@@ -42,6 +64,5 @@
     return jitstate.curblock
 
 def ll_input_redbox(jitstate, TYPE):
-    box = lltype.malloc(REDBOX)
-    box.genvar = rgenop.geninputarg(jitstate.curblock, TYPE)
-    return box
+    genvar = rgenop.geninputarg(jitstate.curblock, TYPE)
+    return REDBOX.make_for_gvar(genvar)



More information about the Pypy-commit mailing list