[pypy-svn] r41115 - pypy/dist/pypy/jit/timeshifter
arigo at codespeak.net
arigo at codespeak.net
Thu Mar 22 19:45:46 CET 2007
Author: arigo
Date: Thu Mar 22 19:45:44 2007
New Revision: 41115
Modified:
pypy/dist/pypy/jit/timeshifter/rtimeshift.py
pypy/dist/pypy/jit/timeshifter/rvalue.py
Log:
(pedronis, arigo)
Trying to be clever around splits: on each path, we know that the bool
variable used as condition is, respectively, True or False.
Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Thu Mar 22 19:45:44 2007
@@ -380,7 +380,7 @@
return exitgvar.revealconst(lltype.Bool)
else:
return split_nonconstantcase(jitstate, exitgvar, resumepoint,
- None, False, list(greens_gv))
+ switchredbox, False, list(greens_gv))
def split_ptr_nonzero(jitstate, switchredbox, resumepoint,
ptrbox, reverse, *greens_gv):
@@ -392,14 +392,13 @@
ptrbox, reverse, list(greens_gv))
def split_nonconstantcase(jitstate, exitgvar, resumepoint,
- ptrbox, reverse, greens_gv, ll_evalue=NULL_OBJECT):
+ condbox, reverse, greens_gv, ll_evalue=NULL_OBJECT):
resuming = jitstate.get_resuming()
if resuming is not None and resuming.mergesleft == 0:
node = resuming.path.pop()
assert isinstance(node, PromotionPathSplit)
- if ptrbox is not None:
- ok = ptrbox.learn_nonzeroness(jitstate,
- nonzeroness = node.answer ^ reverse)
+ if condbox is not None:
+ ok = condbox.learn_boolvalue(jitstate, node.answer ^ reverse)
assert ok
return node.answer
later_gv = jitstate.get_locals_gv() # alive gvs on the later path
@@ -409,15 +408,15 @@
later_builder = jitstate.curbuilder.jump_if_false(exitgvar, later_gv)
memo = rvalue.copy_memo()
jitstate2 = jitstate.split(later_builder, resumepoint, greens_gv, memo)
- if ptrbox is not None:
- ok = ptrbox.learn_nonzeroness(jitstate, nonzeroness = True ^ reverse)
+ if condbox is not None:
+ ok = condbox.learn_boolvalue(jitstate, True ^ reverse)
assert ok
try:
- copybox = memo.boxes[ptrbox]
+ copybox = memo.boxes[condbox]
except KeyError:
pass
else:
- ok = copybox.learn_nonzeroness(jitstate2, nonzeroness = reverse)
+ ok = copybox.learn_boolvalue(jitstate2, reverse)
assert ok
if ll_evalue:
jitstate2.residual_ll_exception(ll_evalue)
Modified: pypy/dist/pypy/jit/timeshifter/rvalue.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rvalue.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rvalue.py Thu Mar 22 19:45:44 2007
@@ -55,6 +55,9 @@
assert not self.is_constant()
self.genvar = newgenvar
+ def learn_boolvalue(self, jitstate, boolval):
+ return True
+
def enter_block(self, incoming, memo):
memo = memo.boxes
if not self.is_constant() and self not in memo:
@@ -129,6 +132,13 @@
class IntRedBox(RedBox):
"A red box that contains a constant integer-like value."
+ def learn_boolvalue(self, jitstate, boolval):
+ if self.is_constant():
+ return self.genvar.revealconst(lltype.Bool) == boolval
+ else:
+ self.setgenvar(ll_gv_fromvalue(jitstate, boolval))
+ return True
+
def copy(self, memo):
memo = memo.boxes
try:
@@ -208,6 +218,8 @@
self.setgenvar_hint(gv_null, known_nonzero=False)
return ok
+ learn_boolvalue = learn_nonzeroness
+
def __repr__(self):
if not self.genvar and self.content is not None:
return '<virtual %s>' % (self.content,)
More information about the Pypy-commit
mailing list