[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