[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